בקר Unity FPS
FPS (או First-Person Shooter) הוא משחק שבו הדמות הראשית נשלטת מנקודת מבט מגוף ראשון.
הפקדים הרגילים הם W, A, S ו-D כדי ללכת, Mouse Look כדי להסתכל מסביב, Space לקפוץ, ו-Left Shift כדי לרוץ, מה שמאפשר לשחקן לזוז בחופשיות ברחבי הרמה.
בפוסט זה אראה כיצד ליצור בקר FPS בUnity שיטפל בסיבוב המצלמה ובתנועת הנגן.
שלבים
כדי ליצור בקר FPS, בצע את השלבים הבאים:
- צור אובייקט משחק חדש (GameObject -> Create Empty) ושם לו "FPSPlayer"
- צור קפסולה חדשה (GameObject -> 3D Object -> Capsule) והזז אותה בתוך האובייקט "FPSPlayer"
- הסר את רכיב 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 לאובייקט "FPSPlayer" (תבחין שהוא הוסיף גם רכיב נוסף בשם Character Controller, שנה את הערך המרכזי שלו ל- (0, 1, 0))
- הקצה את המצלמה הראשית למשתנה המצלמה של הנגן ב-SC_FPSController
בקר ה-FPS מוכן כעת!