1. Kasih Gambaran luasnya dulu deh, masih ga paham
  2. Langsung Bikin script aja ya?
    1. Dipisah menjadi 2 Script
    2. Digabung jadi 1 Script
  3. Udah nih, sekarang bikin triggernya kan?
  4. Implementasinya gimana nih?

Pernah ga sih kalian sebel dengan workflow yang lama? Misal kalian pengen menata gameobject yang berantakan jadi rapi. Contoh lah kita pake asset Kenney nih, download aja disini

Kenney Assets

Kalau kalian import di unity dan drag ke scene, hasilnya seperti ini nih

Berantakan

Kan, ga rapi, iya ga? Dia hanya ada di satu tempat aja, ga nyebar rapi gitu… Kalian mau ngerapiin kah? Kalau penulis sih males, hahaha

Kasih Gambaran luasnya dulu deh, masih ga paham

Okay, kalian harus tau dulu nih, tentang Editor Scripting. Kalian kalau bikin script, kan biasanya otomatis ada ini kan

1
using UnityEngine;

Iya kan? nah itu gunanya untuk bikin game ya… MonoBehaviour ya dari namespace UnityEngine itu. Makanya kalian bisa pake Update, Start, OnTriggerEnter dan lainnya ya karena UnityEngine ini. Termasuk bisa memasang script di GameObject ya karena ini.

Nah kalau untuk Editor Scripting itu kita harus tambahin ini

1
using UnityEditor;

Jadi kalau mau ngembangin Unity Editornya buat mempermudah pembuatan game, UnityEditor lah yang dapat membantu kalian.

Langsung Bikin script aja ya?

Yap, langsung aja bikin scriptnya. Eitss, untuk membuat editor script ada 2 cara, yang pertama caranya dipisah 2 script, yang kedua 1 script tapi pakai symbol.

Dipisah menjadi 2 Script

Cara 2 script merupakan cara yang sering digunakan oleh developer, ini mungkin standartnya sih. Jadi ada 1 script yang nanti derivednya itu MonoBehaviour, dan satu lagi yang derived nya Editor. Script yang derived nya Editor, harus masuk ke dalam folder dengan nama Editor.

Digabung jadi 1 Script

Cara ini bisa digunakan kalau isi scriptnya masih simple, seperti tutorial kali ini. Kalau kompleks, saya rekomendasi pake 2 file saja. Jadi untuk tutorial ini, saya gabung jadi 1 file saja. Scriptnya harus diluar folder Editor dan class yang derivednya Editor harus dikasih symbol UNITY_EDITOR. Kalau tidak kalian beri symbol, saya jamin game kalian ga bakal bisa dibuild / compile. Anggapannya sih, UnityEditor ga dikenali compiler ketika proses build.

Kita pake cara yang digabung jadi 1 script ya. Langsung aja buat script, namanya ArrangeGameObject.cs. Sekarang kita buka scriptnya, ubah seperti berikut

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
#endif
public class ArrangeGameObject : MonoBehaviour
{
}
#if UNITY_EDITOR
public class ArrangeGameObjectEditor : Editor
{
}
#endif

Oke kita bahas satu-satu.

#if UNITY_EDITOR dan #endif
Ini digunakan untuk membatasi kode untuk editor saja. Jadi bakal aman ketika kita export.

class yang “derived” dari Editor
Nah bagi kalian nih yang baru aja kenal Editor Scripting, “derived” classnya bisa pake Editor nih. Ini bisa untuk ngakses kita ke inspector nantinya, jadi kita bisa tuh modifikasi inspectornya. Niatnya nanti bakal ada satu tombol, ketika diklik akan menata semua gameobjectnya.

Udah paham? Lanjut dulu dengan nambah koding, didalam class ArrangeGameObject, kalian buat 2 variable untuk menentukan gridnya sama lebarnya. Kalau mau ngerapihin kan harus ada aturannya kan? Grid ini untuk mengatur penempatan GameObjectnya, widthnya untuk pindah linenya, gitu. Jadi langsung aja tambahin ini

1
2
public Vector2 grid = Vector2.one * 2;
public int width = 10;

Kalian bisa atur aja valuenya, sesuai kebutuhan kalian sih.

Udah nih, sekarang bikin triggernya kan?

Triggernya bisa pakai button, jadi ketika kita tekan tombolnya, nanti langsung otomatis ngatur posisi GameObjectnya sesuai dengan gridnya. Aturannya gini, scriptnya nanti dipasang di suatu GameObject, yang mana mempunyai banyak child. Child ini nanti bakal kita atur secara otomatis sesuai grid. Paham ya? Sekarang tambahkan script berikut di class ArrangeGameObjectEditor

1
2
3
4
5
6
ArrangeGameObject ago;
private void OnEnable()
{
ago = (ArrangeGameObject)target;
}

Saya jelasin bentar nih. ArrangeGameObject ago ini merupakan jembatan untuk komunikasi. Masih ingat kan kita punya variable Vector2 grid? Untuk komunikasinya, kita butuh ArrangeGameObject. Untuk mengisi variable ago, kita gunakan OnEnable, diisi dengan target, yang mana bisa kita cast ke ArrangeGameObject.

Setelah itu, kita tambahkan kode berikut

1
2
3
4
5
6
7
8
9
10
11
public override void OnInspectorGUI()
{
base.OnInspectorGUI();
if (GUILayout.Button("Arrange Childs"))
{
for(int i = 0; i < ago.transform.childCount; i++)
{
ago.transform.GetChild(i).localPosition = new Vector3((i % ago.width) * ago.grid.x, 0, (i / ago.width) * ago.grid.y);
}
}
}

OnInspectorGUI merupakan fungsi untuk memodifikasi tampilan Inspector pada unity. base.OnInspectorGUI itu pemanggilan default tampilan inspector. Kalau tidak dipanggil, default inspector ga akan tampil. Biasanya tidak dipanggil ketika kita mau ubah semua tampilan inspectornya. if(GUILayout.Button("Arrange Childs")) untuk menampilkan button dan kalau ditekan tombolnya akan mengembalikan nilai true. Didalam kondisi button, merupakan koding untuk menata posisi GameObjectnya.

Implementasinya gimana nih?

Di unity, kita bikin satu Empty GameObject, ubah namanya menjadi ArrangeGO. Pilih semua GameObject yang akan kita atur posisinya sesuai grid, masukin ke ArrangeGO tadi. Jadinya kayak gini nanti,

Implementasi

Tambahkan script tadi ArrangeGameObject.cs ke Empty GameObject yang mana parent dari banyak GameObject tadi.

Implementasi

Tekan aja tombol “Arrange Childs”, hasilnya nanti kurang lebih seperti ini.

Implementasi

Hasilnya bakal otomatis rapi kan? Sesuai sama grid dan width nya. Tapi kalau penulis lihat nih, masih terlalu berdempetan antara satu dan lainnya. Saya ubah gridnya menjadi (4, 4), terus saya arrange sekali lagi, hasilnya seperti ini

Implementasi

Nah, kalau ini sudah rapi nih. Kalau sudah kayak gini, tinggal level design aja, hehehe. Script lengkapnya ada disitu. Awkay, jadi seperti itu ya, Matur Thank you…