查找脚本对象的所有实例并将其存储在列表中

时间:2019-05-16 11:48:38

标签: c# unity3d

我有一个可编写脚本的对象Character,让我们说说该Character的n个实例。

Character.cs

public class Character : UnityEngine.ScriptableObject
{
...
}
// Let us say that there are 100 instances of this Class

现在我创建另一个类

CharacterList.cs

public class CharacterList
{
     List<Character> characterList = new List<Character>();
     FindObjectsOfType<Character>();

     // I also tried to write Character[] character = FindObjectsOfType<Character>() but that did not work.
// Now How do I put all the objects found in the List?
}

我想做的是创建一个不是Class的{​​{1}}。只是一个名为Monobehaviour的简单类,在其中我想要一个CharacterList个字符,其中将包含List可脚本对象的所有实例。因此,Character

中应该有n个字符

2 个答案:

答案 0 :(得分:0)

CharacterList.cs类中:

object[] characters = FindObjectsOfType(typeof(Character));

答案 1 :(得分:0)

(SO =可编写脚本的对象) 这里有2个选项。取决于这些SO是在播放期间被序列化还是实例化。

选项1-SO已序列化

更简单的选择是创建另一个单行为或可编写脚本的对象,并将所有实例化的对象放置在那里。

public class CharacterList : ScriptableObject
{
     public Character[] characterList;
}

另一种方法将要求您通过使用AssetDatabase.FindAssetsAssetDatabase.LoadAssetAtPath编写脚本来在资产文件夹中搜索SO。

在这种情况下,代码将如下所示:

public class CharacterList
    {
        List<Character> characterList = new List<Character>();

        void PopulateList()
        {
            string[] assetNames = AssetDatabase.FindAssets("Your_Filter", new[] { "Assets/YourFolder" });
            characterList.Clear();
            foreach (string SOName in assetNames)
            {
                var SOpath    = AssetDatabase.GUIDToAssetPath(SOName);
                var character = AssetDatabase.LoadAssetAtPath<Character>(SOpath);
                characterList.Add(character);
            }
        }
    }

如何找到它们。

VIA NAME
您可以替换“ Your_Filter”来检索您的SO。在这种情况下,SO应该在名称上共享某种共性。

VIA文件夹
您可以使用文件夹替换new [] {“ Assets / YourFolder”}。在这种情况下,所有SO都应位于同一文件夹中,并且此文件夹中仅应包含这些SO。

选项2-实例化了

在这种情况下,我建议实现某种工厂。

不是使用常规代码创建SO:

ScriptableObject.CreateInstance<YourSo>();

我将使用创建实例的工厂并将其存储。 所以你会有类似的东西。

public static class CharacterGenerator
{
     static List<Character> characterList = new List<Character>();

     public static Character CreateCharacter()
     {
          var character = ScriptableObject.CreateInstance<YourSo>();
          characterList.Add(character);
          return character;
     }
}

因此,每当您要创建新字符时,都将呼叫CharacterGenerator.CreateCharacter();

还记得在游戏开始时(或在您认为必要时)清除列表。