반응형
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에서 이벤트호출로 카메라를 움직일 수 있다.

반응형
'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 |