Variabel dan Inspektur
Order eksekusi untuk fungsi acara

Instantiating Prefabs pada waktu berjalan

Jenis aset yang memungkinkan Anda untuk menyimpan GameObject lengkap dengan komponen dan properti. Prefab bertindak sebagai template dari mana Anda dapat membuat instance objek baru di tempat kejadian. More info
Lihat di Glossary
datang dalam sangat berguna ketika Anda ingin meluruskan GameObjectsObjek mendasar dalam adegan Unity, yang dapat mewakili karakter, props, pemandangan, kamera, waypoints, dan banyak lagi. Fungsi GameObject didefinisikan oleh Komponen yang melekat padanya. More info
Lihat di Glossary
rumit atau koleksi GameObjects pada waktu lari. Dibandingkan dengan membuat GameObjects dari awal menggunakan kode, mengulangi Prefab menggunakan kode memiliki banyak keuntungan karena Anda dapat:

  • Instantiate a Prefab menggunakan satu baris kode. Membuat GameObjects setara dari awal membutuhkan banyak garis kode.

  • Mengatur, menguji, dan memodifikasi Prefab dengan cepat dan mudah menggunakan 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
    view, Hierarchy
    dan InspectorA Unity window that displays information about the currently selected GameObject, asset or project settings, allowing you to inspect and edit the values. More info
    See in Glossary
    .

  • Mengubah yang Prefab sesaat tanpa mengubah kode. Anda dapat membuat roket sederhana menjadi roket super-charged, tanpa perubahan kode.

Note: Anda dapat mengunduh Proyek Unity yang berisi semua contoh di halaman ini, di sini:

InstantiatingPrefabsExamples.zip

Dasar-dasar instansi Prefab

Untuk meluruskan Prefab pada waktu yang berjalan, kode Anda perlu referensi ke Prefab itu. Anda dapat membuat referensi ini dengan membuat variabel publik dalam kode Anda untuk menahan referensi Prefab. Variabel publik dalam kode Anda muncul sebagai bidang yang dapat ditetapkan dalam Inspektur. Anda kemudian dapat menetapkan Prefab sebenarnya yang ingin Anda gunakan di Inspektur.

Contoh skrip di bawah ini memiliki variabel publik tunggal, “myPrefab”, yang merupakan referensi untuk Prefab. Ini menciptakan kasus yang Prefab dalam metode Start().

using UnityEngine;
public class InstantiationExample : MonoBehaviour 
{
    // Reference to the Prefab. Drag a Prefab into this field in the Inspector.
    public GameObject myPrefab;

    // This script will simply instantiate the Prefab when the game starts.
    void Start()
    {
        // Instantiate at position (0, 0, 0) and zero rotation.
        Instantiate(myPrefab, new Vector3(0, 0, 0), Quaternion.identity);
    }
}

Untuk menggunakan contoh ini:

  • Buat skrip C# baru di Proyek Anda, dan nama "InstantiationExample".

  • Copy dan paste dalam contoh skrip di atas ke skrip baru Anda, dan menyimpannya.

  • Buat GameObject kosong menggunakan menu GameObject > Create Empty.

  • Tambahkan script ke GameObject baru sebagai komponen dengan menyeretnya ke GameObject kosong.

  • Buat setiap Prefab, dan tarik dari Project windowA window that shows the contents of your Assets folder (Project tab) More info
    See in Glossary
    ke bidang My Prefab dalam komponen skrip.

Dragging a Prefab from the Project window into the My Prefab field in the script component
Menyeret Prefab dari jendela Proyek ke bidang Prefab Saya di komponen skrip

Ketika Anda mulai Play Mode, Anda harus melihat prasarana Prefab Anda pada posisi (0, 0, 0) di Adegan.

Anda dapat menyeret Prefab yang berbeda ke bidang My Prefab dalam Inspektur untuk mengubah yang Prefab disaatkan, tanpa harus mengubah skrip.

Karena contoh pertama ini sangat sederhana, tampaknya tidak memberikan keuntungan hanya menempatkan Prefab ke dalam Adegan diri. Namun, mampu meluruskan Prefab menggunakan kode memberikan Anda kemampuan kuat untuk secara dinamis membuat konfigurasi yang kompleks dari GameObjects sementara permainan atau aplikasi Anda berjalan, seperti yang ditunjukkan dalam contoh berikut.

skenario umum

