unity3d 如何引用场景中衍生的对象?

7rfyedvj  于 2022-12-23  发布在  其他
关注(0)|答案(2)|浏览(198)

我的游戏有在不同地方产生的对象,而且总是有不同的数量。
当玩家触摸该对象时,对象消失,并且向变量point添加1点。
我需要计算场景中所有这些物体的数量,然后将这个数字与point进行比较,如果point等于场景中物体的初始数量,那么特定的事件就会发生。
我的问题是我不知何故需要计算派生对象的数量。

avkwfej4

avkwfej41#

如果不知道“派生”脚本的结构,提供解决方案将是一个挑战。但作为一个总体思路,您可以选择:
A.保留一个计数器(例如numberOfExistentObjects),该计数器每增加一个新的GameObject就增加一次,并且当它在被玩家触摸时被销毁时减少一次

  • 然后,您可以沿着if(numberOfExistentObjects == point){...}的方式创建比较

B.通过在列表(或array)中保持引用(如List<GameObject> mySpawnedGameObjects = new())来引用您新示例化/衍生的游戏对象,并在创建或销毁时分别添加或删除其元素。

  • 然后,可以使用.Count获取该集合中的元素数,并将其与point变量进行比较。

如果由于某种原因无法保留引用,或者需要其他方法,可以使用FindObjectsOfType<T>获取特定type的所有GameObjects,因此,如果所有“可触摸”对象都有TouchableObject类(或接口),则可以执行以下操作:

FindObjectsOfType<TouchableObject>().Select(x => x.gameObject).ToArray();
b1zrtrql

b1zrtrql2#

在这种情况下,我更喜欢在我的预置上有一个专用组件,它允许直接对示例进行简单的计数/迭代:

public class Example : MonoBehaviour
{
    private static readonly HashSet<Example> _instances = new();

    public static IReadOnlyCollection<Example> Instances => _instances;

    private void Awake ()
    {
        _instances.Add(this);
    }

    private void OnDestroy ()
    {
        _instances.Remove();
    }
}

这样,任何其他对象都可以通过

var amount = Example.Instances.Count;

foreach(var instance in Example.Instances)
{
    ...
}

相关问题