본문 바로가기

[Unity] Input Action을 활용한 Fps Cam 적용하기

@Xenawn2025. 4. 9. 11:09
반응형

1. Input Actions에서 Actions 등록

2. 스크립트 적용

먼저 Player 오브젝트에 Player, FpsCamera, PlayerController가 있어야 동작을 할 수 있다. 

적용할 Fps 카메라 스크립트

using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.InputSystem;

public class FpsCamera : MonoBehaviour
{
    [SerializeField] private float rotCamXAxisSpeed = 1; // 수평 감도
    [SerializeField] float rotCamYAxisSpeed = 1; // 수직 감도
    [SerializeField] float sensitivity = 0.1f; // 모든 감도 
    private float limitMinx = -80;
    private float limitMaxX = 50;
    private float eulerAngleX;
    private float eulerAngleY;

    
    public void UpdateRotate(float mouseX, float mouseY)
    {

        eulerAngleY += mouseX * rotCamYAxisSpeed* sensitivity;
        eulerAngleX -= mouseY * rotCamXAxisSpeed* sensitivity;

        eulerAngleX = ClampAngle(eulerAngleX, limitMinx, limitMaxX);
        transform.rotation = Quaternion.Euler(eulerAngleX, eulerAngleY, 0);

    }

    private float ClampAngle(float angle, float min, float max)
    {
        if (angle < -360) angle += 360;
        if (angle > 360) angle -= 360;

        return Mathf.Clamp(angle,min,max);  
    }


}

Player 오브젝트에서 FpsCamera 스크립트를 GetComponent로 가져와야한다.

3. Player에서 FpsCamera 스크립트 가져오기

using UnityEngine;

public class Player : MonoBehaviour
{
    // Player 입력 and 여러 컴포넌트 관리
    [field: SerializeField] public PlayerData Data { get; private set; }
    [field: Header("Animations")]
    [field: SerializeField] public PlayerAnimationData AnimationData { get; private set; }

    public Animator Animator;
    public PlayerController Input { get; private set; }
    public CharacterController Controller { get; private set; }

    public ForceReceiver ForceReceiver { get; private set; }
    public FpsCamera FpsCamera { get; private set; }
    private PlayerStateMachine stateMachine;
    

    private void Awake()
    {
        AnimationData.Initialize();
        Animator = GetComponent<Animator>();
        Input = GetComponent<PlayerController>();
        Controller = GetComponent<CharacterController>();
        ForceReceiver = GetComponent<ForceReceiver>();  
        FpsCamera = GetComponent<FpsCamera>();
        stateMachine = new PlayerStateMachine(this);
       
    }
    private void Start()
    {
        Cursor.lockState = CursorLockMode.Locked;   // 커서 숨기기
        stateMachine.ChangeState(stateMachine.IdleState);
    }

    private void Update()
    {
        stateMachine.HandleInput();
        stateMachine.Update();
    }

    private void FixedUpdate()
    {
        stateMachine.PhysicsUpdate();
    }
}

 

4. InputAction을 적용할 스크립트에서 구독하기

 

  protected virtual void OnLookStarted(InputAction.CallbackContext context)
  {
      Vector2 lookDelta = context.ReadValue<Vector2>();
      stateMachine.Player.FpsCamera.UpdateRotate(lookDelta.x, lookDelta.y);
  }

 

   protected virtual void AddInputActionCallbacks() // 구독
   {
       PlayerController input = stateMachine.Player.Input;
       input.playerActions.Movement.canceled += OnMovementCanceled;
       input.playerActions.Look.started += OnLookStarted;
   }

 

이렇게하면 Input Action에서 이벤트호출로 카메라를 움직일 수 있다.

Fps 카메라

반응형

'Game Engine > Unity' 카테고리의 다른 글

[Unity] Cinemachine  (0) 2025.04.28
[Unity] Visual studio 다이어그램 보는법  (0) 2025.04.24
[Unity] Character Controller  (0) 2025.04.07
[Unity] 트러블 슈팅  (0) 2025.04.02
[Unity] Coroutine과 Invoke 사용할 때 주의할점  (0) 2025.03.13
Xenawn
@Xenawn :: Xenawn

제넌 게임개발 블로그

공감하셨다면 ❤️ 구독도 환영합니다! 🤗

목차