저번에는 간단한 키보드 조작을 통해 물체를 이동시키는것을 알아보았습니다.
이번엔 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 |