Menu
CoddyTech

Extension method

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

Vector3 dan Transform berasal dari Unity, jadi kamu tidak bisa menambahkan method ke keduanya. Extension method adalah method static yang dapat kamu panggil seolah-olah method itu milik keduanya, berkat C#. Dua method ini menghemat baris kode yang selalu muncul di setiap proyek:

public static class UnityExtensions
{
    public static Vector3 WithY(this Vector3 v, float y)
    {
        return new Vector3(v.x, y, v.z);
    }

    public static void DestroyChildren(this Transform parent)
    {
        foreach (Transform child in parent)
        {
            Object.Destroy(child.gameObject);
        }
    }
}
// di script mana pun
transform.position = transform.position.WithY(0.5f);
inventoryPanel.DestroyChildren();

Ada tiga hal yang membuat sebuah extension method: class static yang tidak bersarang dan bukan generic, method static, serta this sebelum parameter pertama. Parameter itu adalah nilai di sebelah kiri titik, jadi transform.position.WithY(0.5f) dikompilasi menjadi UnityExtensions.WithY(transform.position, 0.5f). Vector3 adalah struct, jadi v merupakan salinan: WithY tidak dapat mengubah vector milik pemanggil dan justru mengembalikan vector baru. Cara ini juga mengatasi masalah pada transform.position.y = 0.5f;, yang tidak dapat dikompilasi.

Class static ini bukan MonoBehaviour. Class ini berada dalam file .cs tersendiri, namanya bebas, dan tidak pernah dipasang pada object. Method yang diwarisi MonoBehaviour, seperti Destroy, perlu menyebutkan class-nya di sini: Object.Destroy. Menghancurkan child di dalam foreach aman, karena Unity baru menghapusnya pada akhir frame.

challenge icon

Tantangan

Sedang

Seekor burung hantu di atas tiang tinggi mengawasi halaman. Panah-panah menggerakkan Player (siap). Tambahkan dua method ekstensi ke proyek dan gunakan keduanya pada burung hantu:

  • Di FlatExtensions.cs, tulis class statis FlatExtensions.
  • FlatDistance memperluas Vector3: a.FlatDistance(b) mengembalikan jarak dari a ke b di permukaan tanah, tanpa memperhitungkan perbedaan ketinggian. Dari (0, 5, 0) ke (3, 0, 4), jaraknya 5.
  • FaceFlat memperluas Transform: t.FaceFlat(target) memutar t agar menghadap target hanya pada sumbu y, sehingga tetap tegak setinggi atau serendah apa pun targetnya.
  • Di Owl.cs, setiap frame, burung hantu menghadap pemain dengan FaceFlat, dan eyes-nya menyala saat pemain berada lebih dekat daripada sight (3) jika diukur di permukaan tanah, dan mati jika tidak. Burung hantu bertengger tinggi di tiangnya, jadi gunakan cara selain Vector3.Distance.

Tekan Mainkan, berjalanlah mengitari tiang dan melewati bawah burung hantu, lalu tekan Periksa.

Coba sendiri

using UnityEngine;

// FlatExtensions: FlatDistance dan FaceFlat
quiz iconUji dirimu

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

Semua pelajaran di Arsitektur Game di Unity