Kelas GameObject Unity digunakan untuk mewakili apa pun yang dapat ada dalam SceneA Scene contains the environments and menus of your game. Think of each unique Scene file as a unique level. In each Scene, you place your environments, obstacles, and decorations, essentially designing and building your game in pieces. More info
See in Glossary.
Halaman ini berkaitan dengan kelas GameObject Unity. Untuk belajar tentang menggunakan GameObjects di Adegan dan Hierarchy di Editor Unity, lihat scripting. Untuk referensi knalpot dari setiap anggota kelas GameObject, lihat Bagian GameObjects dari manual pengguna.Login Referensi skrip objek.
GameObjects adalah blok bangunan untuk adegan di Unity, dan bertindak sebagai wadah untuk komponen fungsional yang menentukan bagaimana tampilan GameObject, dan apa yang dilakukan GameObject.
Dalam scripting, Kelas GameObject menyediakan koleksi metode yang memungkinkan Anda untuk bekerja dengan mereka dalam kode Anda, termasuk menemukan, membuat koneksi dan mengirim pesan antara GameObjects, serta menambahkan atau menghapus komponen yang melekat pada GameObject, dan menetapkan nilai yang berkaitan dengan status mereka dalam adegan.
Ada sejumlah properti yang dapat Anda ubah melalui script yang berkaitan dengan status GameObject di tempat kejadian. Ini biasanya sesuai dengan kontrol yang terlihat di dekat bagian atas inspectorJendela Unity yang menampilkan informasi tentang Pengaturan GameObject yang dipilih saat ini, aset atau proyek, memungkinkan Anda untuk memeriksa dan mengedit nilai. More info
Lihat di Glossary ketika Anda memiliki GameObject yang dipilih di Editor.
Mereka tidak berhubungan dengan komponen tertentu, dan terlihat dalam inspektur GameObject di bagian atas, di atas daftar komponen.
Semua GameObjects berbagi satu set kontrol di bagian atas inspektur yang berkaitan dengan status GameObject dalam adegan, dan ini dapat dikontrol melalui API scripting GameObject.
Jika Anda ingin daftar cepat dari semua API yang tersedia untuk kelas GameObject, lihat .
GameObjects aktif secara default, tetapi dapat dinonaktifkan, yang mematikan semua komponen yang melekat pada GameObject. Ini umumnya berarti akan menjadi tak terlihat, dan tidak menerima panggilan atau peristiwa normal seperti Update
atau FixedUpdate
.
Status active GameObject diwakili oleh kotak centang ke kiri nama GameObject. Anda dapat mengontrol ini menggunakan GameObject.SetActive
.
Anda juga dapat membaca keadaan aktif saat ini menggunakan GameObject.activeSelf
, dan apakah atau bukan GameObject sebenarnya aktif dalam adegan menggunakan GameObject.activeInHierarchy
. Yang terakhir dari kedua ini diperlukan karena apakah GameObject sebenarnya aktif ditentukan oleh keadaan aktifnya sendiri, ditambah keadaan aktif semua orang tuanya. Jika orang tua tidak aktif, maka tidak akan aktif meskipun pengaturan aktifnya sendiri.
Beberapa sistem Unity, seperti Global IlluminationKelompok teknik yang model pencahayaan langsung dan tidak langsung untuk memberikan hasil pencahayaan yang realistis.
Lihat di Glossary, Occlusion, Batching, Navigasi, dan Reflection ProbesKomponen rendering yang menangkap pandangan bulat dari sekitarnya di semua arah, seperti kamera. Gambar yang ditangkap kemudian disimpan sebagai kubus yang dapat digunakan oleh benda dengan bahan reflektif. More info
Lihat di Glossary, bergantung pada status statis dari GameObject. Anda dapat mengontrol sistem Unity mempertimbangkan GameObject menjadi static dengan menggunakan GameObjectUtility.SetStaticEditorFlags
. Baca lebih lanjut tentang .
Tags menyediakan cara menandai dan mengidentifikasi jenis GameObject dalam adegan Anda dan Layers memberikan cara yang mirip tetapi berbeda termasuk atau tidak termasuk kelompok GameObjects dari tindakan bawaan tertentu, seperti rendering atau tabrakan fisika.
Untuk informasi lebih lanjut tentang cara menggunakan Tag dan Lapisan di editor, lihat halaman manual pengguna utama untuk TagsKata referensi yang dapat Anda berikan kepada satu atau lebih GameObjects untuk membantu Anda mengidentifikasi GameObjects untuk tujuan scripting. Misalnya, Anda mungkin mendefinisikan dan “Edible” Tag untuk setiap item pemain dapat makan dalam permainan Anda. More info
Lihat di Glossary dan LayersLapisan dalam Unity dapat digunakan untuk memilih kelompok GameObjects secara selektif atau keluar dari proses atau perhitungan tertentu. Ini termasuk rendering kamera, pencahayaan, tabrakan fisika, atau perhitungan kustom dalam kode Anda sendiri. More info
Lihat di Glossary.
Anda dapat memodifikasi nilai tag dan layer melalui script menggunakan sifat GameObject.tag
dan GameObject.layer
. Anda juga dapat memeriksa tag GameObject efisien dengan menggunakan metode CompareTag
, yang mencakup validasi apakah tag ada, dan tidak menyebabkan alokasi memori.
Anda dapat menambahkan atau menghapus komponen pada runtime, yang dapat berguna untuk secara procedurally menciptakan GameObjects, atau memodifikasi bagaimana GameObject berperilaku. Catatan, Anda juga dapat komponen skrip enable
atau disable
, dan beberapa jenis komponen bawaan, melalui skrip tanpa menghancurkannya.
Cara terbaik untuk menambahkan komponen pada runtime adalah menggunakan AddComponent<Type>
, menentukan jenis komponen dalam kurung sudut seperti yang ditunjukkan. Untuk menghapus komponen, Anda harus menggunakan metode Object.Destroy
pada komponen itu sendiri.
Kasus paling sederhana adalah di mana skrip di GameObject perlu mengakses Komponen lain yang melekat pada GameObject yang sama (anggota, skrip lain melekat pada GameObject juga Komponen sendiri). Untuk melakukan ini, langkah pertama adalah untuk mendapatkan referensi ke instance Komponen yang ingin Anda kerjakan. Ini dilakukan dengan metode GetComponent. Biasanya, Anda ingin menetapkan objek Komponen ke variabel, yang dilakukan dalam menggunakan kode berikut. Dalam contoh ini script mendapatkan referensi ke komponen RigidbodyKomponen yang memungkinkan GameObject untuk dipengaruhi oleh gravitasi simulasi dan kekuatan lainnya. More info
Lihat di Glossary pada GameObject yang sama:
void Start ()
{
Rigidbody rb = GetComponent<Rigidbody>();
}
Setelah Anda memiliki referensi ke instance Komponen, Anda dapat mengatur nilai-nilai sifatnya sebanyak yang Anda inginkan dalam Inspektur:
void Start ()
{
Rigidbody rb = GetComponent<Rigidbody>();
// Change the mass of the object's Rigidbody.
rb.mass = 10f;
}
Anda juga dapat memanggil metode pada referensi Komponen, misalnya:
void Start ()
{
Rigidbody rb = GetComponent<Rigidbody>();
// Add a force to the Rigidbody.
rb.AddForce(Vector3.up * 10f);
}
Catatan: Anda dapat memiliki beberapa scriptsSepotong kode yang memungkinkan Anda untuk membuat Komponen Anda sendiri, memicu peristiwa permainan, memodifikasi sifat komponen dari waktu ke waktu dan menanggapi input pengguna dengan cara apa pun yang Anda sukai. More info
Lihat di Glossary kustom yang melekat pada GameObject yang sama. Jika Anda perlu mengakses satu skrip dari yang lain, Anda dapat menggunakan GetComponent seperti biasa dan hanya menggunakan nama kelas skrip (atau nama file) untuk menentukan jenis Komponen yang Anda inginkan.
Jika Anda mencoba untuk mengambil jenis Komponen yang belum benar-benar ditambahkan ke GameObject kemudian GetComponent akan mengembalikan null; Anda akan mendapatkan kesalahan referensi null pada runtime jika Anda mencoba mengubah nilai pada objek null.
Meskipun kadang-kadang beroperasi dalam isolasi, itu umum untuk skrip untuk melacak GameObjects lain, atau lebih umum, komponen pada GameObjects lainnya. Misalnya, dalam permainan memasak, koki mungkin perlu tahu posisi kompor. Unity menyediakan sejumlah cara yang berbeda untuk mengambil benda lain, masing-masing sesuai dengan situasi tertentu.
Cara paling mudah untuk menemukan GameObject terkait adalah untuk menambahkan variabel GameObject publik ke script:
public class Chef : MonoBehaviour
{
public GameObject stove;
// Other variables and functions...
}
Variabel ini akan terlihat di Inspektur, sebagai GameObject field.
Anda sekarang dapat menyeret objek dari adegan atau panel Hierarchy ke variabel ini untuk menetapkannya.
Fungsi GetComponent dan variabel akses Komponen tersedia untuk objek ini seperti yang lain, sehingga Anda dapat menggunakan kode seperti berikut:
public class Chef : MonoBehaviour {
public GameObject stove;
void Start() {
// Start the chef 2 units in front of the stove.
transform.position = stove.transform.position + Vector3.forward * 2f;
}
}
Selain itu, jika Anda menyatakan variabel publik dari jenis Komponen di script Anda, Anda dapat menyeret GameObject yang memiliki Komponen yang melekat padanya. Ini mengakses Komponen secara langsung daripada GameObject sendiri.
public Transform playerTransform;
Menghubungkan objek bersama dengan variabel yang paling berguna ketika Anda berurusan dengan objek individu yang memiliki koneksi permanen. Anda dapat menggunakan variabel array untuk menghubungkan beberapa objek dari jenis yang sama, tetapi koneksi harus tetap dibuat dalam editor Unity daripada saat runtime. Hal ini seringkali nyaman untuk menemukan objek pada runtime dan Unity menyediakan dua cara dasar untuk melakukan ini, seperti yang dijelaskan di bawah ini.
Kadang-kadang, adegan permainan menggunakan sejumlah GameObjects dari jenis yang sama, seperti koleksi, waypoints dan rintangan. Ini mungkin perlu dilacak oleh skrip tertentu yang mengawasi atau bereaksi terhadap mereka (misalnya, semua waypoints mungkin perlu tersedia untuk skrip jalan). Menggunakan variabel untuk menghubungkan GameObjects ini adalah kemungkinan tetapi membuat proses desain membosankan jika setiap waypoint baru harus seret ke variabel pada skrip. Demikian juga, jika waypoint dihapus, maka itu adalah nuansa untuk harus menghapus referensi variabel ke GameObject yang hilang. Dalam kasus seperti ini, seringkali lebih baik untuk mengelola satu set GameObjects dengan membuat mereka semua anak-anak dari satu orang tua GameObject. GameObjects anak dapat diambil menggunakan Transform componentKomponen Transform menentukan Posisi, Rotasi, dan Skala setiap objek di tempat kejadian. Setiap GameObject memiliki Transform. More info
Lihat di Glossary induk (karena semua GameObjects implicitly memiliki Transform):
using UnityEngine;
public class WaypointManager : MonoBehaviour {
public Transform[] waypoints;
void Start()
{
waypoints = new Transform[transform.childCount];
int i = 0;
foreach (Transform t in transform)
{
waypoints[i++] = t;
}
}
}
Anda juga dapat menemukan objek anak tertentu dengan nama menggunakan metode Login Login: transform.Find("Frying Pan");
Ini dapat berguna ketika GameObject memiliki anak GameObject yang dapat ditambahkan dan dihapus selama gameplay. Alat atau utensil yang dapat diambil dan turun selama gameplay adalah contoh yang baik dari ini.
Meskipun mengedit proyek Anda dapat mengatur referensi antara GameObjects di Inspektur. Namun, kadang-kadang tidak mungkin untuk mengatur ini di muka (misalnya, menemukan item terdekat untuk karakter dalam permainan Anda, atau membuat referensi ke GameObjects yang di sesaat setelah Adegan dimuat). Dalam kasus ini, Anda dapat menemukan referensi dan mengirim pesan antara GameObjects pada runtime.
BroadcastMessage
memungkinkan Anda untuk mengirim panggilan ke metode bernama, tanpa spesifik di mana metode itu harus diterapkan. Anda dapat menggunakannya untuk memanggil metode bernama di setiap MonoBehaviour pada GameObject tertentu atau anak-anaknya. Anda dapat memilih untuk menegakkan bahwa harus setidaknya satu penerima (atau kesalahan yang dihasilkan).
SendMessage
adalah sedikit lebih spesifik, dan hanya mengirim panggilan ke metode bernama di GameObject sendiri, dan bukan anak-anaknya.
SendMessageUpwards
mirip, tetapi mengirim panggilan ke metode bernama di GameObject dan semua parents.
Selalu mungkin untuk menemukan GameObjects di mana saja di hierarki Adegan selama Anda memiliki beberapa informasi untuk mengidentifikasi mereka. Objek individu dapat diambil berdasarkan nama menggunakan fungsi Login Login:
GameObject player;
void Start()
{
player = GameObject.Find("MainHeroCharacter");
}
Sebuah objek atau koleksi objek juga dapat terletak dengan tag mereka menggunakan metode GameObject.FindWithTag dan GameObject.FindGameObjectsWithTag.
Sebagai contoh, dalam permainan memasak dengan satu karakter koki, dan beberapa kompor di dapur (masing-masing tag “Stove”):
GameObject chef;
GameObject[] stoves;
void Start()
{
chef = GameObject.FindWithTag("Chef");
stoves = GameObject.FindGameObjectsWithTag("Stove");
}
Anda dapat membuat dan menghancurkan GameObjects sementara proyek Anda berjalan. Pada Unity, GameObject dapat dibuat menggunakan metode Instantiate yang membuat salinan baru dari objek yang ada.
Untuk deskripsi dan contoh lengkap tentang cara memutupkan GameObjects, lihat Prefab Instantiating di Runtime.
Ada juga metode Destroy yang akan menghancurkan objek setelah pembaruan bingkai selesai atau opsional setelah penundaan waktu singkat:
void OnCollisionEnter(Collision otherObj) {
if (otherObj.gameObject.tag == "Garbage can") {
Destroy(gameObject, 0.5f);
}
}
Perhatikan bahwa fungsi Destroy dapat menghancurkan komponen individu tanpa mempengaruhi GameObject sendiri. Kesalahan umum adalah menulis ini, asumsi itu akan menghancurkan GameObject script itu melekat pada...
Destroy(this);
... Sedangkan, karena “ini” mewakili skrip, dan bukan GameObject, sebenarnya akan menghancurkan komponen skrip yang menyebutnya, meninggalkan GameObject di belakang, dengan komponen skrip dihapus.
Kelas GameObject menawarkan alternatif berbasis skrip ke opsi yang tersedia dalam menu GameObject Unity yang memungkinkan Anda untuk membuat objek primitif.
Untuk membuat instance dari primitif bawaan Unity, gunakan GameObject.CreatePrimitive, yang meluruskan primitif jenis yang Anda tentukan. Jenis primitif yang tersedia adalah Sphere, Capsule, Cylinder, Cube, Plane dan QuadObjek primitif yang menyerupai pesawat tetapi tepinya hanya satu unit panjang, hanya menggunakan 4 simpul, dan permukaan berorientasi pada pesawat XY ruang koordinat lokal. More info
Lihat di Glossary.