부트캠프/Unity [ 스파르타 ]

[TIL] 유니티 스파르타 7기 16일차 - 탱크 움직임과 마우스 에임

맏난거 2025. 2. 12. 20:59

팀프로젝트가 끝나서 무작정 따라서 만들어서 유니티 공부를 했습니다.

using UnityEngine;

public class Player : MonoBehaviour
{
    private Rigidbody rb;

    [Header("Movement Data")]
    public float moveSpeed;
    public float rotationSpeed;

    private float verticalInput;
    private float horizontalInput;

    [Space]
    public LayerMask whatIsAimMask;
    public Transform aimTransform;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void Update()
    {
        UpdateAim();
        verticalInput = Input.GetAxis("Vertical");
        horizontalInput = Input.GetAxis("Horizontal");

        // 뒤로 움직일때 움직임 예외사항
        if (verticalInput < 0)
            horizontalInput = -Input.GetAxis("Horizontal");     
    }

    private void FixedUpdate()
    {
        Vector3 movement = transform.forward * moveSpeed * verticalInput;
        rb.velocity = movement;
        transform.Rotate(0, horizontalInput * rotationSpeed, 0);
    }

    private void UpdateAim()
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); // 마우스 위치에서 레이를 쏴서 정보를 받아옵니다.
        RaycastHit hit;

        if(Physics.Raycast(ray, out hit, Mathf.Infinity, whatIsAimMask))
        {
            float fieldY = aimTransform.position.y;
            aimTransform.position = new Vector3(hit.point.x, fieldY, hit.point.z); // y축이 변경되어 땅으로 박히는 현상이 일어나서 y축을 고정 시켰습니다.
        }
    }
}

 

FixedUpdate()

프레임 기반으로 호출되는 Update와 달리 Fixed Timestep에 설정된 값에 따라 일정한 간격(Default : 0.02sec)으로 호출된다! 물리 효과가 적용된(Rigidbody) 오브젝트를 조정할 때 사용된다. Update는 불규칙한 호출임으로 물리충돌 검사로는 상대적으로 부적합하다.

Update()

스크립트가 활성화(enabled) 상태일 때, 매 프레임마다 호출된다! 주기가 일정하지 않아 물리효과가 적용되지 않은 오브젝트의 움직임이나 단순한 타이머, 키 입력을 받을 때 사용된다!

 

LateUpdate()

모든 Update 함수가 호출된 후, 마지막으로 호출된다. 주로 오브젝트를 따라가게 하는 카메라와 같은 곳에 자주 사용된다

 

참고 vlog

https://velog.io/@ymsection/Unity-FixedUpdate-Update-LateUpdate-%EC%B0%A8%EC%9D%B4%EC%A0%90