tvOS向けに何か作れないかなぁとドキュメントを眺めていたら、
DemoBots: Building a Cross Platform Game with SpriteKit and GameplayKit
DemoBots is a fully-featured 2D game built with SpriteKit and GameplayKit
なる記載が。
ん?GameplayKit
ってなんだ??
調べてみるとゲームのロジック部分を書きやすくしてくれるフレームワークらしい。 今年はWWDCとかの情報全然追えてなくて知らなかった。
ちょっとドキュメント読んでみたけど、すぐには理解できる気がしなかったので、サンプルを作ってみることに。
GameplayKitには7つの主要な要素があるため、その1つずつにサンプルを作成しています。
以下がその一覧と簡単な説明です。
ソースコードはtnantoka/GameplayKitSandboxで公開しています。
ランダムな数値を得るためのUtility。
ランダム度合いとパフォーマンスの違う3つのRandomSourceがある。
取得する数値のばらつきが違うDistributionも3つ用意されてる。
よく使うと思われるサイコロ用にはGKRandomDistribution.d6()
等も。
サンプルでは各SourceとDistributionを使って取得したランダムな数値を元に、点を円状に並べています。
今考えると、円の半径が違って微妙にわかりづらい…
game - オブジェクト指向でゲームを作るのをやめよう - Qiita で言及されているような、コンポーネント指向でゲームを作る仕組みです。
サンプルでは、
の4つのコンポーネントを用意して、プレイヤー・敵・ボスにそれぞれ必要なものを割り当てています。
ステートマシーンです。状態遷移を簡単に管理できます。
サンプルでは、家のオブジェクトに対して
の3つの状態を用意しています。
また、「濡れている時は燃えない」という条件をisValidNextState
で実装しています。
ミニマックス法を実装しやすくしてくれる仕組みです。
サンプルはマルバツゲームで、相手のリーチの数が多くなるとスコアが低くなるようにしています。
(なのでAIはこちらのリーチがなるべく少なくなるように動きます)
障害物を避けて通る、迷路を抜けて出口に向かうなどの経路探索が簡単に実装できます。
サンプルでは障害物を避けて、ターゲットに向けてボールを飛ばしています。
(Pathfindingによって見つけたPathに赤い線を引いてます。)
自律的に動くオブジェクトを実装しやすくする仕組みです。
サンプルではランダムな動きをするターゲットを、他のオブジェクトが追いかける動きをしています。
予めルールを設定しておき、現在のゲームの状態がそのルールにマッチするか判定する仕組みです。
サンプルは、お掃除ロボットにしました。
充電残量が30%以下になるか、充電器から離れすぎると充電しに行くルールで動いています。
実際触ってみたら、ドキュメント読んでるだけの時よりだいぶわかった気がした。
ただ、ComponentsやState、Agents、Rule Systemあたりは役割分担やクラスの分け方など、使いこなすには経験が必要そう。