Menu
CoddyTech

Antarmuka dan TryGetComponent

Termasuk bagian Arsitektur Game di Unity dalam perjalanan Unity di Coddy. Pelajaran 7 dari 50.

TryGetComponent meminta sebuah komponen dan memberi tahu kamu apakah komponen itu ditemukan, dalam satu pemanggilan. Fungsi ini juga bisa digunakan dengan interface, sehingga biasanya digunakan untuk menanyakan apakah objek yang kamu sentuh bisa menerima damage. Mine ini melukai semua objek di sekitarnya yang mengimplementasikan IDamageable:

public class Mine : MonoBehaviour
{
    public float radius = 3f;
    public int damage = 5;

    void OnTriggerEnter(Collider other)
    {
        foreach (Collider c in Physics.OverlapSphere(transform.position, radius))
        {
            if (c.TryGetComponent(out IDamageable target))
            {
                target.TakeDamage(damage);
            }
        }
        Destroy(gameObject);
    }
}

out IDamageable target mendeklarasikan variabel di dalam pemanggilan. TryGetComponent mengembalikan true dan mengisi target jika object memiliki komponen yang mengimplementasikan IDamageable; jika tidak, fungsi ini mengembalikan false dan target bernilai null. Fungsi ini hanya memeriksa satu object itu, tidak pernah parent atau child-nya.

GetComponent melaporkan class yang tidak ditemukan dan interface yang tidak ditemukan dengan cara berbeda. Di Editor, GetComponent<Rigidbody>() pada object tanpa Rigidbody mengembalikan null palsu milik Unity: == null bernilai true, tetapi ?. tidak mengenalinya dan pemanggilan itu menimbulkan MissingComponentException. Interface tidak memiliki null palsu: GetComponent<IDamageable>() mengembalikan null C# yang sebenarnya, jadi == null dan ?. sama-sama berfungsi untuknya. TryGetComponent menghindari persoalan ini untuk keduanya, dan tidak mengalokasikan apa pun di Editor saat komponen tidak ditemukan.

challenge icon

Tantangan

Mudah

Menara laser berputar dengan tombol panah kiri dan kanan, dan Space memanggil Fire() di Laser.cs. Tulis Fire. Luncurkan ray dari menara ke arah depannya, sepanjang range unit (Inspector mengatur nilainya ke 10), lalu:

  • Jika ray mengenai sesuatu yang memiliki IDamageable, panggil TakeDamage(damage) padanya dan catat Hit serta nama object tersebut, seperti Hit Robot.
  • Jika benda tersebut tidak memiliki IDamageable tetapi memiliki Rigidbody, dorong benda itu dengan AddForce(transform.forward * push, ForceMode.Impulse) dan catat Pushed serta namanya.
  • Jika tidak termasuk keduanya, catat Blocked by dan namanya, seperti Blocked by Pillar. Ray yang tidak mengenai apa pun mencatat Missed.

Gunakan TryGetComponent untuk kedua pencarian. IDamageable.cs, Robot.cs, dan Balloon.cs sudah siap. Tekan Play dan tembak ke segala arah, lalu tekan Check.

Coba sendiri

using UnityEngine;
using UnityEngine.InputSystem;

public class Laser : MonoBehaviour
{
    public float range = 10f;
    public int damage = 1;
    public float push = 5f;
    public float turnSpeed = 90f;

    private InputAction moveAction;

    void Start()
    {
        moveAction = InputSystem.actions.FindAction("Move");
    }

    void Update()
    {
        float turn = moveAction.ReadValue<Vector2>().x;
        transform.Rotate(0f, turn * turnSpeed * Time.deltaTime, 0f);
        if (Keyboard.current.spaceKey.wasPressedThisFrame)
        {
            Fire();
        }
    }

    void Fire()
    {
        // Pancarkan sinar ke depan sepanjang range satuan, lalu tangani objek yang terkena
    }
}
quiz iconUji dirimu

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

Semua pelajaran di Arsitektur Game di Unity