Prefabs và Instantiation

Lập tức và phá hủy các đối tượng được coi là rất quan trọng trong quá trình chơi. Instantiating chỉ đơn giản có nghĩa là đưa vào sự tồn tại. Các vật phẩm xuất hiện hoặc “xuất hiện” trong trò chơi, kẻ thù chết, các yếu tố GUI biến mất và các cảnh được tải mọi lúc trong trò chơi. Biết cách loại bỏ những đồ vật không cần thiết một cách hợp lý và làm thế nào để mang những đồ vật bạn làm sau đó càng trở nên cần thiết hơn.

Đầu tiên chúng ta hãy hiểu prefabs là gì . Prefabs được coi là quan trọng để hiểu cách Instantiation hoạt động trong Unity.

Prefabs giống như bản thiết kế của GameObject. Theo một cách nào đó, Prefabs là một bản sao của GameObject có thể được sao chép và đưa vào một cảnh, ngay cả khi nó không tồn tại khi cảnh đó đang được tạo; nói cách khác, prefabs có thể được sử dụng để tạo động các GameObject . Để tạo một nhà lắp ghép, bạn chỉ cần kéo GameObject mong muốn từ hệ thống phân cấp cảnh của bạn vào Nội dung dự án 

Prefabs và Instantiation

Bây giờ, để khởi tạo một GameObject, chúng tôi gọi phương thức Instantiate () trong tập lệnh của chúng tôi. Phương thức này, được định nghĩa trong MonoBehaviour , lấy một GameObject làm tham số, vì vậy nó biết GameObject nào cần tạo / sao chép. Nó cũng có nhiều ghi đè khác nhau để thay đổi chuyển đổi của đối tượng mới khởi tạo, cũng như cách nuôi dạy con cái.

Hãy để chúng tôi thử tạo một hình lục giác mới bất cứ khi nào phím Space được nhấn.

Tạo một tập lệnh mới có tên là Instantiator và mở nó lên. Trong phương pháp Cập nhật , hãy nhập mã được cung cấp bên dưới. Ở đây, chúng tôi đang sử dụng phương thức GetKeyDown của lớp Đầu vào để kiểm tra xem người chơi có nhấn một nút cụ thể trong khung hình cuối cùng hay không. Vì chúng tôi muốn nó tiếp tục kiểm tra, chúng tôi đưa nó vào Cập nhật , chạy 60 lần mỗi giây. Phương thức GetKeyDown trả về true nếu phím được chỉ định bởi enum KeyCode (liệt kê tất cả các phím có thể có trên bàn phím tiêu chuẩn) được nhấn trong khung đó.

public class Instantiator : MonoBehaviour {
   public GameObject Hexagon;
   // Update is called once per frame
   void Update () {
      if (Input.GetKeyDown(KeyCode.Space)) {
         Instantiate(Hexagon);
      }
   }
}

Khai báo GameObject công khai ở trên cùng tạo ra một khe tương tự như chúng tôi đã tạo cho Rigidbody2D trong các bài học trước của chúng tôi. Tuy nhiên, vị trí này chỉ chấp nhận prefabs (trong thời gian biên tập) và gameObjects (trong thời gian chạy). Lưu tập lệnh và để nó biên dịch. Sau khi hoàn tất, hãy tạo một GameObject mới, trống bằng cách chuyển đến menu chuột phải phân cấp đối tượng của bạn và chọn Create Empty .

Prefabs và Instantiation

Đặt tên cho Đối tượng này một cái gì đó dễ nhận biết chẳng hạn như Đối tượng Instatiator và đính kèm tập lệnh mới tạo của chúng tôi vào nó. Trong khe hiển thị cho GameObject, hãy kéo nhà lắp ghép mà chúng tôi đã tạo.

Prefabs và Instantiation

Nếu chúng ta chạy trò chơi ngay bây giờ, nhấn phím cách sẽ tạo ra một đối tượng Hexagon mới giống với đối tượng chúng ta đã sử dụng để tạo nhà lắp ghép. Bạn có thể thấy mỗi hình lục giác được tạo trong hệ thống phân cấp đối tượng. Lý do bạn không thể thấy chúng hiển thị trong trò chơi là vì hiện tại, tất cả chúng đều đang được tạo chính xác một cái khác.

Prefabs và Instantiation

Trong bài học tiếp theo của chúng ta, chúng ta sẽ hiểu khái niệm về sự phá hủy đối tượng.

Unity – GameObject Destruction

Việc phá hủy GameObjects cũng quan trọng như việc khởi tạo. Trong chương này, chúng ta sẽ học cách tiêu diệt GameObjects.

