Как я могу получить список дверей, если сценарии на каждой двери выполняются после основного сценария? - PullRequest
0 голосов
/ 17 марта 2019

Основной скрипт прикреплен к пустому игровому объекту. И этот скрипт запускается первым.

using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;

public class DoorsLockManager : MonoBehaviour
{
    private List<List<DoorHori>> doorsLR = new List<List<DoorHori>>();
    public static void GetDoors(List<DoorHori> doorsLR)
    {
        doorsLR.AddRange(doorsLR);
    }

    private List<HoriDoorManager> Doors = new List<HoriDoorManager>();

    private void Start()
    {
        var doors = GameObject.FindGameObjectsWithTag("Door");
        foreach(var door in doors)
        {
            Doors.Add(door.GetComponent<HoriDoorManager>());
        }
    }
}

Этот скрипт второй прикрепляется к каждой двери, и запуск в этом скрипте выполняется после верхнего скрипта:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Linq;

public class HoriDoorManager : MonoBehaviour
{
    private List<DoorHori> doors = new List<DoorHori>();
    private bool doorLockState;

    private void Start()
    {
        if (transform.parent != null)
        {
            Transform parent = transform.parent;
            var children = parent.GetComponentsInChildren<Transform>();

            if(children != null)
            {
                foreach (Transform door in children)
                {
                    if (door.name == "Door_Left" || door.name == "Door_Right")
                        doors.Add(door.GetComponent<DoorHori>());
                }

                DoorsLockManager.GetDoors(doors);
            }
        }
    }

    void OnTriggerEnter()
    {
        if (doorLockState == false)
        {
            if (doors != null)
            {
               for(int i =0; i < doors.Count; i++)
                {
                    doors[i].OpenDoor();
                }
            }
        }
    }

    public void ChangeLockState(bool lockState)
    {
        doorLockState = lockState;
    }
}

Проблема в том, что прежде чем он добавит все двери в список doorsLR в первом сценарии, первый сценарий уже выполнит его запуск.

Я хочу сначала получить все двери из HoriDoorManager и только потом выполнить Start в сценарии DoorsLockManager.

Я не хочу использовать теги. Я хочу получить каждые две двери из HoriDoorManager, добавить их в doorsLR, когда он завершит добавление всех дверей, а затем начать работать с ним в DoorsLockManager.

1 Ответ

1 голос
/ 17 марта 2019

Переместите код в HoriDoorManager на Awake (вместо Start). Все методы Awake в компонентах вашей сцены будут выполняться до выполнения любого метода Start.

Вот дальнейшее описание порядка событий в каждой сцене.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...