2017-02-25 2 views
3

私は、Final Fantasyなどに似たRPGゲームを作成するためにUnity3Dを使用しています。もちろん、C#で。2種類のリストの変数の比較

ゲーム内のエンティティの場合、キャラクターとエネミーの2つのクラスがあります。

私のバトルコードには、党と呼ばれるリストと敵と呼ばれるリストの2つのリストがあります。 私は多くの場合、ALL CharactersとEnemiesのint値を一緒に比較して変更する必要があります。これは、別々のリストにあるために困難でした。同じ名前の変数が同じです(例: (int Reflex、int Attack、int Strength、int Defenseなど)が異なるタイプなので、例えば、両方のリストの中で最も高いReflexを持つCharacter OR Enemyを取得するなど、わかりません。

私は、それらを派生クラスとして使用し、CharacterクラスとEnemyクラスの両方に、オーバーラップする変数を含む基本クラスEntityを継承させました。それから私は使用する戦いでエンティティの1つのリストを持つことができました。とても簡単ですが、Unity3Dは、現在保存とロードがすべて依存しているシリアライゼーションプロセスの多態性をサポートしていません。

もっと簡単な答えがあることを期待しています。さもなければ、私はUnityのシリアライゼーションを使用しないために、何とか私のセービングとローディングコードを苦痛に書き直さなければならないでしょう...

基本的に、これらの変数を簡単に比較できますか?そしてもしそうなら、どうですか?

EDIT:回答自分の質問これは後に種のばかげたので、すぐかもしれない

+0

* "私の保存と読み込みのすべてが現在依存しているシリアライゼーションプロセスのためのUnity3Dは多態性をサポートしていません" *これについてはわかりませんが、コードを含めてください。あなたがしていることのサンプルコードを含めると、人々があなたの問題を手伝うことができます。 – Programmer

答えて

1

は質問をしたが、私はただ、予想外に私が持っていた同じ問題を記述した非常に素晴らしいブログの記事に出くわした: http://www.archmagerises.com/news/2015/9/22/tips-on-game-world-state-data-serialization-in-unity-c

私の例では、私は自分のゲームでsharpSerializerを実装しました。それはすごくうまくいく、私は最初に計画されたポリモーフィッククラスのシステムに戻った。 これで、Unityのひどいビルトインシリアライザを回避するようにコードを強制する必要はありません。

Unityフォーラムやこの問題に対処する投稿が多くないように思っていますので、誰もが私と同じ問題を抱えています。

+0

私はUnityのJsonシリアライザを使ってこれを行いますが、これは完全にうまくいきますが、これがうまくいくなら、それに合わせてください。 – Programmer

0

IDフィールドを持つPlain Old C#クラスを使用して、文字と敵のデータを抽象化しないのはなぜですか? (「CreatureData」「ActorData」や「CharacterData」などと呼ばれることもあります)。この抽象クラスの各インスタンスは、CharactersとEnemiesの両方に含まれるこの新しいIDフィールドを参照できます。

新しいC#クラスのインスタンスは、ディクショナリやリストのような別のコレクションに格納でき、後で簡単に繰り返すことができます。

私が間違っていない限り、この新しいクラスをシリアライズ可能にする限り、Unityはそれを処理できるはずです。

+0

これはオプションでしたが、すべてのネストされた方法のために多くの時間と労力がかかります(1つのオブジェクトだけが保存されました.Gameはカスタムクラスである他のオブジェクトの配列を含み、 、カスタム構造体など) 編集:しかし、私は自分の質問に答えたので、かなり満足しています。 –

1

Unityのビルトインシリアライザは、多くの作業を使用することができますが、私は実際にはエディタスクリプトを実行している間に本当に大きな頭痛に遭遇しました。同じように、私は非常に同情するthis男の怒り。実行時のシリアライゼーションはちょっと違います。特にUnityの場合はJsonDotNetのような外部ツールの助けを借りて、作業するのが少し楽です。他のSharpSerializerについても触れました。 FullSerializerもあり、アセットストアのオフシェルFullInspectorもあります。これは、特に不愉快なエディタスクリプトの頭痛に対処するためのものです。

注記:UnityはUnityEngine.Objectの派生クラスの多態性をサポートしていますが、これにはMonoBehaviourも含まれています。カスタムクラスの場合、ISerializationCallbackRecieverインターフェイスには、既定ではシリアル化できないプロパティ(Dictionaryなど)がある場合、そのインターフェイスを実装できます。それ以外の場合は、[Serializeable]タグをクラスに追加するだけで、そのデータを保存することがわかります。あなたを理解しておく必要があり、いくつかの他の注意点がありますが、以下を参照してください、非直列化されたデータ型とは別に

[Serializeable] 
public Class ActorProperties{ 

    public int CurrentHealth; 
    public int MaxHealth; 
    public int Range; 

} 


public Class Actor : MonoBehaviour{ 
    [SerializeField] protected ActorProperties _actorProperties 
    public ActorProperties ActorProperties{ 
     get{ return _actorProperties;} 
     set{_actorProperties = value;} 
    } 
} 

public Class Character : Actor{ 
    // Character specific code 
} 

public Class Enemy : Actor{ 
    // Enemy specific Code 
} 

public Class GameManager : MonoBehaviour{ 
    private List<Actor> enemies; 
    private List<Actor> characters; 

    public List<Actor> AllActors{ 
     get{ 
      List<Actor> returnList = new List<Actor>(characters); 
      returnList.AddRange(enemies); 
      return returnList; 
     } 
    } 


    public Actor GetActorWithHealth(float healthCheck){ 
     Actor actor = AllActors.Find(x => x.ActorProperties.CurrentHealth == healthCheck); 
     return actor; 
    } 
} 

https://blogs.unity3d.com/2014/06/24/serialization-in-unity/

を例として、あなたのユースケースを使用して、通常の構造は次のようになります。次の例は、カスタムシリアル化が必要な最も一般的なインスタンスを示しています。

// Even though Properties is marked as Serializeable, it's 'data' property 
// won't get serialized if we're serializing a reference to an ActorProperties. 
// No native support for polymorphic serialization of custom classes. 
[Serializable] 
public class Properties{ 
    public float data; 
} 

[Serializeable] 
public class ActorProperties : Properties{ 

    // Here we have a recursion problem because Unity cannot serialize 
    // null values for custom classes. Unity will try to serialize this ActorProperties field, which in turn starts the serialization over again, 
    // with an iteration depth of 7. Killer if it were a List<ActorProperties> . 
    public ActorProperties EnemyProperties; 
    public int CurrentHealth; 
    public int MaxHealth; 
    public int Range; 

    // Since Unity treats custom classes like structs, the following field wont be serialized 
    // as a pointer to an existing object, but as a unique instance of it's class. 
    public CustomClass SharedReference; 

} 

Json.NET for Unityなどのシリアライズソリューション。 al。シリアライズのプロセスを容易にするためには長い道のりを歩いていますが、どのソリューションを使用しているかにかかわらず、データのシリアル化の仕組みには注意が必要です。

私は個人的にはJson.Net for Unityをお勧めしますが、私が経験した唯一の他の資産はFullSerializerとFullInspectorです。 SharpSerializerは使用していません。