ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Unity 2D] Fly Bird 플레이어 이동 구현하기
    Unity 2D 2023. 3. 21. 00:16

    bird를 이동구현 하기 전에

    빈 오브젝트를 생성해서 Player 폴더를 하나 만들어준다.

     

    빈 오브젝트를 굳이 굳이 생성해서 Bird 를 관리하는 이유는

    그 밑에 생성되는 많은 자식 오브젝트를 관리하기 쉽게 하기 위해서이고,

    Collider 의 크기를 가지게 되면서 씬에서 생성되는 위치나 범위를 더 정확하게 체크할 수 있기 때문이다.

     

    하이라키 창에서 마우스 우클릭 → Create Empty 로 빈 오브젝트 생성

    이름을 Player로 바꾸고 Transform Reset 하기

    Player 에 Bird 를 자식 오브젝트로 두기

     

     

    이제 Bird 를 관리하는 Player 에 중력 컴포넌트를 넣어준다.

    (Bird 가 위,아래로 왔다 갔다 하며 장애물을 통과하는 게임을 구현하기 위해)

    Inspector 창 → Add Component → Rigidbody2D 클릭

     

    그리고 이왕 컴포넌트를 만지는 김에 콜라이더도 같이 넣어준다.

    나중에 어차피 필요하기 때문이다.

    Inspector 창 → Add Component → Circle Collider 2D 클릭

     

    콜라이더 속성 생성 후 Edit Collider 옆에 있는 아이콘 클릭

     

    콜라이더의 크기를 내가 지정할 수 있다.

    Bird 의 크기에 맞게 조정해준다.

    나중에 장애물에 부딪힐 때 무언가를 구현하기 위함이다.

     

     

    이제 이동 구현을 하기 위해 작성할 스크립트를 생성한다.

    Asset 폴더에서 마우스 우클릭 → Create → C# Script 클릭

    그리고 생성한 스크립트를 Player 폴더로 드래그해서 추가한다.

     

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Player : MonoBehaviour
    {
        Rigidbody2D rb;
        [SerializeField] float Speed = 5;
        
        void Start()
        {
        	// RigidBody2D 컴포넌트를 rb라는 변수를 통해 가져온다
            rb = GetComponent<Rigidbody2D>();
        }
    
        void Update()
        {
        	// 스페이스바 혹은 마우스 좌버튼을 눌렀을 때
            if(Input.GetKeyDown(KeyCode.Space) || Input.GetMouseButtonDown(0))
            {
                JumpBird();
            }
        }
    
        void JumpBird()
        {
        	// RigidBody2D의 Velocity는 Speed만큼 올라간다
            rb.velocity = Vector3.up * Speed;
        }
    }

    - [SerializedField] private 를 함께 선언해서 외부에선 접근할 수 없지만 인스펙터 창에서는 접근할 수 있도록 했다.

    - GetComponent 를 사용하여 Rigidbody2D 속성을 rb라는 변수에 초기화했다.

    - Input.GetKeyDown(KeyCode.Space) → 스페이스 바를 눌렀을 때

    - Input.GetMouseButtonDown(0) → 마우스 버튼 왼쪽을 눌렀을 때

    - Vector3.up → 2D 기준에서 오브젝트가 위로 향한다.

     

     

    이 코드를 조금 더 보기 쉽게 풀어보겠다.

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Player : MonoBehaviour
    {
        Rigidbody2D rb;
        [SerializeField] float Speed = 5;
        private bool keyJump = false;
        
        void Start()
        {
        	// RigidBody2D 컴포넌트를 rb라는 변수를 통해 가져온다
            rb = GetComponent<Rigidbody2D>();
        }
    
        void Update()
        {
        	// Jump를 입력받는 메서드를 따로 생성했다.
        	InputBird();
        }
        
        private void FixedUpdate()
        {
        	// 입력받은 Jump값이 true라면
        	if(keyJump == true)
            {	
            	// JumpBird메서드 받기
            	JumpBird();
                // 그리고 다시 keyJump값은 false로 만들어준다.
                keyJump = false;
            }
        }
    
        void JumpBird()
        {
        	// RigidBody2D의 Velocity는 Speed만큼 올라간다
            rb.velocity = Vector3.up * Speed;
        }
        
        void InputBird()
        {
        	// 스페이스바 혹은 마우스 좌버튼을 눌렀을 때
            if(Input.GetKeyDown(KeyCode.Space) || Input.GetMouseButtonDown(0))
            {
            	// Jump값을 true로 입력받는다.
                keyJump = true;
            }
        }
    }

    InputBird 메서드를 조금 더 단조롭게 해보자.

    void InputBird()
        {
        	// 스페이스바 혹은 마우스 좌버튼을 눌렀을 때
            keyJump |= Input.GetKeyDown(KeyCode.Space);
            keyJump |= Input.GetMouseButtonDown(0);
        }

    여기서 |= 의 의미를 알아보자.

    a |= b

    a = a | b

    결국 GetKeyDown 혹은 GetMouseDown 둘 중 하나라도 만족한다면

    그 값이 KeyJump 가 된다는 것을 의미한다.


    전체 코드 보기

    더보기

     

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Player : MonoBehaviour
    {
        Rigidbody2D rb;
        [SerializeField] float Speed = 5;
        private bool keyJump = false;
        
        void Start()
        {
        	// RigidBody2D 컴포넌트를 rb라는 변수를 통해 가져온다
            rb = GetComponent<Rigidbody2D>();
        }
    
        void Update()
        {
        	// Jump를 입력받는 메서드를 따로 생성했다.
        	InputBird();
        }
        
        private void FixedUpdate()
        {
        	// 입력받은 Jump값이 true라면
        	if(keyJump == true)
            {	
            	// JumpBird메서드 받기
            	JumpBird();
                // 그리고 다시 keyJump값은 false로 만들어준다.
                keyJump = false;
            }
        }
    
        void JumpBird()
        {
        	// RigidBody2D의 Velocity는 Speed만큼 올라간다
            rb.velocity = Vector3.up * Speed;
        }
        
        void InputBird()
        {
        	// 스페이스바 혹은 마우스 좌버튼을 눌렀을 때
            keyJump |= Input.GetKeyDown(KeyCode.Space);
            keyJump |= Input.GetMouseButtonDown(0);
        }
    }
Designed by Tistory.