TIL (75) | 2023.11.10 | 유니티 이동

kjg5370·2023년 11월 10일
0

TIL

목록 보기
73/91
post-thumbnail

들어가기 앞서

오늘 플레이어가 트랜스폼을 바꾸는 포탈에 충돌이 되어도
이동이 안되는것을 고치는 작업을 하였는데 캐릭터 컨트롤러의
문제인것 같아서 이것에 대해 알아보려고 합니다.

오늘 배운 것

  • Unity에서 게임 오브젝트를 이동시키는 방법
    이동은 주로 Transform 컴포넌트를 통해 수행

    • Transform.Translate 메서드 사용
      Translate 메서드는 현재 좌표 기준으로 이동하는 데 사용

      void Update()
      {
          float moveSpeed = 5f;
      
          // Translate 메서드를 사용하여 이동
          transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);
      }

      특징
      상대적인 이동: Translate 메서드는 현재 위치를 기준으로 상대적인 이동을 수행

      즉시 이동: 변화가 즉시 발생하며, 물리 시뮬레이션이나 충돌 검사 없이 이동

      간단한 이동: 단순한 상대적 이동에 적합하며, 특히 주기적인 이동이나 애니메이션에 유용함

    • 이동 벡터 직접 변경
      직접 Transform.position을 변경하여 이동

      void Update()
      {
          float moveSpeed = 5f;
      
          // Transform.position 직접 변경
          transform.position += Vector3.forward * moveSpeed * Time.deltaTime;
      }

      특징
      절대적인 이동: Transform.position을 직접 변경하여 절대적인 이동을 수행

      즉시 이동: 변화가 즉시 발생하며, 물리 시뮬레이션이나 충돌 검사 없이 이동

      간단한 이동: 단순한 절대적 이동에 사용되며, 특히 상대적인 이동이나 회전을 고려하지 않고 이동할 때 유용함

    • CharacterController 사용
      CharacterController를 사용하여 좀 더 정교한 캐릭터 이동을 처리

      using UnityEngine;
      
      public class PlayerController : MonoBehaviour
      {
          private CharacterController controller;
          public float speed = 6.0f;
          private Vector3 moveDirection = Vector3.zero;
      
          void Start()
          {
              controller = GetComponent<CharacterController>();
          }
      
          void Update()
          {
              moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0.0f, Input.GetAxis("Vertical"));
              moveDirection = transform.TransformDirection(moveDirection);
              moveDirection *= speed;
      
              controller.Move(moveDirection * Time.deltaTime);
          }
      }

      특징
      물리 시뮬레이션: CharacterController를 사용하면 물리 시뮬레이션을 통해 이동
      중력, 땅과의 충돌 등을 고려할 수 있음

      유연한 이동: 플레이어 캐릭터와 같은 컨트롤러를 위한 더 유연한 이동을 제공

      프레임과 독립적: CharacterController.Move는 FixedUpdate에서 호출되어 프레임 속도와 무관하게 실행됨

    • Rigidbody 사용
      Rigidbody를 사용하면 물리 엔진이 적용되어 더 자연스러운 이동이 가능

      using UnityEngine;
      
      public class PlayerController : MonoBehaviour
      {
          private Rigidbody rb;
          public float speed = 6.0f;
      
          void Start()
          {
              rb = GetComponent<Rigidbody>();
          }
      
          void FixedUpdate()
          {
              float moveHorizontal = Input.GetAxis("Horizontal");
              float moveVertical = Input.GetAxis("Vertical");
      
              Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);
              rb.AddForce(movement * speed);
          }
      }

      특징
      물리 시뮬레이션: Rigidbody를 사용하면 물리 시뮬레이션을 통해 이동하며, 중력과 같은 물리 효과를 적용할 수 있음

      자연스러운 이동: 물리 엔진에 의해 제어되므로 자연스러운 이동이 가능하며, 물체 간 상호 작용에 유리

      프레임과 독립적: Rigidbody의 이동은 FixedUpdate에서 호출되어 프레임 속도와 무관하게 실행됨

기억 할 것

  • 직접 트랜스폼을 변경하고 싶을 때

    controller.enabled = false; // 캐릭터 컨트롤러 잠시 비활성화
    transform.position = teleportTarget.position; // 순간이동
    controller.enabled = true; // 캐릭터 컨트롤러 다시 활성화

    캐릭터 컨트롤러를 비활성화하고 새로운 위치로 이동시킨 후 다시 활성화하여 순간이동을 구현

profile
학생입니다

0개의 댓글