我有一个可编写脚本的对象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
答案 0 :(得分:0)
在CharacterList.cs
类中:
object[] characters = FindObjectsOfType(typeof(Character));
答案 1 :(得分:0)
(SO =可编写脚本的对象) 这里有2个选项。取决于这些SO是在播放期间被序列化还是实例化。
更简单的选择是创建另一个单行为或可编写脚本的对象,并将所有实例化的对象放置在那里。
public class CharacterList : ScriptableObject
{
public Character[] characterList;
}
另一种方法将要求您通过使用AssetDatabase.FindAssets和AssetDatabase.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。
在这种情况下,我建议实现某种工厂。
不是使用常规代码创建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();
还记得在游戏开始时(或在您认为必要时)清除列表。