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.
Görev
OrtaKaşifi CharacterController ile hareket ettir; böylece duvar onu durdurur.
Update()içinde, x ekseni içinInput.GetAxisRaw("Horizontal")ve z ekseni içinInput.GetAxisRaw("Vertical")değerlerindenspeedile çarpılmışVector3 moveoluştur.move.y = -fallSpeed;değerini ayarla vecontroller.Move(move * Time.deltaTime);çağrısını yap.- Ardından
controller.isGroundeddoğruykenrend.material.colordeğeriniColor.greenolarak, değilseColor.redolarak 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
1Ekrandaki Metinler
Canvas ve MetinSkoru GösterSayıları BiçimlendirGeri Sayım ZamanlayıcısıTekrar: Hız Göstergesi2Düğmeler ve Ekranlar
Düğmeler ve onClickLambda İfadeleriInspector'da Bağlantı KurmaPanelleri Açma ve KapamaCan ÇubuklarıTekrar: Yükseltme Mağazası5PlayerPrefs ile Kaydetme
Bir Sayı KaydetmeVarsayılan Değerle YüklemeEn Yüksek SkorAyarları KaydetmeTekrar: Bankadaki Paralar8Karakter Kontrolcüsü
CharacterController.MoveYerçekimini Elle UygulamaZıplamaNesneleri İtmeBaktığın Yöne Hareket EtTekrar: Çift ZıplamaKendi başına pratik yap: Unity playground