Nesneleri İtme
Coddy'nin Unity Journey'sinin Gerçek Oyunlar Geliştirmek bölümünün bir parçası. Ders 41 / 60.
Bir CharacterController hiçbir şeyi itmez: Rigidbody bulunan bir kasaya doğru yürüdüğünde, sanki duvar varmış gibi durur. Bunun yerine Unity, Move'un dokunduğu her çarpıştırıcı için, zemin de dahil olmak üzere, denetleyicinin kendi betiklerinde OnControllerColliderHit(ControllerColliderHit hit) çağrısını yapar ve ne olacağına betik karar verir. hit.collider dokunulan nesnedir, hit.moveDirection ona dokunan Move'un yönüdür ve hit.normal temas noktasında yüzeyinin baktığı yöndür. Unity'nin kendi itme betiği şöyledir:
public float pushPower = 2f;
void OnControllerColliderHit(ControllerColliderHit hit)
{
Rigidbody body = hit.collider.attachedRigidbody;
if (body == null || body.isKinematic) return; // itilecek bir şey yok
if (hit.moveDirection.y < -0.3f) return; // ayaklarımızın altında
Vector3 pushDir = new Vector3(hit.moveDirection.x, 0f, hit.moveDirection.z);
body.linearVelocity = pushDir * pushPower;
}Her return ifadesinin bir nedeni vardır. Zeminde ve duvarlarda Rigidbody yoktur; bu yüzden onlar için body null olur ve neredeyse her Move'ta onlara dokunulur. Kinematik bir gövde yalnızca kendi betiği onu hareket ettirdiğinde hareket eder; bu nedenle hız uygulamak onu etkilemez. Dik bir açıyla aşağı yönelen bir Move, ayakların altındaki bir nesneye dokunmuştur ve oyuncunun üzerinde durduğu kasa itilmemelidir.
İtme yönü yalnızca x ve z bileşenlerini korur; böylece kasa zemine doğru bastırılmak yerine zemin boyunca kayar. Kuvvet eklemek yerine linearVelocity ayarlamak, hafif ve ağır kasaları aynı hızda hareket ettirir; body.AddForce(pushDir * pushPower, ForceMode.Impulse) ise ağır kasayı daha az iter.
Görev
OrtaOyuncunun yürürken çarptığı toplara tekme atmasını sağla.
Kicker.csiçindevoid OnControllerColliderHit(ControllerColliderHit hit)yaz veRigidbody body = hit.collider.attachedRigidbody;ifadesini al.bodynull veya kinematikse ya dahit.moveDirection.y < -0.3fise (bodyayağın altındaki bir top olduğunda)returnkullan.body.linearVelocitydeğerini, y değeri 0 olan yürüme yönü çarpıkickPowerartıVector3.up * liftolarak ayarla.
“Oyna” düğmesine bas ve kırmızı topa doğru yürü: top ileri ve yukarı doğru uçar. Ardından “Kontrol et” düğmesine bas.
Kendin dene
using UnityEngine;
public class Kicker : MonoBehaviour
{
public float kickPower = 6f;
public float lift = 4f;
// Oyuncunun çarptığı toplara vur
}
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