Untuk mengilustrasikan kekuatan memimpin instan pada waktu yang berjalan, berikut adalah beberapa situasi dasar di mana mereka berguna:

  • Membangun struktur dari satu Prefab dengan meniru beberapa kali dalam posisi yang berbeda, misalnya dalam pembentukan grid atau lingkaran.

  • Mendirikan Prefab proyektif dari peluncur. Prefab proyektil bisa menjadi konfigurasi kompleks yang mengandung MeshThe main graphics primitive of Unity. Meshes make up a large part of your 3D worlds. Unity supports triangulated or Quadrangulated polygon meshes. Nurbs, Nurms, Subdiv surfaces must be converted to polygons. More info
    See in Glossary
    , RigidbodyA component that allows a GameObject to be affected by simulated gravity and other forces. More info
    See in Glossary
    , ColliderAn invisible shape that is used to handle physical collisions for an object. A collider doesn’t need to be exactly the same shape as the object’s mesh - a rough approximation is often more efficient and indistinguishable in gameplay. More info
    See in Glossary
    , AudioSource, Dynamic Light, dan anak GameObject dengan jejaknya sendiri Particle SystemA component that simulates fluid entities such as liquids, clouds and flames by generating and animating large numbers of small 2D images in the scene. More info
    See in Glossary
    .

  • Sebuah kendaraan, bangunan atau karakter, misalnya robot, melanggar terpisah ke banyak potongan. Dalam skenario ini, contoh script menghapus dan menggantikan yang lengkap, robot operasional Prefab dengan robot wrecked Prefab. Prefab wrecked ini terdiri dari bagian yang rusak terpisah dari robot, masing-masing set up dengan kakubodies dan sistem partikel mereka sendiri. Teknik ini memungkinkan Anda untuk meniup robot ke banyak potongan, hanya dengan satu baris kode, yang menggantikan GameObject asli dengan Prefab wrecked.

Bagian berikut menunjukkan cara menerapkan skenario ini.

Membangun struktur

Anda dapat menggunakan kode untuk membuat banyak salinan Prefab dalam konfigurasi tertentu hampir sesaat. Menggunakan kode untuk menghasilkan struktur seperti ini disebut generasi prosedural. Contoh di bawah ini menciptakan dinding instance blok.

Untuk mencoba contoh ini, buat skrip di bawah ini, nama Wall, dan letakkan di GameObject kosong di Adegan Anda.

using UnityEngine;
public class Wall : MonoBehaviour
{
   public GameObject block;
   public int width = 10;
   public int height = 4;
  
   void Start()
   {
       for (int y=0; y<height; ++y)
       {
           for (int x=0; x<width; ++x)
           {
               Instantiate(block, new Vector3(x,y,0), Quaternion.identity);
           }
       }       
   }
}

Ketika Anda telah melakukan ini, Anda harus melihat variabel Block di Inspektur, dengan kata None di lapangan. Nilai "None" berarti bahwa tidak ada Prefab telah ditugaskan ke variabel ini.

The Block variable, with no Prefab assigned yet
Variabel Block, tanpa Prefab ditugaskan namun

Skrip contoh di atas tidak akan bekerja sampai Anda menetapkan variabel Prefab ke Block. Untuk membuat blok sederhana Prefab:

  1. Pilih GameObject > 3D Object > Cube.

  2. Seret kubus dari Hierarchy window into Assets folder di Project window. Ini menciptakan Aset Prefab.

  3. Nama kembali Prefab Anda untuk "Block".

  4. Sekarang bahwa Prefab Block Anda ada sebagai Aset, Anda dapat dengan aman menghapus kubus dari Hierarchy Anda.

Sekarang Anda telah membuat Blok Prefab, Anda dapat menetapkannya ke variabel Block. Pilih GameObject asli Anda (yang satu dengan skrip "Wall" yang melekat padanya). Kemudian drag the “Block” Prefab dari Project window ke dalam “Block” variabel slot (di mana ia mengatakan “None”).

The Block variable, with the Block Prefab assigned to it
Variabel Block, dengan Blok Prefab ditugaskan untuk itu

Ketika Anda telah menyelesaikan set-up ini, klik Play dan Anda akan melihat bahwa Unity membangun dinding menggunakan Prefab:

A wall built from 4 rows of 10 blocks, as generated by the example above.
Dinding yang dibangun dari 4 baris 10 blok, seperti yang dihasilkan oleh contoh di atas.

Ini adalah pola alur kerja yang fleksibel yang dapat Anda gunakan di Unity. Karena Anda menggunakan Prefab dalam skrip ini, Anda dapat dengan mudah mengganti atau mengedit Prefab untuk memodifikasi sifat batu bata di dinding, tanpa perlu menyentuh skrip. Anda juga dapat menggunakan skrip Wall Anda di GameObjects lain di Adegan Anda dengan Prefab yang berbeda ditugaskan untuk mereka memiliki berbagai dinding yang terbuat dari berbagai jenis Prefab.

