gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 01:40:38 27 4
gpt4 key购买 nike

我有一个 Scriptable Object 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?
}

我想做的是创建一个不是 MonobehaviourClass。只是一个名为 CharacterList 的简单类,我想要一个包含 Character Scriptable Object 的所有实例的字符 List。因此,CharacterList

中应该有 n 个字符

最佳答案

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

选项 1 - SO 被序列化

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

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

另一种方法需要您使用 AssetDatabase.FindAssets 编写脚本在 Assets 文件夹中搜索 SO和 AssetDatabase.LoadAssetAtPath .

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

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);
}
}
}

如何找到它们。

通过名称
您可以替换“Your_Filter”来检索您的 SO。在这种情况下,SO 应该在他们的名字中分享某种共性。

通过文件夹
您可以用您的文件夹替换 new[] { "Assets/YourFolder"} 。在这种情况下,所有的 SO 都应该在同一个文件夹中,并且这个文件夹应该只包含这些 SO。

选项 2 - SO 被实例化

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

而不是使用通常的代码创建 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();

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

关于c# - 查找脚本对象的所有实例并将其存储在列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56167870/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com