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ı

  1. Yeni Bir Script Ekleyin:
    • Unity’de Scripts adında bir klasör oluşturun.
    • FirstPersonController adında yeni bir C# script oluşturun.
  2. 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ı

  1. 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.
  2. 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.
  3. Input Settings:
    • Horizontal ve Vertical: Hareket için Input.GetAxis("Horizontal") ve Input.GetAxis("Vertical") kullanır.
    • Jump: Varsayılan olarak Space tuşu atanmıştır.

Ö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. 😊

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir


error: Content is protected !!