Anda dapat menggunakan kode untuk menempatkan GameObject di grid, dalam pola lingkaran, secara acak tersebar, atau konfigurasi lain yang dapat Anda pikirkan untuk menyesuaikan permainan atau aplikasi apa pun yang Anda buat. Berikut ini contoh lain yang menunjukkan bagaimana menempatkan instance dalam formasi melingkar:

using UnityEngine;
public class CircleFormation : MonoBehaviour
{
   // Instantiates prefabs in a circle formation
   public GameObject prefab;
   public int numberOfObjects = 20;
   public float radius = 5f;
   void Start()
   {
       for (int i = 0; i < numberOfObjects; i++)
       {
           float angle = i * Mathf.PI * 2 / numberOfObjects;
           float x = Mathf.Cos(angle) * radius;
           float z = Mathf.Sin(angle) * radius;
           Vector3 pos = transform.position + new Vector3(x, 0, z);
           float angleDegrees = -angle*Mathf.Rad2Deg;
           Quaternion rot = Quaternion.Euler(0, angleDegrees, 0);
           Instantiate(prefab, pos, rot);
       }
   }
}
A circular arrangement of blocks, as generated by the example above
Pengaturan melingkar blok, seperti yang dihasilkan oleh contoh di atas

Proyektil & ledakan yang Instantiating

Dalam skenario ini:

  1. Sebuah "Launcher" GameObject instaniasi Prefab proyektil ketika pemain menekan tombol api. Prefab mengandung mesh, kaku, dan kolider, sehingga dapat terbang melalui udara dan mendeteksi ketika collisiontabrakan terjadi ketika mesin fisika mendeteksi bahwa tabrakan dari dua GameObjects membuat kontak atau tumpang tindih, ketika setidaknya satu memiliki komponen kaku dan bergerak. More info
    Lihat di Glossary
    terjadi.

  2. kolida proyektil dengan sesuatu dan seketika ledakan Prefab. Prefab ledakan mengandung efek Sistem Partikel dan skrip yang berlaku kekuatan untuk GameObjects sekitarnya.

Dengan cara yang sama dengan Blok Prefab di atas, Anda dapat mengulangi proyektil hanya dalam satu baris kode, tidak peduli seberapa kompleks proyektil Prefab. Setelah mengulangi Prefab, Anda juga dapat memodifikasi sifat apa pun dari GameObject yang disengaja. Sebagai contoh, Anda dapat mengatur kecepatan kaku proyektil.

Juga lebih mudah digunakan, Anda dapat memodifikasi Prefab nanti tanpa menyentuh kode. Jadi jika proyektil Anda adalah roket, kemudian di Anda dapat menambahkan Sistem Partikel untuk membuatnya meninggalkan jejak awan. Setelah Anda melakukan ini, semua roket instan Anda memiliki jejak partikel.

Skrip ini menunjukkan cara meluncurkan proyektil menggunakan fungsi Instantiate().

using UnityEngine;
public class FireProjectile : MonoBehaviour
{
    public Rigidbody projectile;
    public float speed = 4;
    void Update()
    {
        if (Input.GetButtonDown("Fire1"))
        {
            Rigidbody p = Instantiate(projectile, transform.position, transform.rotation);
            p.velocity = transform.forward * speed;
        }
    }
}

Dalam kode, jenis variabel Prefab adalah kaku, dan tidak GameObject. Ini memiliki dua efek yang berguna:

  1. Hanya GameObjects yang memiliki komponen kaku dapat ditugaskan ke variabel ini. Ini berguna karena membantu memastikan Anda menetapkan GameObject yang benar ke variabel.

  2. Metode Instantiate mengembalikan referensi ke komponen Rigidbody pada instance baru. Hal ini berguna karena itu membuatnya sederhana untuk mengatur kecepatan orang kaku segera setelah mengulangnya.

Ketika membuat variabel prefab publik, jenis variabel dapat menjadi GameObject, atau dapat menjadi jenis Komponen yang valid (baik komponen Unity bawaan atau salah satu skrip MonoBehaviour Anda sendiri).

Permainan Jenis objek variabel, Anda dapat menetapkan GameObject ke variabel, dan fungsi Instantiate kembali referensi ke instance GameObject baru.

Untuk variabel tipe komponen (seperti kaku, Collider, dan Light), Anda hanya dapat menetapkan GameObjects dari jenis komponen tersebut ke variabel, dan fungsi Instantiate kembali referensi ke komponen spesifik pada instance GameObject baru.

Skrip berikut (ditempatkan pada Prefab proyektil) melakukan aksi meluruskan ledakan pada posisi arus proyektil dan menghapus GameObject proyektil ketika kolase proyektil dengan sesuatu.

