유니티 FPS 컨트롤러
FPS(또는 일인칭 슈팅 게임)는 주인공이 1인칭 관점에서 조종되는 게임입니다.
일반적인 조작법은 걷기는 W, A, S, D, 주변을 둘러보는 마우스 룩, 점프는 스페이스바, 달리기는 왼쪽 Shift로, 플레이어는 레벨 주변을 이동으로 자유롭게 이동할 수 있습니다.
이 글에서는 Unity로 카메라 회전과 플레이어 움직임을 처리하는 FPS 컨트롤러를 만드는 방법을 보여드리겠습니다.
단계
FPS 컨트롤러를 만들려면 다음 단계를 따르세요.
- 새 게임 객체를 생성하고 이름을 지정합니다. "FPSPlayer"
- 새로운 캡슐을 생성(게임 객체 -> 3D 객체 -> 캡슐)하고 "FPSPlayer" 객체 내부로 이동합니다.
- Capsule에서 Capsule Collider 구성 요소를 제거하고 해당 위치를 (0, 1, 0)으로 변경합니다.
- "FPSPlayer" 객체 내부로 메인 카메라를 이동하고 위치를 (0, 1.64, 0)으로 변경합니다.
- 새 스크립트를 로 만들고 이름을 "SC_FPSController"로 지정한 후 아래 코드를 붙여넣습니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(CharacterController))]
public class SC_FPSController : MonoBehaviour
{
public float walkingSpeed = 7.5f;
public float runningSpeed = 11.5f;
public float jumpSpeed = 8.0f;
public float gravity = 20.0f;
public Camera playerCamera;
public float lookSpeed = 2.0f;
public float lookXLimit = 45.0f;
CharacterController characterController;
Vector3 moveDirection = Vector3.zero;
float rotationX = 0;
[HideInInspector]
public bool canMove = true;
void Start()
{
characterController = GetComponent<CharacterController>();
// Lock cursor
Cursor.lockState = CursorLockMode.Locked;
Cursor.visible = false;
}
void Update()
{
// We are grounded, so recalculate move direction based on axes
Vector3 forward = transform.TransformDirection(Vector3.forward);
Vector3 right = transform.TransformDirection(Vector3.right);
// Press Left Shift to run
bool isRunning = Input.GetKey(KeyCode.LeftShift);
float curSpeedX = canMove ? (isRunning ? runningSpeed : walkingSpeed) * Input.GetAxis("Vertical") : 0;
float curSpeedY = canMove ? (isRunning ? runningSpeed : walkingSpeed) * Input.GetAxis("Horizontal") : 0;
float movementDirectionY = moveDirection.y;
moveDirection = (forward * curSpeedX) + (right * curSpeedY);
if (Input.GetButton("Jump") && canMove && characterController.isGrounded)
{
moveDirection.y = jumpSpeed;
}
else
{
moveDirection.y = movementDirectionY;
}
// Apply gravity. Gravity is multiplied by deltaTime twice (once here, and once below
// when the moveDirection is multiplied by deltaTime). This is because gravity should be applied
// as an acceleration (ms^-2)
if (!characterController.isGrounded)
{
moveDirection.y -= gravity * Time.deltaTime;
}
// Move the controller
characterController.Move(moveDirection * Time.deltaTime);
// Player and Camera rotation
if (canMove)
{
rotationX += -Input.GetAxis("Mouse Y") * lookSpeed;
rotationX = Mathf.Clamp(rotationX, -lookXLimit, lookXLimit);
playerCamera.transform.localRotation = Quaternion.Euler(rotationX, 0, 0);
transform.rotation *= Quaternion.Euler(0, Input.GetAxis("Mouse X") * lookSpeed, 0);
}
}
}
- SC_FPSController 스크립트를 객체에 첨부합니다. (Character Controller라는 또 다른 구성 요소가 추가되었음을 알 수 있으며, 중심 값을 (0, 1, 0)으로 변경합니다.)
- SC_FPSController의 플레이어 카메라 변수에 메인 카메라를 할당합니다.
이제 FPS 컨트롤러가 준비되었습니다!