我寻找答案,但仍然在这里失去。我有一些角色生成器,它会创建并保存玩家角色变量。它们被保存到一个新的脚本“PlayerCharacterData”中,它是对象CharacterData的一个组件。该对象具有DontDestroyOnLoad,因此它会持续到其他场景。在生成角色之后,游戏将角色数据加载到该脚本中,并且当我切换场景时,数据从二进制文件(先前序列化)中正确加载。C#,Unity - 最方便快捷的方式来持久/访问/修改场景之间的值?
但是现在我有了这个核心,我需要我的众多UI对象从“PlayerCharacterData”类加载数据,所以UI可以填充所有字段等等。后面的整个游戏将取决于来自“PlayerCharacterData”的变量值。
这是我PlayerCharacterData脚本的一部分:
public class PlayerCharacterData : MonoBehaviour {
void Awake(){
DontDestroyOnLoad (this); // keeps the object when changing scenes
}
// below we have data stored in variables. It was loaded by another script.
public string characterName;
public int characterSpeed;
public List<Weapon>characterInvWeapon;
// etc, more variables x50-70
}
现在,这里的例子我的公共类UIPlayerCharacterData的。我加了一个标签对象CharacterData在Unity编辑器进行“查找”更快:
public class UIPlayerCharacterData : PlayerCharacterData {
public void NameToCharacterDataUI() {
// this would be required to make it work: PlayerCharacterData playerCharacterData = GameObject.FindGameObjectWithTag("CharacterData").GetComponent<PlayerCharacterData>();
Text_ch_sh_char_name_string.text = playerCharacterData.characterName;
}
// etc, more functions like that x50-70
void Awake() {
PlayerCharacterData playerCharacterData = GameObject.FindGameObjectWithTag("CharacterData").GetComponent<PlayerCharacterData>();
NameToCharacterDataUI();
// etc, calling more functions x50-70
}
}
问题是,这些类是对不同的对象。首先是第一场景中存在的CharacterData对象的组件,第二是第二场景中主UI面板的组件。第二类有很多UI字段需要填写,只是向你展示了其中的一个。每个都从第一类(CharacterData对象上的组件)获取数据。因此,UI需要50-70个变量才能从中提取数据。
这只是一个开始,因为整个游戏将需要获取和修改PlayerCharacterData脚本中的数据。
现在,我发现函数NameToCharacterData()不起作用,因为它没有在playerCharacterSheet变量中引用:“对象引用未设置为对象的实例”。认为它在Awake()中被整理出来 - 我错了。 因此,似乎我们需要设置 PlayerCharacterData playerCharacterData = GameObject.Find("CharacterData").GetComponent<PlayerCharacterData>();
...在填充UI中的字段的每个50-70函数中。 更不用说游戏中的其他系统也需要这样做。 另外,每次玩家打开UI时,需要重新生成这些UI字段。
有没有更快,更方便的方法呢? 我在考虑让所有的PlayerCharacterData变量都是静态的 - 这将会像雷电一样快,但我更愿意让我们的引擎为多人(1到200名玩家)做好准备。所以不确定。
另外,将字符数据变量保存到没有Monobehaviour的脚本中是不是更好,因此没有连接到一个gameObject,也许我们可以使用PlayerCharacterData playerCharacterData = new PlayerCharacterData();
来获得该类的值?我只需要这些值可以非常快速地从任何地方访问。
在这一点上真的考虑使用静态变量,但如果有更好的解决方案,或者如果有更好的方法为多人游戏创建静态变量,请告诉我。
不是重复。我已经看过,它提供了我上面提出的解决方案。研究如何更好地实现访问来自许多不同对象的数据,其中很多是快速的。 –
已注意。收起投票。 – Serlite
让我们继续在这里谈话。我猜你的空错误问题已经消失了。至于'PlayerCharacterData playerCharacterData = GetPlayerCharacterData();'警告,那是因为你在声明它后没有使用'playerCharacterData'变量。你必须做'playerCharacterData.accessOtherVariable = 5;'或'playerCharacterData.callOtherFunction ...' – Programmer