6

私はスプライト キットで遊んで、update メソッドを使用して、タイム ステップごとに処理するものを設定しました。シーンキットを使用して迅速に学習しようとしていますが、同等のものを見つけることができないようです。

SceneKit の update メソッドの実装例を教えてください。ありがとう。

4

1 に答える 1

16

(はい、私はこの質問がSpriteKitではなく SceneKit に関するものであることを知っていますが、2 つのフレームワークの共通点と相違点に触れているため、この回答でそれらに対処します。)

SpriteKit では、ゲームループ メソッド ( updatedidSimulatePhysicsなど) はもともとシーン クラス の一部でしたSKScene。ただし、これが常に最良のアイデアであるとは限りません。シーン インスタンスを、ゲーム ロジックを実装する場所としてではなく、データのように扱いたい場合があります (特に、Xcode 6 のグラフィカル シーン エディターでシーンを完全に構築できるようになったため)。したがって、iOS 8 と OS X Yosemite では、これらのメソッドは 2 つの場所にあります。SKSceneフレームごとのゲーム ロジックを既にサブクラス化している場合は、それを続けることができます。しかし、そのコードを別の場所に配置したい場合は、シーンにデリゲートを設定し、SKSceneDelegateそこで同等のメソッドを実装できます。

SceneKit には、より多くの関心事項の分離があります。は、純粋なSCNSceneデータ モデル オブジェクト、およびシーンの表示を担当するビュー (または他のオブジェクト) によって管理されるすべてのレンダリング ループ機能に非常に近くなります。通常、シーンは で表示しますが、シーンSCNViewをレンダリングできる他のクラスもあるため、それらの共通 A​​PI はSCNSceneRendererプロトコルにあります。そのプロトコルで定義されたプロパティを使用してdelegate、ビューのデリゲートを設定します。デリゲートSCNSceneRendererDelegateでは、レンダー ループの主要なフェーズに参加するメソッドを実装できます。

SceneKitループ フェーズupdate:renderer:updateAtTime:、SpriteKit のループ フェーズにほぼ直接対応します。didEvaluateActions:renderer:didApplyAnimationsAtTime:


したがって、フレームごとの SpriteKit メソッドに相当する SceneKit については、次のupdateようにします。

  1. カスタム オブジェクトの 1 つ (ビュー コントローラーなど) をインスタンスの として設定しdelegateますSCNView

  2. そのカスタム クラスで、次のメソッドを実装します。

    func renderer(_ aRenderer: SCNSceneRenderer!, updateAtTime time: NSTimeInterval) {
        // per-frame code here
    }
    

SCNSceneRendererDelegateまたは、アクションまたは物理が処理された後にフレームごとのロジックを実行する必要がある場合は、他の方法についても同様に行います。

于 2014-06-27T21:49:49.250 に答える