본문 바로가기
Unity

[Unity] 플레이어 이동방법

by 심다린 2024. 9. 9.

 

게임을 개발하기 위해서는 플레이어가 필요하고, 플레이어의 움직임을 제어할 수 있도록 구현하는 것이 필요하다.

 

마우스 클릭 시 캐릭터 커서 위치로 이동

void Update()
{
    if (Input.GetMouseButton(0))    //0이면 마우스 왼쪽 , 1이면 마우스 오른쪽 버튼
    {
        Vector2 pos = Camera.main.ScreenToWorldPoint(Input.mousePosition);

        gameObject.transform.position = pos;
    }
}

게임 오브젝트의 위치를 마우스가 클릭하는 곳으로 이동시키는 코드이다.

마우스 커서로 플레이어 움직임 구현

 

 

키보드로 캐릭터 오른쪽 왼쪽 움직이기

  1. Translate함수이용 → 움직임 할당 (직접 포지션 옮기기)
public class PlayerManager : MonoBehaviour
{
	float playerSpeed = 3.0f;

// Start is called before the first frame update
void Start()
{

}

// Update is called once per frame
void Update()
{

    if (Input.GetKeyDown(KeyCode.RightArrow))
    {
        transform.Translate(new Vector3(playerSpeed, 0, 0));
    }
    if (Input.GetKeyDown(KeyCode.LeftArrow))
    {
        transform.Translate(new Vector3(-playerSpeed, 0, 0));
    }
}
}

 

GetKeyDown을 이용하여 움직임을 구현해보았다. 다음 영상과 같이 캐릭터가 움직이게 되는데,

 

GetKeyDown으로 키보드 입력을 통해 플레이어 움직임 구현

조금 어색한 부분이 있다. 연속적으로 보여지지 않고 순간 이동하듯 보여진다.

이는 GetKeyDown이 누를 때마다 3씩 받아 움직이기 때문이다.  

 

 

 

이 문제를 해결하기 위해 코드를 수정해보자

GetkeyDown → GetKey 로 바꾸기

public class PlayerManager : MonoBehaviour
{
	float playerSpeed = 3.0f;

// Start is called before the first frame update
void Start()
{

}

// Update is called once per frame
void Update()
{

    if (Input.GetKey(KeyCode.RightArrow))
    {
        transform.Translate(new Vector3(playerSpeed, 0, 0));
        Debug.Log("RightArrow");
    }
    if (Input.GetKey(KeyCode.LeftArrow))
    {
        transform.Translate(new Vector3(-playerSpeed, 0, 0));
        Debug.Log("LeftArrow");
    }
}
}

GetKey 로 바꾸면 순간이동이 아닌 연속적으로 움직이는 것처럼 보인다.

그러나 너무 빨라서 키보드를 살짝만 눌러도 200번 넘게 눌려지게 된다. ( 디버그 확인)

GetKey를 이용해 플레이어 움직임 구현

 

이것을 제어하기 위해 설정한 플레이어 스피드에 Time.deltaTime을 곱해주면 된다.

    if (Input.GetKey(KeyCode.RightArrow))
    {
        transform.Translate(new Vector3(playerSpeed*Time.deltaTime, 0, 0));
        Debug.Log("RightArrow");
    }
    if (Input.GetKey(KeyCode.LeftArrow))
    {
        transform.Translate(new Vector3(-playerSpeed*Time.deltaTime, 0, 0));
        Debug.Log("LeftArrow");
    }

 

 

deltaTime을 적용한 후의 모습이다.

추가로 플레이어가 왼쪽, 오른쪽으로 갈 때 플레이어가 회전할 수 있도록 구현해보자.

public class PlayerController : MonoBehaviour
{
	float Speed = 5.0f;
void Start()
{

}

// Update is called once per frame
void Update()
{
    if (Input.GetKey(KeyCode.RightArrow))
    {
        transform.Translate(new Vector3 (Speed*Time.deltaTime, 0, 0));
        transform.localEulerAngles = new Vector3(0,0,0);
    }

    if (Input.GetKey(KeyCode.LeftArrow))
    {
        transform.Translate(new Vector3(Speed * Time.deltaTime, 0, 0));
        transform.localEulerAngles = new Vector3(0,180,0);
    }

    if (Input.GetKey(KeyCode.UpArrow))
    {
        transform.Translate(new Vector3(0, Speed * Time.deltaTime, 0));
    }
    if (Input.GetKey(KeyCode.DownArrow))
    {
        transform.Translate(new Vector3(0, -Speed * Time.deltaTime, 0));
    }

}
}

 

localEulerAngles는 회전량을 Degree로 접근하는 프로퍼티이다. (get , set)

 

 

플레이어의 방향까지 추가한 모습

 


 

 

2. AddForce : 물리적인 힘으로 캐릭터의 움직임을 구현한다.

  • rigidbody 컴포넌트 추가하기
public class PlayerManager : MonoBehaviour
{
float playerSpeed = 3.0f;
Rigidbody2D rid2D;

// Start is called before the first frame update
void Start()
{
    rid2D = GetComponent<Rigidbody2D>();
}

// Update is called once per frame
void Update()
{

    if (Input.GetKey(KeyCode.RightArrow))
    {
        rid2D.AddForce(new Vector2(playerSpeed, 0), ForceMode2D.Force);
		
		if (Input.GetKey(KeyCode.LeftArrow))
		{
			rid2D.AddForce(new Vector2(-playerSpeed, 0), ForceMode2D.Force);
			}
}
}

 

AddForce를 이용한 플레이어 움직임 구현

이 부분은 RigidBody 할 때 더 자세히 알아보자