Menu
CoddyTech

Baktığın Yöne Hareket Et

Coddy'nin Unity Journey'sinin Gerçek Oyunlar Geliştirmek bölümünün bir parçası. Ders 42 / 60.

Kamera oyuncuya bir açıdan baktığında, oklar oyuncuyu ekranın gösterdiği şekilde hareket ettirmelidir: yukarı, kameradan uzaklaşarak yürümeyi; sağ ise kameranın sağına doğru yürümeyi sağlar. Dünyanın eksenleri bunu yalnızca kamera +z yönü boyunca baktığında yapar. Bu yüzden hareketi kameranın kendi yönlerinden, cam.forward ve cam.right ile oluştur.

Önce bunları düzeltmek gerekir. Oyuncuya yukarıdan bakan bir kameranın forward yönü zemini gösterir; bu nedenle yalnızca zemin boyunca olan kısmı bırakmak için y değerini 0 yap. Geriye kalan uzunluk 1'den kısadır; aşağı doğru 30 derece eğilmiş bir kamerada yaklaşık 0.87 olur ve oyuncu daha yavaş yürür. Bu yüzden vektörü normalize et. Bu yürüme denetleyicisi, seviyenin bir köşesine bakan ana kamerayı izler:

Transform cam = Camera.main.transform;

Vector3 forward = cam.forward;
forward.y = 0f;
forward.Normalize();
Vector3 right = cam.right;
right.y = 0f;
right.Normalize();

Vector3 move = forward * Input.GetAxisRaw("Vertical") + right * Input.GetAxisRaw("Horizontal");
if (move.magnitude > 1f) move.Normalize();   // çapraz hareketler daha hızlı değil
controller.Move(move * speed * Time.deltaTime);

Camera.main, MainCamera etiketli kameradır. İki yön de her karede okunur; böylece kamera döndüğünde kontroller doğru kalır. Yukarı ve sağ yönleri birlikte kullanmak, dik açılarda iki birim vektörü toplar; sonuç yaklaşık 1.41 uzunluğundadır. Bu nedenle hareket uzunluğu 1'den fazlaysa normalize edilir.

challenge icon

Görev

Orta

Ok tuşları, oyuncuyu dönen kameraya göre hareket ettirsin.

  1. Update() içinde cam.forward ve cam.right değerlerini kopyala; y değerini 0 yap ve normalize et.
  2. dir, ham "Vertical" ekseniyle çarpılmış forward ile "Horizontal" ekseniyle çarpılmış right değerlerinin toplamıdır; uzunluğu 1’den büyükse normalize et.
  3. dir != Vector3.zero olduğunda transform.rotation = Quaternion.LookRotation(dir); değerini ata. move değerini dir * speed ifadesinden oluştur.

“Oyna” düğmesine bas: yukarı tuşu, kamera hangi yöne bakıyorsa oyuncuyu o yönde kameradan uzağa yürütür. Ardından “Kontrol et” düğmesine bas.

Kendin dene

using UnityEngine;

public class Mover : MonoBehaviour
{
    public float speed = 4f;
    public float gravity = -15f;
    public Transform cam;

    CharacterController controller;
    float verticalSpeed;

    void Start()
    {
        controller = GetComponent<CharacterController>();
    }

    void Update()
    {
        if (controller.isGrounded && verticalSpeed < 0f)
        {
            verticalSpeed = -2f;
        }
        verticalSpeed += gravity * Time.deltaTime;

        // Dünya eksenleri boyunca hareket ediyor: cam'e göre hareket etmesini ve hareket ettiği yöne dönmesini sağla
        Vector3 move = new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical")) * speed;
        move.y = verticalSpeed;
        controller.Move(move * Time.deltaTime);
    }
}

Gerçek Oyunlar Geliştirmek bölümündeki tüm dersler

Kendi başına pratik yap: Unity playground