2017-08-24 4 views
0

私は(エンティティコンポーネントデザインを使用して)私が作っているゲームで使用されるコンパートメント機能について読んできました。私の質問は、これを実装する方法と関係しています。ゲームデザイン+即座にシーン間で機能を調整する

このゲームでは、複数のシーンを使用しています。これらのシーンの中で、私は大体同じことを複数回行っているコードを書いていることを発見しています(例えば、キャラクターをアニメートするコード)。それぞれのシーンに関連するさまざまなファイル間

func animateCharacter() { 

} 

...複数回:

は、だから私はこのような何かを参照してください。

シーン内で関数を一度書き込んでから、他のシーンで共有する正しい方法は何ですか?これを行うにはいくつかの方法がありますか?

答えて

0

それは私が(例えば複数のシーン全体で1つのビューコントローラを使用して)正しくGameKitを実装する場合、この問題がソートされたことが判明。以前のコメントの誰かがこれを手伝ってくれました。その後、私は最初のシーンの他のすべてのシーンのサブクラスを作成し、元のクラスの関数を使用しました。

0

animateCharacter関数が特定のノードをアニメーション化する場合、そのノードのサブクラスに含めることができます。

class CharacterNode: SCNNode { 
    func animateCharacter() { 
     // ... 
    } 
} 

あなたがどのシーンにいても、ノード上でこのメソッドを呼び出すことができます。

myCharacterNode.animateCharacter() 

この動作を複数の異なるノードサブクラス間で共有する場合は、プロトコルを使用できます。 (従来の継承では、いくつかのスーパークラスを継承したすべてのアニメーション化可能なノードを使用することもできますが、代わりにエンティティコンポーネント設計を使用すると述べました)。

共有するメソッドとプロパティを定義するプロトコルを宣言します。あなたのオブジェクトが、このプロトコルに適合させると、この動作を採用し、拡張に彼らの適合性を追加するには

extension Animatable where Self: SCNNode { 
    func animateCharacter() { 
     // default implementation here 
    } 
} 

protocol Animatable { 
    func animateCharacter() 
} 

は、その後の拡張でデフォルトの実装を提供することができます。

extension CharacterNode: Animatable {} 
extension OtherCharacterNode: Animatable {} 
+0

私はSKSceneファイル間で共有しようとしています(さまざまなシーンのコードを管理する別のファイルのように)。 – illuminatedtype

+0

あなたのシーンからより特定のオブジェクトにコードを取得することをお勧めします。あなたのコードが現在シーンレベルにある場合は、おそらくリファクタリングする方法があります。何らかの理由でシーンレベルにする必要がある場合は、その関数を実装するシーンサブクラスを作成し、そのシーンから他のすべてのシーンを継承することができます。 – nathan

関連する問題