Awake và Start
Thuộc phần Những kiến thức cơ bản về lập trình trong Unity trong hành trình Unity của Coddy. Bài học 70 trên 85.
Unity gọi Awake() ngay khi một đối tượng được tải, trước Start() của đối tượng đó. Quy tắc áp dụng cho mọi đối tượng khiến phương thức này hữu ích: khi một cảnh bắt đầu, Awake() của mọi đối tượng đều chạy trước Start() của bất kỳ đối tượng nào. Unity quyết định thứ tự chạy của các đối tượng trong mỗi lượt, và bạn không thể dựa vào thứ tự đó.
Tập lệnh Player này được gắn cho hai người chơi, P1 (startLives 3) và P2 (startLives 5), mỗi người có người kia làm rival:
public int startLives = 3;
public GameObject rival;
int lives;
void Awake()
{
lives = startLives; // thiết lập đối tượng này
}
void Start()
{
int theirs = rival.GetComponent<Player>().Lives(); // hỏi đối tượng kia
Debug.Log(name + " sees a rival with " + theirs + " lives");
}
public int Lives()
{
return lives;
}Phiên bản đầu tiên đặt lives trong Start(). Người chơi nào bắt đầu trước sẽ hỏi người chơi còn lại trước khi người đó đặt số mạng, nên giá trị được in ra là 0. Khi thiết lập trong Awake(), cả hai người chơi đều có số mạng trước khi Start() của bất kỳ ai hỏi, vì vậy P1 in ra 5 và P2 in ra 3. Hãy tạo thói quen thiết lập các trường riêng của một đối tượng trong Awake(), rồi tương tác với các đối tượng khác trong Start().
Thử thách
Trung bìnhSửa các tổ ong để không tổ nào đếm một danh sách chưa được tạo.
- Thêm
void Awake()vàoHive. - Chuyển dòng
bees = new List<GameObject>();và vòng lặpfortừStart()vàoAwake(). - Giữ hai dòng đếm trong
Start(): mọiAwake()đều chạy trước mọiStart().
Nhấn Chơi: mỗi tổ ong ghi lại số ong của đối thủ, HiveA đếm được 5 ong đối thủ mà không có lỗi. Sau đó nhấn Kiểm tra.
Tự làm thử
using System.Collections.Generic;
using UnityEngine;
public class Hive : MonoBehaviour
{
public GameObject beePrefab;
public GameObject rival;
public int beeCount = 3;
List<GameObject> bees;
void Start()
{
bees = new List<GameObject>();
for (int i = 0; i < beeCount; i++)
{
Vector3 spot = transform.position + new Vector3(i * 0.6f - 1.2f, 1.5f, 0);
bees.Add(Instantiate(beePrefab, spot, Quaternion.identity));
}
int theirs = rival.GetComponent<Hive>().BeeCount();
Debug.Log(name + " counts " + theirs + " rival bees");
}
public int BeeCount()
{
return bees.Count;
}
}
Tất cả bài học trong Những kiến thức cơ bản về lập trình trong Unity
1C# cơ bản trong Unity
Xin chào, UnityBiếnSố thập phân cần có fVăn bản trong ConsoleBiến có thể ghi nhớIf và elseSo sánh các sốÔn tập: Thu thập xu7Vòng lặp và phương thức
Lặp lại với forVòng lặp lồng nhauViết phương thứcPhương thức trả lờiMảngÔn tập: Cầu thang2Làm cho nó chuyển động
Đặt khối lập phươngDi chuyển theo từng khung hìnhXoay mỗi giâyĐiều khiển bằng các phímÔn tập: Lái khối lập phương5Vectơ
Cộng vectơPhương hướngKhông gian cục bộ và không gian thế giớiTốc độ theo đường chéoKhoảng cách giữa các vậtVector3 là một structÔn tập: Người điều khiển drone8GameObject và thành phần
Tham chiếu trong InspectorLấy một thành phầnThành phần bị thiếuThêm một thành phầnRequireComponentHiện và ẩnÔn tập: Công tắc đèn3Inspector
Các trường trong InspectorSerializeFieldSố thực và MathfThuộc tính trong InspectorÔn tập: thang máy6Biến đổi và hệ phân cấp
Đối tượng cha và conKéo cờ lênTỷ lệNhìn vào các vật thểDi chuyển đến một điểmÔn tập: Mặt trăng quay quanh9Dự án: Bắt lấy ngôi sao
Người bắt saoNgôi sao rơi12Vòng đời của script
Awake và StartUpdate và LateUpdateOnEnable và OnDisableThứ tự vòng đờiÔn tập: Trình ghi nhật ký vòng đờiTự luyện tập: Playground Unity