박민혁의 개발

유니티 왜 내 캐릭터는 벽에 비벼질까? 이동 본문

TIL

유니티 왜 내 캐릭터는 벽에 비벼질까? 이동

박민혁_kog 2023. 10. 26. 20:47

유니티 좌표계

프로그램마다 사용하는 좌표계가 다릅니다. 따라서 좌표계에 대해서 이해하는 것은 매우 중요합니다.
유니티에서는 위치를 표현할 때 왼손 좌표계를 이용합니다. X축은 빨간색, Y축은 초록색, Z축은 파란색(RGB순서)으로 표현합니다.

Transform.position

Transform.position은 게임오브젝트의 절대좌표를 나타냅니다. Transform.position에 Vector3를 대입하면 해당 위치로 이동합니다. 다음은 Transform.position의 예제 코드입니다.

transform.position = new Vector3(x, y, z);

Transform.localPosition

Transform.localPosition은 게임오브젝트의 상대좌표를 나타냅니다. 게임오브젝트의 부모가 있을 경우 부모로부터 떨어진 좌표를 나타냅니다. 부모가 없을 경우에는 Transform.position과 동일합니다.

Transform.localPosition에 Vector3를 대입하면 해당 위치로 이동합니다. 다음은 Transform.localPositon의 예제 코드입니다.

transform.localPosition = new Vector3(x, y, z);

Transform.Translate

Transform.Translate는 게임오브젝트를 이동시키기 위한 함수입니다. 현재 게임오브젝트의 위치를 기준으로 상대적인 Vector3의 방향으로 이동합니다. 이동할 Vector3를 인자로 넘겨주면 됩니다. 절대좌표 기준으로 움직일 경우에는 Space.World 옵션을 사용하면 됩니다.

유니티에서는 주로 Translate 함수를 사용합니다. 다음은 Transform.Translate의 예제 코드입니다.

public class Translate : MonoBehaviour 
{
    void Update () 
    {
        // 게임 오브젝트 기준으로 이동
        transform.Translate(Vector3.right * Time.deltaTime);

        // 절대 좌표 기준으로 이동
        transform.Translate(Vector3.forward * Time.deltaTime, Space.World);
    }    
}

Vector3에 Time.deltaTime을 곱하는 이유는 초당 호출되는 프레임이 디바이스마다 다르기 때문에 시간에 따라 동일한 거리를 움직이게 하기 위함입니다.

 

내가 내린 결론 (정확하진 않으나 내가 결론지은것 틀릴수 있음 )

transform.translate = 벽에 비비면 몸이 떨림 = 그좌표로 이동할려고하는데 벽이 이미 있기때문에 다시 밀림
리지드바디 벨로시티 값 조절 = 속력이바뀜 = 거기로 갈려고 잇는데 막혀 있어서 더 못감!

 

인데 한가지 문제가 있다 x y 로 확실히 이동하는건 괜찮지만 내가 3d고 화면을 기준으로 움직이려 할때 문제가 발생했다 아래와 같다 

 

private void MoveKey(Vector2 direction)
    {
        if (!_canMove)
            return;

        Vector2 moveInput = direction;
        // 이동 방향키 입력 판정 : 이동 방향 벡터가 0보다 크면 입력이 발생하고 있는 중
        bool isMove = moveInput.magnitude != 0;
        // 입력이 발생하는 중이라면 이동 애니메이션 재생
        animator.SetBool("IsMove", isMove);
        if (isMove)
        {
            // 카메라가 바라보는 방향
            Vector3 lookForward = new Vector3(cameraArm.forward.x, 0f, cameraArm.forward.z).normalized;
            // 카메라의 오른쪽 방향
            Vector3 lookRight = new Vector3(cameraArm.right.x, 0f, cameraArm.right.z).normalized;
            // 이동 방향
            Vector3 moveDir = lookForward * moveInput.y + lookRight * moveInput.x;
            // 이동할 때 이동 방향 바라보기
            characterBody.forward = moveDir;
            // 이동
            transform.position +=  moveDir * Time.deltaTime * speed;
        }
    }

맨아래 이동 부분이 포지션 값을 바꾸는데 마찬가지로 그좌표로감 인것 이경우도 리지드 바디로 줄수가 있을지 모르겠다

 

ps 벨로시티로 이동 하는게 만능은 아니라고 한다 리지드바디 값에 영향을 주기에 좀더 무겁다? 라는 말이였던거 같은데 정확히는 모른다

'TIL' 카테고리의 다른 글

중복 없는 랜덤 뽑기  (1) 2023.10.30
csv 파일 불러오기  (0) 2023.10.27
Json 파일 vs CSV 파일  (0) 2023.10.25
책 한권만 읽은 사람의 포톤 2일차  (0) 2023.10.25
책 한권만 읽은 사람의 포톤 1일차  (0) 2023.10.24