MainCamera์ ๋ถ์ฐฉํด์ ์ฌ์ฉ
FreeLookCamera.cs
using UnityEngine;
using UnityEngine.InputSystem;
public class FreeLookCamera : MonoBehaviour
{
[Header("์ด๊ธฐ Transform")]
public Vector3 initialPosition = new Vector3(0f, 5f, -12f);
public Vector3 initialRotation = new Vector3(15f, 0f, 0f);
[Header("์ด๋ ์ค์ ")]
public float moveSpeed = 10f;
public float moveSpeedBoost = 20f;
public float moveSmoothing = 12f;
[Header("์์ ํ์ ์ค์ ")]
public float lookSensitivity = 0.3f;
public float lookSmoothing = 16f;
public float pitchMin = -80f;
public float pitchMax = 80f;
float _yaw;
float _pitch;
float _targetYaw;
float _targetPitch;
Vector3 _velocity;
Vector3 _targetVelocity;
bool _isDragging;
Mouse _mouse;
Keyboard _keyboard;
void Start()
{
transform.position = initialPosition;
transform.eulerAngles = initialRotation;
_yaw = _targetYaw = initialRotation.y;
_pitch = _targetPitch = initialRotation.x;
_mouse = Mouse.current;
_keyboard = Keyboard.current;
}
void Update()
{
_mouse = Mouse.current;
_keyboard = Keyboard.current;
HandleLookInput();
HandleMoveInput();
HandleResetInput();
ApplySmoothing();
}
void HandleLookInput()
{
if (_mouse == null) return;
if (_mouse.leftButton.wasPressedThisFrame) _isDragging = true;
if (_mouse.leftButton.wasReleasedThisFrame) _isDragging = false;
if (!_isDragging) return;
Vector2 delta = _mouse.delta.ReadValue();
_targetYaw += delta.x * lookSensitivity;
_targetPitch -= delta.y * lookSensitivity;
_targetPitch = Mathf.Clamp(_targetPitch, pitchMin, pitchMax);
}
void HandleMoveInput()
{
if (_keyboard == null) return;
float h = (_keyboard.dKey.isPressed ? 1f : 0f) - (_keyboard.aKey.isPressed ? 1f : 0f);
float v = (_keyboard.wKey.isPressed ? 1f : 0f) - (_keyboard.sKey.isPressed ? 1f : 0f);
float u = (_keyboard.qKey.isPressed ? 1f : 0f) - (_keyboard.eKey.isPressed ? 1f : 0f);
Vector3 dir = transform.right * h
+ transform.forward * v
+ Vector3.up * u;
if (dir.sqrMagnitude > 1f) dir.Normalize();
float speed = _keyboard.leftShiftKey.isPressed ? moveSpeedBoost : moveSpeed;
_targetVelocity = dir * speed;
}
void HandleResetInput()
{
if (_keyboard == null) return;
if (!_keyboard.fKey.wasPressedThisFrame) return;
transform.position = initialPosition;
transform.eulerAngles = initialRotation;
_yaw = _targetYaw = initialRotation.y;
_pitch = _targetPitch = initialRotation.x;
_velocity = Vector3.zero;
_targetVelocity = Vector3.zero;
}
void ApplySmoothing()
{
_yaw = Mathf.LerpAngle(_yaw, _targetYaw, Time.deltaTime * lookSmoothing);
_pitch = Mathf.LerpAngle(_pitch, _targetPitch, Time.deltaTime * lookSmoothing);
transform.rotation = Quaternion.Euler(_pitch, _yaw, 0f);
_velocity = Vector3.Lerp(_velocity, _targetVelocity, Time.deltaTime * moveSmoothing);
transform.position += _velocity * Time.deltaTime;
}
#if UNITY_EDITOR
void OnDrawGizmosSelected()
{
Gizmos.color = new Color(1f, 0.8f, 0f, 0.8f);
Gizmos.DrawWireSphere(initialPosition, 0.3f);
Gizmos.color = new Color(0.3f, 0.8f, 1f, 0.5f);
Gizmos.DrawRay(initialPosition, Quaternion.Euler(initialRotation) * Vector3.forward * 2f);
}
#endif
}