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

Swa*_*yya 3 c# unity-game-engine

我有一个可编写脚本的对象Character,我们假设它有 n 个实例Character

Character.cs

public class Character : UnityEngine.ScriptableObject
{
...
}
// Let us say that there are 100 instances of this Class
Run Code Online (Sandbox Code Playgroud)

现在我创建另一个类

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?
}
Run Code Online (Sandbox Code Playgroud)

我想做的是创建一个Class不是Monobehaviour. 只是一个简单的类CharacterList,我想要一个List包含Character脚本对象的所有实例的字符。因此,应该有n个字符CharacterList

Jac*_*ani 7

(SO = 可编写脚本的对象)我们这里有 2 个选项。取决于这些 SO 在游戏过程中是否被序列化或实例化。

选项 1 - SO 已序列化

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

public class CharacterList : ScriptableObject
{
     public Character[] characterList;
}
Run Code Online (Sandbox Code Playgroud)

另一种方法将要求您通过使用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);
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

如何找到他们。

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

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

选项 2 - SO 被实例化

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

而不是使用通常的代码创建 SO:

ScriptableObject.CreateInstance<YourSo>();
Run Code Online (Sandbox Code Playgroud)

我将使用工厂来创建实例并存储它。所以你会得到这样的东西。

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;
     }
}
Run Code Online (Sandbox Code Playgroud)

所以每当你想创建一个新角色时你都会调用CharacterGenerator.CreateCharacter();

还请记住在游戏开始时(或当您认为需要时)清除列表。