May mắn thay, việc tiêu diệt GameObjects cũng dễ dàng như việc tạo ra chúng. Bạn chỉ cần một tham chiếu đến đối tượng sẽ bị hủy và gọi phương thức Destroy () với tham chiếu này là một tham số.

Bây giờ, chúng ta hãy thử tạo ra 5 hình lục giác sẽ tự phá hủy khi nhấn một phím được chỉ định. Hãy để chúng tôi tạo một tập lệnh mới có tên là HexagonDestroyer và mở nó trong Visual Studio. Chúng ta sẽ bắt đầu bằng cách tạo một biến KeyCode công khai . Mã khóa được sử dụng để chỉ định một phím trên bàn phím tiêu chuẩn và lớp Đầu vào trong các phương thức của nó sử dụng nó. Bằng cách đặt biến này ở chế độ công khai, như chúng ta đã làm với Rigidbody và Prefabs trước đây, chúng ta có thể làm cho nó có thể truy cập được thông qua trình chỉnh sửa. Khi biến được đặt ở chế độ công khai, chúng ta không cần các giá trị hardcode như “KeyCode.A” vào mã. Mã có thể được thực hiện linh hoạt với nhiều đối tượng tùy thích

public class HexagonDestroyer : MonoBehaviour {
   
   public KeyCode keyToDestroy;

   // Update is called once per frame
   void Update () {
      
      if (Input.GetKeyDown(keyToDestroy)) {
         Destroy (gameObject);
      }
   }
}

Quan sát cách chúng tôi sử dụng biến có tên “gameObject” (g nhỏ, viết hoa O) trong phương pháp. Biến gameObject mới này (thuộc loại GameObject ) được sử dụng để tham chiếu đến gameObject mà tập lệnh này được đính kèm. Nếu bạn đính kèm tập lệnh này trên nhiều đối tượng, tất cả chúng sẽ phản ứng theo cùng một cách bất cứ khi nào biến này có liên quan.

Tuy nhiên, đừng nhầm lẫn giữa hai điều này.

  • GameObject với chữ G và O viết hoa là lớp bao gồm tất cả các GameObject và cung cấp các phương thức tiêu chuẩn như Instantiate, Destroy và các phương thức để tìm nạp các thành phần.
  • gameObject với chữ g nhỏ và chữ O viết hoa là phiên bản cụ thể của GameObject, được sử dụng để tham chiếu đến gameObject mà tập lệnh này hiện được đính kèm.

Bây giờ chúng ta hãy biên dịch mã của mình và quay lại Unity. Bây giờ, chúng ta sẽ tạo một hình lục giác mới và đính kèm tập lệnh của chúng ta vào nó. Tiếp theo, nhấp chuột phải vào gameObject trong hệ thống phân cấp và chọn Nhân bản . Một sprite mới được tạo trong hệ thống phân cấp; bạn nên sử dụng công cụ Move để định vị lại nó. Lặp lại các bước để tạo các hình lục giác tương tự.

Prefabs và Instantiation
Prefabs và Instantiation

Nhấp vào từng hình lục giác và xem các thành phần tập lệnh của chúng. Bây giờ bạn có thể đặt các phím riêng lẻ để GameObject tự hủy khi phím đó được nhấn. Ví dụ: chúng ta hãy tạo 5 hình lục giác và đặt chúng để phá hủy khi nhấn các phím A, S, D, F và G.

Bạn có thể đặt cùng một phím trên nhiều hình lục giác và tất cả chúng sẽ tự hủy đồng thời khi phím được nhấn; đây là một ví dụ về việc sử dụng tham chiếu gameObject , bạn có thể sử dụng tham chiếu này để tham chiếu đến các đối tượng riêng lẻ bằng cách sử dụng tập lệnh mà không cần phải đặt chúng riêng lẻ.

Cùng một phím có thể được đặt trên nhiều hình lục giác và tất cả chúng sẽ tự hủy đồng thời khi phím được nhấn; đây là một ví dụ về việc sử dụng tham chiếu gameObject , bạn có thể sử dụng tham chiếu này để tham chiếu đến các đối tượng riêng lẻ bằng cách sử dụng tập lệnh mà không cần phải đặt chúng riêng lẻ.

Điều quan trọng là phải hiểu rằng phá hủy một GameObject không có nghĩa là một đối tượng sẽ vỡ tan hoặc phát nổ. Việc phá hủy một đối tượng sẽ đơn giản (và ngay lập tức) chấm dứt sự tồn tại của nó cho đến khi trò chơi (và mã của nó) có liên quan. Các liên kết đến đối tượng này và các tham chiếu của nó hiện đã bị hỏng và việc cố gắng truy cập hoặc sử dụng một trong hai đối tượng này thường sẽ dẫn đến lỗi và sự cố

Unity – Coroutines (xem thêm)

Trả lời