게임을 개발하기 위해서는 플레이어가 필요하고, 플레이어의 움직임을 제어할 수 있도록 구현하는 것이 필요하다.
마우스 클릭 시 캐릭터 커서 위치로 이동
void Update()
{
if (Input.GetMouseButton(0)) //0이면 마우스 왼쪽 , 1이면 마우스 오른쪽 버튼
{
Vector2 pos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
gameObject.transform.position = pos;
}
}
게임 오브젝트의 위치를 마우스가 클릭하는 곳으로 이동시키는 코드이다.
키보드로 캐릭터 오른쪽 왼쪽 움직이기
- 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이 누를 때마다 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번 넘게 눌려지게 된다. ( 디버그 확인)

이것을 제어하기 위해 설정한 플레이어 스피드에 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");
}
추가로 플레이어가 왼쪽, 오른쪽으로 갈 때 플레이어가 회전할 수 있도록 구현해보자.
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);
}
}
}
이 부분은 RigidBody 할 때 더 자세히 알아보자
'Unity' 카테고리의 다른 글
| [Unity] 플레이어 점프 구현하기 Addforce / Velocity 차이 (1) | 2024.09.19 |
|---|---|
| [Unity] Colider에 대해 알아보자 (0) | 2024.09.12 |
| [Unity] New Input System 사용하기 (0) | 2024.09.11 |
| [Unity] 스프라이트 자르기 (0) | 2024.09.09 |
| [Unity] Time과 deltatime에 대하여 (0) | 2024.09.09 |