Menu
CoddyTech

Memeriksa Tanah dengan Ray

Termasuk bagian Fisika dan Gameplay dalam perjalanan Unity di Coddy. Pelajaran 35 dari 63.

Lompatan hanya boleh dimulai dari tanah. Grounded memeriksanya berdasarkan normal kontak yang terus diperbarui oleh pesan tabrakan. Ray menjawab pertanyaan "apakah aku sedang berdiri di atas sesuatu?" secara langsung, kapan saja: tembakkan ray lurus ke bawah dari pusat, sedikit lebih panjang daripada jarak dari pusat ke bagian bawah. Player ini adalah kapsul setinggi 2 unit, jadi bagian bawahnya berada 1 unit di bawah pusat, dan panjang ray adalah 1.1:

public float jumpForce = 5f;
private Rigidbody rb;

void Start()
{
    rb = GetComponent<Rigidbody>();
}

void Update()
{
    if (Input.GetKeyDown(KeyCode.Space) && IsGrounded())
    {
        rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
    }
}

bool IsGrounded()
{
    return Physics.Raycast(transform.position, Vector3.down, 1.1f);
}

Tambahan 0.1 adalah margin. Body yang beristirahat di lantai bisa berada sedikit di atasnya atau sedikit menembusnya, jadi ray yang panjangnya tepat 1 kadang tidak mengenai lantai. Ray yang jauh lebih panjang juga keliru: dengan panjang 3, player bisa melompat lagi saat berada 2 unit di udara, sedangkan jika panjangnya 0, ray selalu menemukan lantai, sehingga setiap kali tombol ditekan, player akan melompat.

Ray dimulai di dalam collider player sendiri, yang dilewati ray, jadi ray tidak pernah melaporkan player. Tombol dibaca di Update(), karena GetKeyDown bernilai true hanya selama satu frame, dan impuls sekali saja bisa ditambahkan langsung di sana, seperti pada Jump with an Impulse.

challenge icon

Tantangan

Sedang

Katak melompat setiap kali Space ditekan, bahkan saat berada di udara, sehingga bisa naik ke langit. Perbaiki Hopper agar katak hanya melompat dari tanah:

  • Tambahkan method bool IsGrounded() yang menembakkan ray lurus ke bawah dari pusat katak. Katak berbentuk sphere dengan skala 1.5, jadi radiusnya 0.75: buat ray menjangkau 0.1 melewati bagian bawahnya.
  • Lompat hanya saat Space ditekan dan IsGrounded() bernilai true.

Tekan Play dan coba melompat dua kali, lalu tekan Check.

Coba sendiri

using UnityEngine;

public class Hopper : MonoBehaviour
{
    public float jumpForce = 6f;
    private Rigidbody rb;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
        }
    }
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Fisika dan Gameplay