Menu
CoddyTech

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().

challenge icon

Thử thách

Trung bình

Sửa các tổ ong để không tổ nào đếm một danh sách chưa được tạo.

  1. Thêm void Awake() vào Hive.
  2. Chuyển dòng bees = new List<GameObject>(); và vòng lặp for từ Start() vào Awake().
  3. Giữ hai dòng đếm trong Start(): mọi Awake() đều chạy trước mọi Start().

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

Tự luyện tập: Playground Unity