【问题标题】:Find all active/inactive gameObjects that has common script attached [duplicate]查找所有附加了通用脚本的活动/非活动游戏对象[重复]
【发布时间】:2021-09-29 18:29:24
【问题描述】:

我正在尝试查找添加了公共脚本的所有活动和非活动游戏对象。我能够找到所有活动的游戏对象,但不幸的是,我的脚本没有查看非活动的游戏对象。我该如何克服这个问题?

public myScript[] commonScripts;

void Start() {
 commonScripts = FindObjectsOfType(typeof(myScript)) as myScript[];
}

【问题讨论】:

标签: c# unity3d


【解决方案1】:

您应该尝试一种不同的方法,将组件实例添加到AwakeStart 中的列表中

public class MyScript : MonoBehaviour
{
    void Awake()
    {
         FindObjectOfType<ContainerClass>().Add(this);
    }
    void OnDestroy()
    {
         FindObjectOfType<ContainerClass>().Remove(this);
    }
}

public class ContainerClass : MonoBehaviour
{
    private List<MyScript> scripts = new List<MyScript>();
    
    public void Add(MyScript script)
    {
         scripts.Add(script);
    }
    public void Remove(MyScript script)
    {
         scripts.Remove(script);
    }
}

【讨论】:

  • 这个FindObjectOfType&lt;ContainerClass&gt;().Add(this);应该如何编译...你得到一个ContainerClass[]然后尝试在它上面使用Add并添加一个MyScript实例...没有任何作用完全有感觉^^
  • 它是 FindObjectOfType 而不是 FindObjectsOfType 所以你得到一个单一的项目。
  • 对不起,我现在明白你的意思了!仍然:为什么要为此设置一个专门的组件,而不仅仅是在课堂上做呢?
  • 我理解原始示例暗示它将是一个单独的组件。在课堂上做这意味着你有许多相同动作的迭代。否则,这将意味着静态,这是另一个答案。
  • ContainerClass 也可以被传递,考虑到它可能是持久的,而那些 MyScript 对象很可能被破坏。总而言之,描述有点靠想象。
【解决方案2】:

如果 myScript 是您的 C# 脚本之一,我会使用包含所有实例的 static list

示例代码

using System.Collections.Generic;
using UnityEngine;

public class MyScript : MonoBehaviour
{
    public static List<MyScript> allObjects = new List<MyScript>();

    private void Start()
    {
        if (allObjects.Contains(this) == false)
            allObjects.Add(this);
    }

    private void OnDestroy()
    {
        if (allObjects.Contains(this))
            allObjects.Remove(this);
    }
}

您可以在任何其他类中使用它,如下所示

using UnityEngine;

public class AnotherScript : MonoBehaviour
{
    private void AnyFunction()
    {
        foreach (MyScript ms in MyScript.allObjects)
        {
            // do whatever you want
        }
    }
}

【讨论】:

  • 您可能会考虑使用HashSet .. 取决于实例的数量
  • 当然。但这仍然取决于用例。
  • 不是真的 .. 用例很清楚 ;) 这取决于 ContainsAdd 是否为 more performant on a List or a HashSet 的元素数量;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多