Menu
CoddyTech

Berdiri di Atas Tanah

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

Setiap kontak memiliki normal: arah dengan panjang 1, tegak lurus terhadap permukaan yang kamu sentuh, mengarah menjauhinya ke arah object-mu. collision.GetContact(0) adalah titik kontak pertama, dan normal-nya memberitahumu sisi mana yang kamu sentuh. Saat berdiri di tanah datar, nilainya (0, 1, 0); saat menyentuh dinding di sebelah kananmu, nilainya (-1, 0, 0); saat kepalamu terbentur langit-langit, nilainya (0, -1, 0).

Petunjuk ini membedakan pendaratan dari benturan samping:

void OnCollisionEnter(Collision collision)
{
    Vector3 normal = collision.GetContact(0).normal;
    if (normal.y > 0.5f)
    {
        Debug.Log("Landed on " + collision.gameObject.name);
    }
    else
    {
        Debug.Log("Bumped the side of " + collision.gameObject.name);
    }
}

Pemeriksaannya menggunakan normal.y > 0.5f, bukan tepat 1, agar permukaan miring juga dianggap sebagai tanah: nilai y adalah 0.5 pada kemiringan 60 derajat, lebih curam daripada yang bisa dinaiki siapa pun dengan berjalan kaki. Dua pesan lainnya membantu menangani apa pun yang berlangsung lebih lama: OnCollisionStay berjalan pada setiap langkah fisika selama kontak berlangsung, sedangkan OnCollisionExit berjalan sekali saat kontak berakhir. Saat kontak berakhir, tidak ada titik kontak karena sudah tidak ada yang bersentuhan, jadi jangan panggil GetContact di sana.

challenge icon

Tantangan

Mudah

Pemain bisa berjalan dan melompat, tetapi tombol Space juga berfungsi saat di udara, sehingga pemain bisa memanjat ke langit dengan satu lompatan setiap kali, dan melompat menjauh dari sisi dinding. (Collider-nya menggunakan material tanpa gesekan, sehingga pemain meluncur turun di dinding alih-alih menempel.) Buat pemain hanya melompat saat berdiri di atas sesuatu.

  • Pertahankan bool grounded: bernilai true selama pemain menyentuh sesuatu yang normal kontaknya mengarah ke atas (y di atas 0.5), dan bernilai false setelah pemain berhenti menyentuhnya.
  • Pemain hanya melompat jika Space ditekan dan grounded bernilai true. Tekanan tombol saat di udara diabaikan, bukan disimpan sampai pemain mendarat.

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

Coba sendiri

using UnityEngine;

public class Hopper : MonoBehaviour
{
    public float speed = 4f;
    public float jump = 6f;
    private Rigidbody rb;
    private bool jumpPressed;

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

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            jumpPressed = true;
        }
    }

    void FixedUpdate()
    {
        float h = Input.GetAxisRaw("Horizontal");
        rb.linearVelocity = new Vector3(h * speed, rb.linearVelocity.y, 0);
        if (jumpPressed)
        {
            rb.AddForce(Vector3.up * jump, ForceMode.Impulse);
            jumpPressed = false;
        }
    }
}
quiz iconUji dirimu

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

Semua pelajaran di Fisika dan Gameplay