Position(이동)

·2023년 4월 8일
0

Unity

목록 보기
5/22

📌Position


void Update()
    {
        if (Input.GetKey(KeyCode.W))
            transform.position += new Vector3(0.0f, 0.0f, 1.0f);
        if (Input.GetKey(KeyCode.S))
            transform.position -= new Vector3(0.0f, 0.0f, 1.0f);
        if (Input.GetKey(KeyCode.A))
            transform.position -= new Vector3(1.0f, 0.0f, 0.0f);
        if (Input.GetKey(KeyCode.D))
            transform.position += new Vector3(1.0f, 0.0f, 0.0f);
    }

플레이어가 비정상적으로 빠르게 움직인다
현재 60프레임이라고 가정 한다면 1/60마다 update되서 움직이기 때문이다.

시간(DeltaTime)

마지막 프레임과 현재 프레임의 시간간격

new Vector3(0.0f, 0.0f, 1.0f) * Time.deltaTime;

속력

//_speed는 현재 10.0f
new Vector3(1.0f, 0.0f, 0.0f) * Time.deltaTime * _speed;

거리 = 속도 * 시간 = 속력 * 방향 * 시간
속도 = 속력 + 방향
속력 = 방향을 가지지않는 스칼라값
스칼라 = 크기만 있는값

속력 : speed
방향 : Vector3
시간 : deltaTime


📌SerializeField


public 사용

public으로 설정하면 Unity Inspector창에서 설정가능

public float _speed = 10.0f;
public GameObject _obj;

SerializeField 사용

[SerializeField]
float _speed = 10.0f;

private 상태에서 public과 동일하게 Unity Inspector창에서 설정가능하다.


📌글로벌좌표, 로컬좌표


글로벌좌표 : 절대좌표
로컬좌표 : 플레이어(물체)를 기준으로 한다

x누르면 Global local 좌표변경

글로벌좌표

//동일하다
new Vector3(0.0f, 0.0f, 1.0f)
Vector3.forward

원래코드

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;
    }

코드수정

void Update()
    {
        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;
    }

로컬좌표(캐릭터방향이동)

TransformDirection

로컬에서 월드로 바꿔준다

 void Update()
    {
        // Local -> World
        // TransformDirection

        //World -> Local
        //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);
    }

Translate

로컬좌표 기준으로 편하게 하기

void Update()
    {
        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);
    }

참고자료


Part3: 유니티 엔진
섹션 2.Transform(트랜스폼)

profile
개인공부저장용(하루의 기록)

0개의 댓글