Menu
CoddyTech

Nesneleri İtme

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

Bir CharacterController hiçbir şeyi itmez: Rigidbody içeren bir kasaya doğru yürütüldüğünde duvar varmış gibi durur. Bunun yerine Unity, Move'un dokunduğu her çarpıştırıcı için (zemin de dahil) denetleyicinin kendi betiklerinde OnControllerColliderHit(ControllerColliderHit hit) işlevini çağırır 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 sırasında bunlara dokunulur. Kinematik bir gövde yalnızca kendi betiği onu hareket ettirdiğinde hareket eder; dolayısıyla hız uygulamak onu etkilemez. Aşağıya doğru dik bir yön gösteren bir Move, ayakların altındaki bir nesneye dokunmuştur ve oyuncunun üzerinde durduğu kasa itilmemelidir.

İtme yönünde yalnızca x ve z bileşenleri tutulur; böylece kasa zemine doğru bastırılmak yerine zemin boyunca kayar. Kuvvet eklemek yerine linearVelocity ayarlamak, hafif bir kasayı da ağır bir kasayı da aynı hızda hareket ettirir; body.AddForce(pushDir * pushPower, ForceMode.Impulse) ise ağır olanı daha az iter.

challenge icon

Görev

Orta

Topları bahçede tekmeleyin. Oyuncu, bir CharacterController ile yürür (Walker.cs hazır). Kicker.cs dosyasını yazın ve onu da Player nesnesine ekleyin. Inspector'da kickPower (6) ve lift (4) ayarlanır.

  • Oyuncu itilebilen bir cisme yürüyerek çarptığında, cismin linearVelocity değerini yürüme yönünde, yere paralel olacak şekilde kickPower ile çarpıp, yukarı doğru lift ekleyerek ayarlayın; böylece top ileri ve yukarı doğru uçar.
  • Yerde ve direkte Rigidbody yoktur: hata vermeden bunları atlayın.
  • Oyuncunun ayaklarının altındaki topa tekme atılmaz.

Play'e basıp kırmızı topa tekme atın, ardından Check'e basın.

Kendin dene

using UnityEngine;

public class Kicker : MonoBehaviour
{
    public float kickPower = 6f;
    public float lift = 4f;

    // Oyuncunun çarptığı toplara tekme at
}
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