私は答えを探しましたが、ここでも紛失しています。私はいくつかのキャラクタージェネレーターを持っています。それはプレーヤーキャラクター変数を作成します。それらは、オブジェクトCharacterDataのコンポーネントである新しいスクリプト "PlayerCharacterData"に保存されます。このオブジェクトにはDontDestroyOnLoadがあるため、他のシーンにも適用されます。文字を生成した後、ゲームは文字データをそのスクリプトにロードし、シーンを切り替えると、データはバイナリファイルから適切にロードされます(先にシリアライズされます)。C#、Unity - シーン間で値を永続化/アクセス/変更する最も便利で高速な方法は?
しかし、私はこのコアを持っているので、 "PlayerCharacterData"クラスからデータを読み込むためにUIオブジェクトを多数必要とするので、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
}
は今ここに私のpublicクラスUIPlayerCharacterDataの例です。
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オブジェクトにタグを追加しました。最初は1番目のシーンから継承するCharacterDataオブジェクトのコンポーネント、2番目は2番目のシーンの主要なUIパネルのコンポーネントです。 2番目のクラスには、UIフィールドがたくさんあります。それぞれは、ファーストクラス(CharacterDataオブジェクトのコンポーネント)からデータを受け取ります。つまり、UIのデータを引き出すための50〜70の変数があります。
ゲーム全体でPlayerCharacterDataスクリプトのデータを取得して変更する必要があるため、これは単なるスタートです。
ここで、playerCharacterSheet変数に参照がないため、NameToCharacterData()関数が機能していないことがわかりました。「オブジェクト参照がオブジェクトのインスタンスに設定されていません」。それがAwake()で整理されたと思った - 私は間違っていた。 設定する必要があると思われるので、UIのフィールドに50-70の関数を埋め込むたびに、 PlayerCharacterData playerCharacterData = GameObject.Find("CharacterData").GetComponent<PlayerCharacterData>();
...を設定する必要があります。 ゲーム内の他のすべてのシステムについて言及する必要はありません。 さらに、毎回のプレイヤーはUIを開き、UIフィールドを再生成する必要があります。
もっと速く、より便利な方法がありますか? 私はすべてのPlayerCharacterData変数を静的にすることを考えていました - これは雷として速くなりますが、私たちのエンジンをマルチプレイヤー(1人から200人まで)のために準備したいと思っています。だから確かではない。
また、Monobehaviourを使わずに文字データ変数をスクリプトに保存する方がいいですから、gameObjectに接続しないと、PlayerCharacterData playerCharacterData = new PlayerCharacterData();
を使ってクラスから値を取得できますか?本当に速く、どこからでもアクセス可能な値が必要です。
現時点では静的変数の使用を検討していますが、より良い解決策がある場合や、マルチプレイヤーゲームの静的変数を作成するより良い方法がある場合はお知らせください。
重複しません。私はすでにそこを見て、私が上で提案した解決策を提供します。多くの異なるオブジェクトからのデータへのアクセスをより良く実装する方法を探しています。本当に多くのオブジェクトを高速に処理します。 –
注目。クローズされた投票が取り下げられ – Serlite
ここで会話を続けましょう。私はあなたのnullエラーの問題がなくなったと思います。 'PlayerCharacterData playerCharacterData = GetPlayerCharacterData();'警告は、宣言後に 'playerCharacterData'変数を使用していないためです。 'playerCharacterData.accessOtherVariable = 5;'または 'playerCharacterData.callOtherFunction ...'を実行する必要があります。 – Programmer