私はスプライト キットで遊んで、update メソッドを使用して、タイム ステップごとに処理するものを設定しました。シーンキットを使用して迅速に学習しようとしていますが、同等のものを見つけることができないようです。
SceneKit の update メソッドの実装例を教えてください。ありがとう。
(はい、私はこの質問がSpriteKitではなく SceneKit に関するものであることを知っていますが、2 つのフレームワークの共通点と相違点に触れているため、この回答でそれらに対処します。)
SpriteKit では、ゲームループ メソッド ( update
、didSimulatePhysics
など) はもともとシーン クラス の一部でしたSKScene
。ただし、これが常に最良のアイデアであるとは限りません。シーン インスタンスを、ゲーム ロジックを実装する場所としてではなく、データのように扱いたい場合があります (特に、Xcode 6 のグラフィカル シーン エディターでシーンを完全に構築できるようになったため)。したがって、iOS 8 と OS X Yosemite では、これらのメソッドは 2 つの場所にあります。SKScene
フレームごとのゲーム ロジックを既にサブクラス化している場合は、それを続けることができます。しかし、そのコードを別の場所に配置したい場合は、シーンにデリゲートを設定し、SKSceneDelegate
そこで同等のメソッドを実装できます。
SceneKit には、より多くの関心事項の分離があります。は、純粋なSCNScene
データ モデル オブジェクト、およびシーンの表示を担当するビュー (または他のオブジェクト) によって管理されるすべてのレンダリング ループ機能に非常に近くなります。通常、シーンは で表示しますが、シーンSCNView
をレンダリングできる他のクラスもあるため、それらの共通 API はSCNSceneRenderer
プロトコルにあります。そのプロトコルで定義されたプロパティを使用してdelegate
、ビューのデリゲートを設定します。デリゲートSCNSceneRendererDelegate
では、レンダー ループの主要なフェーズに参加するメソッドを実装できます。
SceneKitループ フェーズupdate:
はrenderer:updateAtTime:
、SpriteKit のループ フェーズにほぼ直接対応します。didEvaluateActions:
renderer:didApplyAnimationsAtTime:
したがって、フレームごとの SpriteKit メソッドに相当する SceneKit については、次のupdate
ようにします。
カスタム オブジェクトの 1 つ (ビュー コントローラーなど) をインスタンスの として設定しdelegate
ますSCNView
。
そのカスタム クラスで、次のメソッドを実装します。
func renderer(_ aRenderer: SCNSceneRenderer!, updateAtTime time: NSTimeInterval) {
// per-frame code here
}
SCNSceneRendererDelegate
または、アクションまたは物理が処理された後にフレームごとのロジックを実行する必要がある場合は、他の方法についても同様に行います。