我寻找答案,但仍然不知所措。我有一些角色生成器,它创建然后保存玩家角色变量。它们被保存到一个新的脚本“PlayerCharacterData”中,它是对象CharacterData的一个组件。该对象具有DontDestroyOnLoad,因此它会保留到其他场景。生成角色后,游戏将角色数据加载到该脚本中,当我切换场景时,数据会从二进制文件(之前序列化)正确加载。
但现在我有了这个核心,我需要大量的 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 的示例。我在 Unity 编辑器中向对象 CharacterData 添加了一个标签,以使“查找”速度更快:
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 的脚本中不是更好吗,这样就不会连接到游戏对象,也许我们可以使用PlayerCharacterData playerCharacterData = new PlayerCharacterData();
从该类中获取值?我只是需要能够从任何地方快速访问这些值。
此时确实正在考虑使用静态变量,但如果有更好的解决方案,或者有更好的方法为多人游戏创建静态变量,请告诉我。