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
(SO = 可编写脚本的对象)我们这里有 2 个选项。取决于这些 SO 在游戏过程中是否被序列化或实例化。
更简单的选择是创建另一个单一行为或可编写脚本的对象,并将所有实例化对象放置在那里。
public class CharacterList : ScriptableObject
{
public Character[] characterList;
}
Run Code Online (Sandbox Code Playgroud)
另一种方法将要求您通过使用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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
如何找到他们。
VIA NAME
您可以替换“Your_Filter”来检索您的 SO。在这种情况下,SO 的名称应该具有某种共性。
VIA FOLDER
您可以将 new[] { "Assets/YourFolder" } 替换为您的文件夹。在这种情况下,所有 SO 应位于同一文件夹中,并且此文件夹应仅包含这些 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();
还请记住在游戏开始时(或当您认为需要时)清除列表。
归档时间: |
|
查看次数: |
16627 次 |
最近记录: |