如果每个门上的脚本在主脚本之后执行,我如何获得门列表?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如果每个门上的脚本在主脚本之后执行,我如何获得门列表?相关的知识,希望对你有一定的参考价值。
主脚本附加到空游戏对象。这个脚本首先开始。
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>());
}
}
}
此脚本第二个附加到每个门,此脚本中的Start在顶部脚本之后执行:
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列表之前,第一个脚本已经执行了他的Start。
我想先从HoriDoorManager获取所有门,然后才能在DoorsLockManager脚本中执行Start。
我不想使用我希望从HoriDoorManager获得每两个门的标签,当它完成添加所有门后将它们添加到doorsLR,然后在DoorsLockManager中开始使用它。
答案
将HoriDoorManager
中的代码移动到Awake
(而不是Start
)。场景组件中的所有Awake
方法都将在执行任何Start
方法之前执行。
Here is a further description of the order of events in each scene.
以上是关于如果每个门上的脚本在主脚本之后执行,我如何获得门列表?的主要内容,如果未能解决你的问题,请参考以下文章