본문 바로가기
게임 엔진 - 유니티/[루키스] 유니티

[유니티 Note] 섹션 3-2

by 묻공러 2025. 6. 24.

# 정상 속도 만들기

지난 코드에서 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