Menu
CoddyTech

CharacterController.Move

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

CharacterController, Unity'de yürüyen bir karakter için kullanılan bileşendir: yalnızca betiğin controller.Move(motion) çağrısı yaptığında hareket eden bir kapsüldür. motion, bu karede hareket edilecek mesafedir; yani hız ile Time.deltaTime'ın çarpımıdır. Move, kapsülü duvarların içinden geçirmek yerine duvarlar boyunca kaydırır, Eğim Sınırı (45 derece) değerine kadar olan eğimlerde yukarı çıkar ve Basamak Ofseti (0.3 birim) değerine kadar olan çıkıntılara adım atar. Bu bir Rigidbody değildir: kuvvet yoktur, yer çekimi yoktur, sekme yoktur ve onu iten hiçbir şey yoktur. Move onu tam olarak nereye gönderirse oraya gider; hassas oyun kontrollerinin ihtiyaç duyduğu da budur.

Yer çekimini eklemek de zemini bulmak da sana düşer. isGrounded, son Move aşağıdaki bir şeye dokunduğunda true olur; bu nedenle aşağı yönlü bileşeni olmayan bir hareket zemini asla bulamaz. Denetleyicinin Minimum Hareket Mesafesi (0.001) değerinden kısa bir Move hiçbir şey yapmaz; bu yüzden yalnızca yana hareket ettirilen bir denetleyici hareketsiz kaldığı anda zeminde olmadığını bildirir. Bu kurye ok tuşlarıyla yürür ve her harekette biraz aşağı doğru bastırılır:

public class Courier : MonoBehaviour
{
    public float speed = 6f;
    CharacterController controller;

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

    void Update()
    {
        Vector3 move = new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical")) * speed;
        move.y = -2f;   // Zeminin algılanması için sürekli aşağı doğru bastır
        controller.Move(move * Time.deltaTime);
        if (!controller.isGrounded)
        {
            Debug.Log("Off the ground");
        }
    }
}

Kapsül, temas ettiği şeylerden Cilt Genişliği (0.08) kadar uzakta kalır; bu nedenle y = 0 seviyesindeki zeminde duran 2 birim boyundaki bir denetleyici y = 1'de değil, y = 1.08'de durur. Ayrıca Move, fiziğin denetleyiciyi en son gördüğü konumdan başlar; bu nedenle denetleyici üzerindeki transform.position ayarı bir sonraki Move çağrısında geri alınabilir: denetleyiciyi ışınlamak için controller.enabled = false ayarını yap, konumunu değiştir ve yeniden etkinleştir.

challenge icon

Görev

Orta

Kaşifi CharacterController ile hareket ettir; böylece duvar onu durdurur.

  1. Update() içinde, x ekseni için Input.GetAxisRaw("Horizontal") ve z ekseni için Input.GetAxisRaw("Vertical") değerlerinden speed ile çarpılmış Vector3 move oluştur.
  2. move.y = -fallSpeed; değerini ayarla ve controller.Move(move * Time.deltaTime); çağrısını yap.
  3. Ardından controller.isGrounded doğruyken rend.material.color değerini Color.green olarak, değilse Color.red olarak ayarla.

“Oyna” düğmesine bas, duvara doğru yürü ve sol kenardan aşağı düş: kaşif kırmızıya döner ve yeşil olarak yere iner. Ardından “Kontrol et” düğmesine bas.

Kendin dene

using UnityEngine;

public class Explorer : MonoBehaviour
{
    public float speed = 4f;
    public float fallSpeed = 3f;

    CharacterController controller;
    Renderer rend;

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

    void Update()
    {
        // controller.Move ile yürü, ardından kâşifi isGrounded durumuna göre renklendir
    }
}

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

Kendi başına pratik yap: Unity playground