# 정상 속도 만들기
지난 코드에서 CPU 성능에 따라 Update문을 도는 횟수가 다르기에
각자 다른 속도로 움직이는 문제가 있었다
이를 해결하기 위해서는 Time.deltaTime을 사용하면 된다
public class PlayerContorller : MonoBehaviour
{
public float speed = 10.0f;
void Start()
{
}
void Update()
{
if (Input.GetKey(KeyCode.W)
transform.position += new Vector3(0.0f, 0.0f, 1.0f) * Time.deltaTime * speed;
if (Input.GetKey(KeyCode.S)
transform.position -= new Vector3(0.0f, 0.0f, 1.0f) * Time.deltaTime * speed;
if (Input.GetKey(KeyCode.A)
transform.position -= new Vector3(1.0f, 0.0f, 0.0f) * Time.deltaTime * speed;
if (Input.GetKey(KeyCode.D)
transform.position += new Vector3(1.0f, 0.0f, 0.0f) * Time.deltaTime * speed;
}
}
# [SerializeField]
멤버변수를
public으로 하면, 엔진에서 수정이 가능하다
private으로 하면, 엔진에서 수정이 불가능하다
그러나 private이더라도 수정을 가능하게 하려면
[SerializeField]를 활용하면 된다
public class PlayerContorller : MonoBehaviour
{
public float a = 10.0f; // 엔진에서 수정 가능
private float b = 10.0f; // 엔진에서 수정 불가능
[SerializeField]
private float c = 10.0f; // 엔진에서 수정 가능
}
# Vector.forward/back/left/right 기능
Vector3을 수동으로 입력하지 않고
Vector.forward/back/left/right 를 통해 쉽게 코드를 작성할 수 있다
if (Input.GetKey(KeyCode.W)
transform.position += Vector3.forward * Time.deltaTime * speed;
if (Input.GetKey(KeyCode.S)
transform.position += Vector3.back * Time.deltaTime * speed;
if (Input.GetKey(KeyCode.A)
transform.position += Vector3.left * Time.deltaTime * speed;
if (Input.GetKey(KeyCode.D)
transform.position += Vector3.right * Time.deltaTime * speed;
# '⋮' 기능
유니티 엔진에서 컴포넌트의 속성들을 수정하고 싶은 경우에
'⋮' 버튼을 통해 쉽게 수정이 가능하다
예를 들어서 transform (position, rotation, scale)의 '⋮' 에서
reset과 같은 다양한 설정이 가능하다
# 지금까지 움직임 코드의 문제점
transform.position += Vector3.forward * Time.deltaTime * speed;
플레이어가 yaw 회전을 한다 하더라도 움직이는 방향은 동일한 문제가 있다
그 이유는 기존 코드는 월드 좌표계를 기준으로 한 코드이기 때문이다
# 월드 좌표계와 로컬 좌표계
유니티 엔진에서 Scene창에서 가장 우측 상단에 보여지는 좌표계는
월드 좌표계이다
원하는 객체를 선택한 상태에서 x를 누르면 로컬 좌표계를 확인할 수 있다
# 로컬 좌표계를 이용한 이동 적용하기
방법 1. TransformDirection 활용
월드 -> 로컬: TransformDirection
로컬 -> 월드: InverseTransformDirection
if (Input.GetKey(KeyCode.W)
transform.position += transform.TransformDirection(Vector3.forward * Time.deltaTime * speed);
if (Input.GetKey(KeyCode.S)
transform.position += transform.TransformDirection(Vector3.back * Time.deltaTime * speed);
if (Input.GetKey(KeyCode.A)
transform.position += transform.TransformDirection(Vector3.left * Time.deltaTime * speed);
if (Input.GetKey(KeyCode.D)
transform.position += transform.TransformDirection(Vector3.right * Time.deltaTime * speed);
방법 2. Translate 활용
굳이 연산을 해주지 않아도 로컬로 알아서 계산을 해준다
if (Input.GetKey(KeyCode.W)
transform.Translate(Vector3.forward * Time.deltaTime * speed);
if (Input.GetKey(KeyCode.S)
transform.Translate(Vector3.back * Time.deltaTime * speed);
if (Input.GetKey(KeyCode.A)
transform.Translate(Vector3.left * Time.deltaTime * speed);
if (Input.GetKey(KeyCode.D)
transform.Translate(Vector3.right * Time.deltaTime * speed);
'게임 엔진 - 유니티 > [루키스] 유니티' 카테고리의 다른 글
[유니티 Note] 섹션 3-4 (0) | 2025.06.25 |
---|---|
[유니티 Note] 섹션 3-3 (0) | 2025.06.25 |
[유니티 Note] 섹션 3-1 (0) | 2025.06.24 |
[유니티 Note] 섹션 2-3 (0) | 2025.06.23 |
[유니티 Note] 섹션 2-2 (0) | 2025.06.23 |