[Unity] Menyimpan Variabel sebagai GameObject vs. sebagai Transform
Published: 2023-04-13 15:04:44


![Cuplikan Tutorial dari Saluran Youtube Code Monkey](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h3cuaarcaw82337igzyb.png)

Dilema penentuan tipe data saat mendeklarasikan suatu variabel merupakan hal yang lumrah terjadi terutama bagi pemrogram-pemrogram awam seperti saya. Hal ini juga terjadi saat saya menonton tutorial pembuatan [sistem _shop_ sederhana pada Unity](https://www.youtube.com/watch?v=HuXy4XX0hzg&t=921s) oleh [Code Monkey](https://www.youtube.com/@CodeMonkeyUnity). 

Selama ini, saya selalu menyimpan _game object_ dengan tipe `GameObject`. Pada tutorial tersebut, narasumber menggunakan `Transform` untuk menyimpan _game object_ _container_ dan _template_ untuk _shop item_-nya, yang tertera pada cuplikan kode berikut.

```c#
public class UI_Shop : MonoBehaviour {
    private Transform container;
    private Transform shopItemTemplate;
    
    ...
}
```

Saat berselancar di internet, rasanya seperti tidak ada perbedaan yang signifikan antara penggunaan `Transform` dan `GameObject`, namun setelah merenung beberapa saat, saya menemukan alasan di balik penggunaan `Transform` tersebut, dan mungkin dapat menyimpulkan kapan penggunaan `Transform` lebih baik dibandingkan harus menyimpan sebagai `GameObject`.

## 1. Lebih Sering Mengakses Anak dari Objek yang Disimpan
Untuk mengakses anak dari suatu _game object_, Unity telah menyediakan _method_ `Transform.Find`, sedangkan _method_ `GameObject.Find` sendiri digunakan untuk mencari _game object_ tertentu di _scene_ tersebut. Dengan begitu, penggunaan `Transform` lebih efisien dibandingkan `GameObject` pada kasus ini.

Hal ini menjelaskan pemilihan `Transform` pada variabel `container` pada cuplikan gambar di atas, di mana `container` digunakan untuk mengakses anaknya yang kemudian disimpan pada variabel `shopItemTemplate`.

## 2. Lebih Sering Mengakses atau Mengubah Aspek _Transform_ pada _Game Object_
Pada kasus ini, jelas bahwa penggunaan `Transform` lebih menguntungkan daripada `GameObject`. Dengan menggunakan `GameObject`, ada cukup banyak waktu yang digunakan untuk memanggil `GameObject.transform`, ditambah kode yang tidak lebih rumit dibaca dibandingkan langsung mereferensikan variabel sebagai `Transform`.

## 3. Preferensi dan Konvensi
Sebenarnya, ada hal yang lebih penting dibandingkan keberjalanan kode yang sangat efisien dari segi waktu dan memori. Hal tersebut ialah _maintainability_. Untuk membuat kode yang mudah di-_maintain_, diperlukan sebuah konvensi/kesepakatan antar pemrogram. Hal ini dikarenakan setiap pemrogram memiliki preferensi yang berbeda-beda, sehingga harus ada satu ketentuan dalam sebuah projek agar kode yang dibuat mudah di-_maintain_. Hal ini yang (sepertinya) menjadi alasan utama penggunaan referensi `GameObject` atau `Transform` ketika menyimpan sebuah data _game object_.

### Referensi
[Simple Shop in Unity -- Code Monkey](https://www.youtube.com/watch?v=HuXy4XX0hzg&t=921s)
[Instantiate as GameObject vs Transform -- StackOverflow](https://stackoverflow.com/questions/68727547/differences-between-instantiate-as-gameobject-and-instantiate-as-transform)
[Find Child GameObject -- StackOverFlow](https://stackoverflow.com/questions/25763587/how-can-i-find-child-gameobject)
[Transform vs GameObject -- Unity Forum](https://answers.unity.com/questions/627091/transform-vs-gameobject.html)
[Transform.Find](https://docs.unity3d.com/ScriptReference/Transform.Find.html)
[GameObject.Find](https://docs.unity3d.com/ScriptReference/GameObject.Find.html)