Unity

#2 유니티(Unity) - Transform

kminnnee 2022. 11. 1. 22:19

저번에는 간단한 키보드 조작을 통해 물체를 이동시키는것을 알아보았습니다.
이번엔 Transform 를 이용해 원하는 곳으로 물체를 바라보게 한 후 그대로 이동하는 것을 해보도록 하겠습니다.

void Update()
    {
        Vector3 dir = Vector3.zero;     // 0벡터 생성 
        if (Input.GetKey(KeyCode.UpArrow))
        {
            transform.Translate(transform.forward * 2.0f * Time.deltaTime);
            dir += transform.forward;  
        }
        if (Input.GetKey(KeyCode.DownArrow))
        {
            transform.Translate(transform.forward * -2.0f * Time.deltaTime);
            dir += -transform.forward;
        }
        if (Input.GetKey(KeyCode.RightArrow))
        {
            transform.Translate(transform.right * 2.0f * Time.deltaTime);
            dir += transform.right;
        }
        if (Input.GetKey(KeyCode.LeftArrow))
        {
            transform.Translate(transform.right * -2.0f * Time.deltaTime);
            dir += -transform.right;
        }
        dir = dir.normalized;      // 정규화 하기 
        if (dir.magnitude > 0.5f)   // 하나의 키라도 눌릴시 
        { 
            transform.LookAt(transform.position + dir);
        }
    }

먼저 코드 설명부터 하자면 LookAt 함수를 통해 이동 방향을 바라보도록 하였습니다.
0벡터로 선언한 객체를 하나 만들어주고 똑같이 구현해 줍니다.
여기서 몇가지 추가된 곳은
-
dir += transform.forward;
-
부분인데 이 부분은 , 벡터 x 와 z 의 방향이 동시에 눌렸을 시 벡터들의 합을 누적시킵니다 .
그렇게 해서 두 방향키가 동시에 눌릴때 대각선으로도 이동시킬 수 있게 한 부분입니다.
밑에 normalized 를 통해 정규화를 시켜주는데 그 이유는 주어진 벡터를 1로 만들어주면 벡터는 '방향' 만 가지게 됩니다.
-
하지만 이 코드에는 문제점이 있습니다 .
그 문제를 이해하려면 먼저 유니티의 transform.forward 에 대해 이해하여야 하는데 쓰면서도 아직 헷갈리네요 ㅋㅋㅋㅋ..
transform.forward월드 공간을 기준으로 한 게임 오브젝의 앞 방향 벡터인데
만약! 게임오브젝트의 z축이 왼쪽을 가르키고 있는 상황이고 ,
월드공간에서 오른쪽이 현재 앞방향(z축) 이라고 해 봅시다...!
( 밑에 사진처럼 )
그럼 transform.forward 는 현재 z축이지만 월드공간에서는 -z축이죠? (위에랑 같은말이긴 한데..)
즉 (0, 0 ,-1 ) 이므로 Translate(transform.forward)를 하게 되면
물체는 내가 원하는 z 축 방향으로 이동하는 것이 아니라
게임오브젝트관점에서 -z축으로 이동하게 됩니다.
그러니까 내가 원하는것처럼 구현이 안되겠죠?
( 바라보는 방향으로 , 즉 내가 오른쪽을 보면 오른쪽이 앞이 되어서 이동하는 방식 ! )

그럼 해결은 ?
이동한 방향으로 그대로 이동하면 ! 즉

void Update()    {
        Vector3 dir = Vector3.zero;
        if (Input.GetKey(KeyCode.UpArrow))
        {
            transform.Translate(Vector3.forward * 2.0f * Time.deltaTime);
            dir += Vector3.forward;
        }
        if (Input.GetKey(KeyCode.DownArrow))
        {
            transform.Translate(Vector3.forward * 2.0f * Time.deltaTime);
            dir += Vector3.back;
        }
        if (Input.GetKey(KeyCode.RightArrow))
        {
            transform.Translate(Vector3.forward * 2.0f * Time.deltaTime);
            dir += Vector3.right;
        }
        if (Input.GetKey(KeyCode.LeftArrow))
        {
            transform.Translate(Vector3.forward * 2.0f * Time.deltaTime);
            dir += Vector3.left;
        }
        dir = dir.normalized;
        if (dir.magnitude > 0.5f)
        {
            transform.LookAt(transform.position + dir);
        }
    }

Vector3.forward 을 사용해 월드공간을 기준으로 물체를 움직이게 하였습니다.
그러면 물체는 바라본 방향이 어느쪽이든 Vector3.forward ,
즉 물체의 z축의 방향인 그방향 그대로 움직이게 됩니다.
.
.

'Unity' 카테고리의 다른 글

Unity - 1 vs 1 축구게임 ( 애니메이션 추가 )  (0) 2023.07.27
Unity - 1 vs 1 축구게임  (0) 2023.05.18
유니티를 이용한 미니 프로젝트  (0) 2022.12.15
#1 유니티(Unity)  (0) 2022.11.01