Menu
CoddyTech

Antarmuka dan TryGetComponent

Termasuk bagian Arsitektur Game di Unity dalam perjalanan Unity di Coddy. Pelajaran 8 dari 64.

TryGetComponent meminta sebuah komponen dan memberi tahu kamu apakah komponen itu ditemukan, dalam satu pemanggilan. Cara ini juga berfungsi dengan interface, sehingga biasanya digunakan untuk menanyakan apakah apa pun yang kamu tabrak bisa menerima damage. Ranjau ini memberi damage pada semua objek di sekitarnya yang merupakan 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 ketika objek memiliki komponen yang mengimplementasikan IDamageable; jika tidak, TryGetComponent mengembalikan false dan target bernilai null. Cara ini hanya memeriksa objek tersebut, tidak pernah parent atau child-nya.

GetComponent melaporkan class yang tidak ditemukan secara berbeda dari interface yang tidak ditemukan. Di Editor, GetComponent<Rigidbody>() pada objek yang tidak memiliki Rigidbody mengembalikan null palsu milik Unity: == null bernilai true, tetapi ?. tidak mendeteksinya dan pemanggilan tersebut menimbulkan MissingComponentException. Interface tidak memiliki null palsu: GetComponent<IDamageable>() mengembalikan null C# yang sebenarnya, sehingga == null dan ?. sama-sama berfungsi pada nilai tersebut. TryGetComponent menghindari persoalan ini untuk keduanya, dan tidak mengalokasikan apa pun di Editor ketika komponen tidak ditemukan.

challenge icon

Tantangan

Mudah

Tulis Fire() di Laser: satu sinar, empat hasil.

  1. Lakukan raycast dengan Physics.Raycast dari menara ke arah transform.forward, sejauh range. Jika tidak mengenai apa pun, catat Missed.
  2. Jika hit.collider.TryGetComponent(out IDamageable target), panggil TakeDamage(damage) dan catat "Hit " + hit.collider.name.
  3. Jika tidak, dan objek memiliki Rigidbody, gunakan AddForce(transform.forward * push, ForceMode.Impulse) dan catat "Pushed " diikuti namanya; jika tidak, catat "Blocked by " diikuti namanya.

Tekan tombol “Main”, putar dan tembak ke segala arah. Lalu tekan tombol “Periksa”.

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 apa pun yang terkena
    }
}

Semua pelajaran di Arsitektur Game di Unity

Latihan sendiri: Playground Unity