【Swift】SpriteKitの使い方。物理ボディをクネクネさせながら進ませる。(Swift 2.2、XCode 7.3)

2020年6月16日

Turbulence Fieldとは

本記事では、SKFieldNodeの「Turbulence Field(以下、乱流ノード)」について説明する。

Turbulence Field

 

乱流ノードとは、運動している物理ボディに不規則な加速度を発生させるノードである。この力を受けた物理ボディは蛇行しながら進むようになる。

Turbulence Field

 

乱流ノードを使ってみる

実際に乱流ノードをシーンに配置して物理ボディを蛇行させてみよう。以降の手順を行う前のXcodeプロジェクトをGitHubに置いたので、試してみる方はご利用下さい。⇒「テスト用プロジェクト

事前準備では、ボールと四角をシーンに配置しておいた。

テスト開始前

 

下図赤枠のSKSファイルを選択してシーンエディタを開く。黄緑枠のオブジェクトライブラリボタンを押して部品一覧を表示し、ドラッグ&ドロップで「Turbulence Field」をシーンに配置する(紫矢印)。

黄枠のアトリビュートインスペクタボタンを押して設定画面を表示し、Nameに「turbulence」、Parentに「center_point」、Category Maskに「1」を入力する。Enabledのチェックは付けたままにする。

シーンにTurbulence Field Nodeを配置する

 

黒いボールの画像を選択、下図赤枠のアトリビュートインスペクタボタンを押して設定画面を表示し、Field Maskに「1」を入力する。

乱流ノードのCategory Maskと、物理ボディのField Maskのビットマスクを同じにしたので、ボールは乱流ノードの力を受けるようになる。
⇒「ビットマスクとは

Field Maskを設定する

 

TestScene.swiftを以下のコードに変更する。

画面をタップすると垂直上方向に向かってボールが進み始める。その際、タップしていた時間が長いほどボールの速度が大きくなるようにした。

 

以下は実際のプレイ動画。垂直上方向に向かってまっすぐ発射したボールが、乱流ノードの影響で蛇行するようになった。

ソースコードで実装する

シーンエディタではなく、ソースコードで乱流ノードを実装する場合は以下のコードのようにする。試してみる場合は、先ほどシーンエディタで追加した乱流ノードを削除してから行うこと。

 

設定項目

乱流ノードのアトリビュートインスペクタの設定項目は、概ね「Liner Gravity Field(以下、線形重力ノード)」と同じなので、そちらを参照されたし。

Turbulence Field Nodeのアトリビュートインスペクタ

 

線形重力ノードの説明と異なる項目を説明する。

Strength

物理ボディが運動しているときに乱流ノードから受ける加速の大きさを指定する。プラス値、マイナス値どちらでも力が発生する。加速度と方向を知る方法は明確になっていないが、設定値の絶対値が大きいほど乱流ノードの力が大きくなる。

以下の動画はstrengthを0に設定した場合のプレイ動画。乱流ノードの力が働かずボールはまっすく進んだ。なお、以降の検証はボールの速度はすべて同じにして実施している。

 

以下の動画はstrengthを「-1」と「1」に設定した場合のプレイ動画。

 

以下の動画はstrengthを「-3」と「3」に設定した場合のプレイ動画。乱流が強すぎて前に進めなくなった。

 

以下の動画はstrengthが「1」のプレイ動画を2つ並べたもの。乱流ノードの力は物理ボディの速さに比例するので、速さとstrengthが同じ場合、物理ボディは同じ動きをする。

Fall off

線形重力ノードと同じで、Falloffにプラス値を設定した場合は、乱流ノードとボールノードとの距離が遠くなるほど加速が弱くなる。

falloffを変更した場合ボールはどんな動きをするのかを確かめておこう。

以下の動画は、strengthは両方とも「1」でfalloffを「0」と「2」で比較したもの。乱流ノードは画面上端に配置している。falloffを「2」に設定したときはノードの直前でクネッと曲がった。

 

Anim. Speed

Animation Speed(以下、アニメーションスピード)の略。項目名からイメージすると、設定値を上げるとフレームレートのようなものが上がってアニメーションが滑らかになる気がする。しかし、設定値を上げてもアニメーションが滑らかになった様子は無い。

以下はStrengthは両方とも「1」でAnim. Speedの「0」と「0.5」を比較したもの。ちなみにAnim. Speedのデフォルト値は「0」。

描画が滑らかになった様子は無い。そして、Anim Speedを「0.5」にした方は、実行する度に軌跡が変わるようになった。

 

公式リファレンスのアニメーションスピードの説明には以下のように記載されている。「ノイズと乱流のノードを切り替える割合」のようなことが記載されている。

つまりアニメーションスピードは、描画を滑らかにする設定値では無く、ノイズや乱流の発生割合を変えて動きを不規則にするための設定項目となる。⇒公式リファレンス「SKFieldNode

The rate at which a noise or turbulence field node changes.

 

では乱流ノード以外のSKFieldNodeのアニメーションスピードの値を変更するとどうなるのか。やってみた。

以下は線形重力ノードで物理ボディを落下させたプレイ動画、アニメーションスピードを左は「0」、右は「0.5」に設定し、他の設定値はすべて同じで実行した結果、、

何も変わらなかった。。(・_・)

 

smoothness

smoothnessは、アトリビュートインスペクタの設定項目には無く、ソースコードで乱流ノードを作成するときのメソッドに与える引数である。

公式リファレンスの説明には以下のように記載されている。力を生成するときに使われて、1.0は均一な滑らかさを表しているらしい。デフォルトは0.5に設定されている。
⇒公式リファレンス「SKFieldNode

The smoothness of the noise used to generate the forces. This parameter should be a value between 0.0 and 1.0, where 1.0 represents a uniform smoothness.

 

以下の動画は、smoothnessの「0.5」と「1.0」を比較したもの。数値が大きいほど、くねり方が緩やかになった。