وحدة تحكم FPS Unity
FPS (أو First-Person Shooter) هي لعبة يتم فيها التحكم في الشخصية الرئيسية من منظور الشخص الأول.
عناصر التحكم المعتادة هي W وA وS وD للمشي، وMouse Look للنظر حولك، وSpace للقفز، وShift الأيسر للركض السريع، مما يسمح للاعب بالتحرك بحرية حول المستوى.
في هذا المنشور، سأوضح كيفية إنشاء وحدة تحكم FPS في Unity والتي ستتعامل مع دوران الكاميرا وحركة اللاعب.
خطوات
لإنشاء وحدة تحكم FPS، اتبع الخطوات التالية:
- قم بإنشاء كائن لعبة جديد (GameObject -> Create Empty) وقم بتسميته "FPSPlayer"
- قم بإنشاء كبسولة جديدة (GameObject -> 3D Object -> Capsule) وحركها داخل الكائن "FPSPlayer"
- قم بإزالة مكون مصادم الكبسولة من الكبسولة وقم بتغيير موضعه إلى (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 جاهزًا!