תנועת שחקן מתקדם באחדות
במדריך זה, נחקור מכניקת תנועת שחקנים מתקדמת ב-Unity, כולל ספרינט, כפיפות ומערכת מצלמות חלקה. תכונות אלה מוסיפות עומק וליטוש לפקדים של השחקנים, ומשפרות את חווית המשחק הכוללת. נשתמש במערכת הפיזיקה של Unity לתנועה ואינטראקציות מציאותיות.
הגדרת הסצנה
לפני שנצלול לתוך קידוד, בואו נגדיר סצנה בסיסית עם אובייקט נגן ומצלמה:
- צור פרויקט Unity חדש.
- בהיררכיה, צור קוביית תלת-ממד, שנה את שמה ל-Player, וקנה קנה מידה כדי להידמות לדמות (למשל, X: 1, Y: 2, Z: 1).
- הוסף רכיב
Rigidbody
לנגן והגדר את המאפייןInterpolate
ל-Interpolate
לפיזיקה חלקה. - הוסף רכיב
Capsule Collider
, התאם את הגובה והרדיוס שלו כך שיתאימו לדגם הנגן. - צור GameObject ריק, שם לו CameraRig, וצרף אליו Camera. מקם את המצלמה מאחורי הנגן ומעט מעליו.
- הפוך את CameraRig לילד של השחקן כדי לעקוב אחר תנועותיו.
יישום תנועת שחקנים מתקדמת
ניישם סקריפט שמטפל בתנועה בסיסית, ספרינט, כפיפות וסיבוב מצלמה חלק.
PlayerMovement Script
using UnityEngine;
public class PlayerMovement : MonoBehaviour
{
public float walkSpeed = 5f;
public float sprintSpeed = 10f;
public float crouchSpeed = 2.5f;
public float jumpForce = 5f;
public float gravity = 20f;
public Transform cameraTransform;
public float lookSensitivity = 2f;
public float maxLookAngle = 80f;
private Rigidbody rb;
private float currentSpeed;
private bool isCrouching = false;
private bool isGrounded = false;
private void Start()
{
rb = GetComponent();
rb.freezeRotation = true; // Prevent the Rigidbody from rotating
}
private void Update()
{
HandleMovement();
HandleJumping();
HandleCrouching();
HandleCameraRotation();
}
private void HandleMovement()
{
float moveHorizontal = Input.GetAxis("Horizontal");
float moveVertical = Input.GetAxis("Vertical");
Vector3 move = transform.right * moveHorizontal + transform.forward * moveVertical;
move = move.normalized * currentSpeed * Time.deltaTime;
Vector3 velocity = rb.velocity;
velocity.x = move.x;
velocity.z = move.z;
rb.velocity = velocity;
}
private void HandleJumping()
{
if (Input.GetButtonDown("Jump") && isGrounded)
{
rb.velocity = new Vector3(rb.velocity.x, jumpForce, rb.velocity.z);
}
}
private void HandleCrouching()
{
if (Input.GetKeyDown(KeyCode.LeftControl))
{
isCrouching = !isCrouching;
currentSpeed = isCrouching ? crouchSpeed : walkSpeed;
transform.localScale = new Vector3(1, isCrouching ? 0.5f : 1, 1);
}
if (Input.GetKey(KeyCode.LeftShift) && !isCrouching)
{
currentSpeed = sprintSpeed;
}
else if (!isCrouching)
{
currentSpeed = walkSpeed;
}
}
private void HandleCameraRotation()
{
float mouseX = Input.GetAxis("Mouse X") * lookSensitivity;
float mouseY = Input.GetAxis("Mouse Y") * lookSensitivity;
Vector3 rotation = cameraTransform.localEulerAngles;
rotation.y += mouseX;
rotation.x -= mouseY;
rotation.x = Mathf.Clamp(rotation.x, -maxLookAngle, maxLookAngle);
cameraTransform.localEulerAngles = rotation;
}
private void OnCollisionStay(Collision collision)
{
if (collision.gameObject.CompareTag("Ground"))
{
isGrounded = true;
}
}
private void OnCollisionExit(Collision collision)
{
if (collision.gameObject.CompareTag("Ground"))
{
isGrounded = false;
}
}
}
תכונות עיקריות והסבר
בקרת תנועה ומהירות
התסריט משתמש ב-Rigidbody
של Unity כדי להזיז את הנגן, מה שמאפשר אינטראקציות מבוססות פיזיקה. המהירות משתנה בהתאם לשאלה אם השחקן הולך, דוחק או כופף. הכריעה משתנה עם מקש LeftControl
, והריצה מתרחשת תוך החזקת מקש LeftShift
.
קפיצה
שיטת HandleJumping
מפעילה כוח כלפי מעלה כאשר השחקן לוחץ על כפתור הקפיצה (ברירת מחדל: מקש רווח), בהינתן שהשחקן מקורקע. זיהוי הקרקע מטופל על ידי בדיקת התנגשויות עם אובייקטים המתויגים "Ground".
בקרת מצלמה
סיבוב המצלמה נשלט באמצעות העכבר, ומספק פרספקטיבה בגוף ראשון או גוף שלישי על סמך מיקום המצלמה. זווית המראה מהודקת כדי למנוע הטיה מוגזמת, מה שעלול לבלבל שחקנים.
סיכום
הדרכה זו מספקת בסיס לתנועת שחקנים מתקדמת ב-Unity, המכסה היבטים שונים כמו שליטה מבוססת פיזיקה, ספרינט, כפיפות וניהול מצלמה. ניתן להתאים ולהרחיב את הטכניקות הללו כדי להתאים לז'אנרים וסגנונות משחקים שונים, ולשפר את חווית השחקן עם פקדים מגיבים ומציאותיים.
זכור, תנועת השחקנים היא היבט קריטי במשחק ויש לכוונן בזהירות כדי להבטיח חווית שחקן מספקת. נסה עם ערכים ותכונות שונים כדי למצוא את ההגדרה הטובה ביותר עבור הפרויקט שלך.