unity3d 在Unity C#中初始化需要访问场景层次结构的私有变量的位置

k7fdbhmy  于 2023-03-30  发布在  C#
关注(0)|答案(3)|浏览(205)

我有一个名为PlayerManager的“Manager”类型类,我想使用FindObjectOfType()在不同的类/对象中为它初始化一个对象。我的理解是,这将搜索当前场景层次结构以查找具有此特定脚本的对象。
我在场景中生成的预制件上使用了这行代码,而不是从一开始就在那里。变量是私有的。有时找不到对象,因为我在Start()函数上使用了这行代码,所以我假设在实际搜索对象之前调用了“FindObjectOfType”行,因此在那里什么也找不到。
我想在Update()上使用这个方法,首先检查对象是否为null,这样它就不会循环。我不知道这是否是一个好的做法,但它“感觉不对”。
如果我不想使用公共或[SerializeField]变量,那么最理想的方法是什么?

jutyujz0

jutyujz01#

如你所知,使用FindType代码根本不是最佳的,在Update中使用此代码更糟糕。在这种情况下,您必须在Spawner对象中指定Manager(例如,gun...),并在示例化后将创建的游戏对象引用到管理器。
虽然你没有在你的问题中发布任何代码。但我将向你展示一个如何避免Find的例子。正如你所看到的,在管理器中放置一个决定性的spawn对象事件。

public class Manager : MonoBehaviour
{
    private Bullet spawned; // for example type of Bullet
    public void SetSpawnedObject(Bullet _spawned)
    {
        spawned = _spawned;
    }
}

在示例化完成之后,你应该运行你的事件。这个事件可以是任何东西。

public class Spawner : MonoBehaviour
{
    [SerializeField] private Manager _manager;
    public Bullet bullet;
    
    public void Spawn()
    {
        var _newBullet = Instantiate(bullet);
        _manager.SetSpawnedObject(_newBullet); // set new Bullet to manager after instantiating..
    }
}
xtfmy6hx

xtfmy6hx2#

您可以在Awake()中示例化游戏对象,然后在Start()中调用FindObjectOfType()方法。

你可以使用协程在一段时间后获取示例。这个延迟将允许你在创建后获得你要找的东西。

rlcwz9us

rlcwz9us3#

信不信由你,你可以在Start()函数中调用yield return null(不需要调用协程)。

IEnumerator Start()
{
    // wait 2 frames
    yield return null;
    yield return null;

    FindObjectOfType(bob);
}

相关问题