Unity 3D First Person Controller Kodları
Bu yazıda, Unity oyun motorunda bir First Person Controller (ilk kişi karakter kontrolü) nasıl oluşturulacağını öğreneceğiz. Bu, bir oyun karakterinin kamerayla birlikte hareket etmesini, zıplamasını ve fare ile çevreyi kontrol etmesini sağlayan bir script içerir. Aşağıda, adım adım kodun işlevlerini ve nasıl kullanacağınızı bulabilirsiniz.
Kodun Amacı
- Fare ile oyuncunun görüş açısını kontrol etmek (Mouse Look).
- Karakterin zeminde hareket etmesini ve zıplamasını sağlamak.
- Yerçekimini gerçekçi bir şekilde uygulamak.
Kullanım Talimatları
- Yeni Bir Script Ekleyin:
- Unity’de
Scripts
adında bir klasör oluşturun. FirstPersonController
adında yeni bir C# script oluşturun.
- Unity’de
- Scripti Yapıştırın:
- Aşağıdaki kodu script dosyasına yapıştırın.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class FirstPersonController : MonoBehaviour
{
public float mouseSensitivity = 200f; // Fare hassasiyeti
public Transform cameraTransform; // Kamera pozisyon bilgisi
public Transform playerBody; // Ana obje pozisyon bilgisi
public float movementSpeed = 5f; // Hareket hızı
public float jumpHeight = 1.5f; // Zıplama yüksekliği
public float gravity = -9.81f; // Yerçekimi kuvveti
private float xRotation = 0f; // Kamera için dikey dönme açısı
private CharacterController characterController; // Karakter hareketi kontrolü
private Vector3 velocity; // Hız vektörü (yerçekimi için)
private bool isGrounded; // Zeminde olup olmadığını kontrol etmek için
public LayerMask groundLayer; // Zemin katmanı
public Transform groundCheck; // Zemin kontrolü için boş bir nesne
public float groundDistance = 0.4f; // Zemin kontrol mesafesi
void Start()
{
// Fare imlecini kilitler ve gizler.
Cursor.lockState = CursorLockMode.Locked;
Cursor.visible = false;
// CharacterController bileşenini al.
characterController = GetComponent<CharacterController>();
}
void Update()
{
// Zemin kontrolü yap.
CheckGround();
// Karakter hareketini işleyin.
HandleMovement();
// Zıplama ve yerçekimi işle.
HandleGravityAndJump();
}
// Fiziksel işlemlerle çakışmaması için Kamera işlemlerini LateUpdate ile uygula
void LateUpdate()
{
// Kamera işlemlerini sonradan uygula
HandleMouseLook();
}
void HandleMouseLook()
{
// Fare hareketlerini al
float mouseX = Input.GetAxis("Mouse X") * mouseSensitivity * Time.deltaTime;
float mouseY = Input.GetAxis("Mouse Y") * mouseSensitivity * Time.deltaTime;
// Yukarı aşağı bakış açısını sınırla (sadece kamera için)
xRotation -= mouseY;
xRotation = Mathf.Clamp(xRotation, -90f, 90f);
// Kameranın yukarı aşağı bakışını kontrol et (sadece kamera döner)
cameraTransform.localRotation = Quaternion.Euler(xRotation, 0f, 0f);
// Karakteri sağa sola döndür (playerBody nesnesi döner)
playerBody.Rotate(Vector3.up * mouseX);
}
void HandleMovement()
{
float horizontal = Input.GetAxis("Horizontal");
float vertical = Input.GetAxis("Vertical");
// Hareket yönünü hesapla.
Vector3 direction = transform.right * horizontal + transform.forward * vertical;
// Karakteri hareket ettir.
characterController.Move(direction * movementSpeed * Time.deltaTime);
}
void HandleGravityAndJump()
{
// Eğer karakter zemindeyse, hız vektörünü sıfırla ve zıplama kontrolü yap.
if (isGrounded && velocity.y < 0)
{
velocity.y = -2f; // Zemine yapışık kalmasını sağlamak için hafif negatif değer kullanılır.
}
// Zıplama kontrolü.
if (Input.GetButtonDown("Jump") && isGrounded)
{
velocity.y = Mathf.Sqrt(jumpHeight * -2f * gravity); // Zıplama fiziği formülü.
}
// Yerçekimi uygula.
velocity.y += gravity * Time.deltaTime;
// Hızı karakterin hareketine ekle.
characterController.Move(velocity * Time.deltaTime);
}
void CheckGround()
{
// Zemin kontrolü: groundCheck nesnesinden aşağı doğru bir küre ışını gönder.
isGrounded = Physics.CheckSphere(groundCheck.position, groundDistance, groundLayer);
// Debugging için: Zemin kontrol küresini göster.
Debug.DrawRay(groundCheck.position, Vector3.down * groundDistance, Color.red);
}
}
Script Ayarları
- Objeye Script Ekleme:
- Create Empty ile boş bir Game Object yada Capsule oluşturun. ismini “Player” yapın pozisyonunu 0,0,0 olarak ayarlayın.
- Bu karakter, bir CharacterController bileşenine sahip olmalıdır.
- Scripti karakter objenize sürükleyip bırakın.
- Main Camerayı bu objenin içerisine bırakıp resetleyin. Daha sonra uygun konuma getirin. Yüksekliğini ayarlamak size kalmış.
- Boş bir Game Objesi daha ekleyin. İsmini “GroundChecker” yapın. Sağ taraftan inspector panelinden rengini ve şeklini ayarlayın. Daha net bir görüntü
- oluşturacaktır. Bunu da karakterin ayak kısmına getirin.
- Layer kısmından “Ground” adında bir katman “layer” oluşturun.
- Inspector Ayarları:
- Camera Transform: Ana kamerayı sürükleyip bu alana bırakın.
- Player Body: Karakterin ana objesini buraya atayın.
- Ground Check: Karakterin ayaklarının altında oluşturduğunuz0 boş objeyi bu kısma atayın.
- Ground Layer: Zemin olarak belirlediğiniz katmanı burada seçin.
- Input Settings:
- Horizontal ve Vertical: Hareket için
Input.GetAxis("Horizontal")
veInput.GetAxis("Vertical")
kullanır. - Jump: Varsayılan olarak
Space
tuşu atanmıştır.
- Horizontal ve Vertical: Hareket için
Önemli Notlar
- Yerçekimi ve Zıplama: Yerçekimi,
HandleGravityAndJump
fonksiyonuyla sürekli uygulanır. - Fare Hassasiyeti:
mouseSensitivity
değeri oyun deneyimine göre ayarlanabilir. - Hız Ayarı:
movementSpeed
karakterin hareket hızını belirler.
Bu script, bir ilk kişi kontrol mekanizması oluşturmak için temel yapı taşlarını sağlar. Geliştirerek sprint ekleme, farklı zemin türleri, ya da yavaşlama gibi özellikler ekleyebilirsiniz. 😊