using UnityEngine;
public class Projectile : MonoBehaviour
{
   public GameObject explosion;
   void OnCollisionEnter()
   {
       Instantiate(explosion,transform.position,transform.rotation);
       Destroy(gameObject);
   }
}
An example of projectile Prefabs being instantiated, and replaced with explosion Prefabs when they impact
Contoh prefab proyektif sedang disaatkan, dan diganti dengan prefab ledakan ketika dampaknya

Pemberitahuan dalam gambar di atas, yang menunjukkan 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
berjalan dalam mode Play, PermainanObjects instan muncul di Hierarchy, dengan kata “(Clone)” yang dituju dengan nama.

Mengganti karakter dengan ragdoll atau wreck

Sering dalam permainan, Anda mungkin ingin beralih karakter, kendaraan, bangunan atau aset lain dari negara “intact” ke negara “destroyed”. Dari mencoba untuk memodifikasi versi utuh dari GameObject (seperti menghapus skrip, menambahkan komponen kaku dan sebagainya), seringkali jauh lebih efisien dan efektif untuk menghapus seluruh GameObject utuh dan menggantinya dengan Prefab yang dihancurkan secara instan. Ini memberi Anda banyak fleksibilitas. Anda dapat menggunakan Bahan yang berbeda untuk versi yang hancur, melampirkan skrip yang sama sekali berbeda, atau sesaat Prefab yang mengandung GameObject rusak menjadi banyak potongan untuk mensimulasikan versi yang wrecked dan hancur dari GameObject asli. Setiap pilihan ini dapat dicapai dengan panggilan tunggal ke Instantiate(), untuk membawa versi menghancurkan Anda ke Adegan, sambil menghapus aslinya.

Yang paling penting, Anda dapat membuat versi hancur yang Anda Instantiate() dengan GameObjects yang berbeda dibandingkan dengan aslinya. Misalnya, untuk membuat robot rusak, Anda akan model dua versi: satu yang terdiri dari satu GameObject dengan Mesh Renderer

dan skrip untuk gerakan robot, dan yang lainnya terdiri dari beberapa bagian kerangka yang dapat dikontrol secara individual oleh fisika. Game Anda berjalan lebih cepat ketika menggunakan model hanya dengan satu GameObject, karena model mengandung segitiga yang lebih sedikit dan sehingga render lebih cepat daripada robot yang memiliki banyak bagian kecil. Juga sementara robot Anda berjalan dengan bahagia, tidak ada alasan untuk memilikinya di bagian terpisah.

Untuk membangun prefab robot wrecked, Anda bisa:

  1. Model robot Anda dengan banyak bagian kerangka yang berbeda dalam perangkat lunak pemodelan 3D favorit Anda, dan mengekspornya ke folder Aset Proyek Unity Anda.

  2. Buat Adegan kosong di Editor Unity.

  3. Seret model dari jendela Proyek ke tempat kejadian kosong.

  4. Tambahkan kakubodies ke semua bagian, dengan memilih semua bagian dan memilih Component > Physics > Rigidbody.

  5. Tambahkan Colliders ke semua bagian dengan memilih semua bagian dan memilih Component > Physics > Mesh Collider (dapatkan opsi Convex untuk kinerja yang lebih cepat).

  6. Pastikan Anda orang tua semua bagian dari robot wrecked Anda ke satu akar GameObject.

  7. Untuk efek khusus tambahan, tambahkan Sistem Partikel seperti asap sebagai anak GameObject ke setiap bagian.

  8. Sekarang Anda memiliki robot dengan beberapa bagian yang dapat meledak. Bagian dapat jatuh ke tanah karena dikontrol oleh fisika, dan setiap bagian menciptakan jejak partikel karena sistem partikel yang terpasang.

  9. Klik Bermain untuk melihat-lihat bagaimana model Anda bereaksi, dan buat tweak yang diperlukan.

  10. Seret akar GameObject ke Assets folder di Project window to menciptakan Prefab baru.

Contoh berikut menunjukkan bagaimana Anda dapat model langkah-langkah ini dalam kode.

using UnityEngine;
public class WreckOnCollision : MonoBehaviour
{
   public GameObject wreckedVersion;
   // Update is called once per frame
   void OnCollisionEnter()
   {
       Destroy(gameObject);
       Instantiate(wreckedVersion,transform.position,transform.rotation);
   }
}
An example of a robot Prefab being swapped for a wrecked Prefab when hit by a projectile
Contoh dari robot Prefab yang ditukar untuk wrecked Prefab ketika memukul oleh proyektil

Anda dapat mengunduh Proyek yang berisi semua contoh ini, di sini: InstantiatingPrefabsExamples.zip

Variabel dan Inspektur
Order eksekusi untuk fungsi acara