Menu
CoddyTech

CharacterController.Move

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

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ül. motion, bu karede kat 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, Slope Limit değerine (45 derece) kadar olan eğimlerde yukarı yürütür ve Step Offset değerine (0.3 birim) kadar olan çıkıntılara adım atmasını sağlar. 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 gereksinimi de budur.

Yer çekimini eklemek ve zemini bulmak sana kalmıştır. isGrounded, son Move çağrısı aşağıda bir şeye dokunduğunda true olur; bu nedenle aşağı yönlü bileşeni olmayan bir hareket zemini asla bulamaz. Controller'ın Min Move Distance değerinden (0.001) kısa bir Move hiçbir şey yapmaz; bu yüzden yalnızca yana hareket ettirilen bir controller, 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 her zaman aşağı doğru baskı uygula
        controller.Move(move * Time.deltaTime);
        if (!controller.isGrounded)
        {
            Debug.Log("Off the ground");
        }
    }
}

Kapsül, dokunduğu yüzeylerden Skin Width (0.08) kadar uzakta durur; bu nedenle y = 0 konumundaki bir zeminde duran 2 birim yüksekliğinde bir controller'ın konumu 1 değil, y = 1.08 olur. Ayrıca Move, controller'ı fiziğin en son gördüğü konumdan hareket ettirir; bu yüzden üzerinde transform.position ayarı yapmak, bir sonraki Move çağrısında bu ayarın geri alınmasına neden olabilir. Onu ışınlamak için controller.enabled = false ayarını yap, konumunu değiştir ve ardından yeniden etkinleştir.

challenge icon

Görev

Orta

Kaşif, arkasında duvar ve solunda uçurum olan taş bir platformda duruyor. CharacterController bileşeni olan Player nesnesine Explorer.cs yaz. Inspector, speed (4) ve fallSpeed (3) değerlerini ayarlar; Start() zaten denetleyiciyi ve kaşifin Renderer bileşenini bulur.

  • Ham eksenlerle okunan ok tuşları (veya WASD), kaşifi saniyede speed birim hızla hareket ettirir: x ekseni boyunca sola ve sağa, z ekseni boyunca ileri ve geri. Duvar onu durdurmalıdır.
  • Her hareket aynı zamanda saniyede fallSpeed birim aşağı iner; böylece kaşif platformda kalır ve kenarından düşer.
  • Denetleyici zemindeyken kaşif Color.green olur; zeminde değilken Color.red olur.

Play'e bas, duvara ve ardından kenardan aşağı doğru yürü, sonra Check'e 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 gezgini isGrounded durumuna göre renklendir
    }
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

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