Unity'de Gelişmiş Oyuncu Hareketi
Bu eğitimde, Unity'deki ileri düzey oyuncu hareket mekaniklerini, koşma, çömelme ve akıcı bir kamera sistemini keşfedeceğiz. Bu özellikler, oyuncu kontrollerine derinlik ve cila katarak genel oyun deneyimini geliştirir. Gerçekçi hareket ve etkileşimler için Unity'nin fizik sistemini kullanacağız.
Sahneyi Kurmak
Kodlamaya başlamadan önce, bir oyuncu nesnesi ve bir kamera ile basit bir sahne kuralım:
- Yeni bir Unity projesi oluşturun.
- Hiyerarşi'de bir 3D Küp oluşturun, adını Oyuncu olarak değiştirin ve bir karaktere benzeyecek şekilde ölçeklendirin (örneğin, X: 1, Y: 2, Z: 1).
- Oynatıcıya
Rigidbody
bileşenini ekleyin ve akıcı fizik içinInterpolate
özelliğiniInterpolate
olarak ayarlayın. Kapsül Çarpıştırıcısı
bileşenini ekleyin, yüksekliğini ve yarıçapını oynatıcı modeline uyacak şekilde ayarlayın.- Boş bir GameObject yaratın, adını CameraRig koyun ve ona bir Camera ekleyin. Kamerayı oyuncunun arkasına ve biraz üstüne yerleştirin.
- CameraRig nesnesini, hareketlerini takip edecek bir Player nesnesinin çocuğu yapın.
Gelişmiş Oyuncu Hareketini Uygulama
Temel hareketleri, koşmayı, çömelmeyi ve yumuşak kamera dönüşünü ele alan bir senaryo uygulayacağız.
PlayerMovement Komut Dosyası
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;
}
}
}
Temel Özellikler ve Açıklama
Hareket ve Hız Kontrolü
Betik, oyuncuyu hareket ettirmek için Unity'nin Rigidbody
'ini kullanır ve bu da fizik tabanlı etkileşimlere olanak tanır. Hız, oyuncunun yürümesine, koşmasına veya çömelmesine göre değişir. Çömelme, LeftControl
tuşuyla açılıp kapatılır ve LeftShift
tuşu basılı tutulurken sprint gerçekleşir.
Atlama
HandleJumping
yöntemi, oyuncunun yere basması koşuluyla, oyuncu zıplama düğmesine (varsayılan: boşluk çubuğu) bastığında yukarı doğru bir kuvvet uygular. Zemin tespiti, "Ground" etiketli nesnelerle çarpışma olup olmadığını kontrol ederek gerçekleştirilir.
Kamera Kontrolü
Kameranın dönüşü fare kullanılarak kontrol edilir ve kameranın konumuna göre birinci şahıs veya üçüncü şahıs perspektifi sağlanır. Bakış açısı, oyuncuları şaşırtabilecek aşırı eğilmeyi önlemek için sabitlenir.
Çözüm
Bu eğitim, fizik tabanlı kontrol, koşma, çömelme ve kamera yönetimi gibi çeşitli yönleri kapsayan Unity'de gelişmiş oyuncu hareketi için bir temel sağlar. Bu teknikler, farklı oyun türlerine ve stillerine uyacak şekilde daha da özelleştirilebilir ve genişletilebilir, duyarlı ve gerçekçi kontrollerle oyuncu deneyimini geliştirir.
Unutmayın, oyuncu hareketi oyunun kritik bir yönüdür ve tatmin edici bir oyuncu deneyimi sağlamak için dikkatlice ayarlanmalıdır. Projeniz için en iyi kurulumu bulmak için farklı değerler ve özellikler deneyin.