Menu
CoddyTech

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.

challenge icon

Görev

Orta

Oyuncunun yürürken çarptığı toplara tekme atmasını sağla.

  1. Kicker.cs içinde void OnControllerColliderHit(ControllerColliderHit hit) yaz ve Rigidbody body = hit.collider.attachedRigidbody; ifadesini al.
  2. body null veya kinematikse ya da hit.moveDirection.y < -0.3f ise (body ayağın altındaki bir top olduğunda) return kullan.
  3. body.linearVelocity değerini, y değeri 0 olan yürüme yönü çarpı kickPower artı Vector3.up * lift olarak 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

Kendi başına pratik yap: Unity playground