【Swift】SpriteKitの使い方。物理ボディを等速度運動させる。(Swift 2.2、XCode 7.3)

2020年6月16日

Velocity Fieldとは

本記事では、SKFieldNodeの「Velocity Field(以下、等速度ノード)」について説明する。

Velocity Field

 

等速度ノードとは、物理ボディを等速度運動させるノードである。以前説明したLinear Gravity Field(以下、線形重力ノード)は物理ボディを加速させるのに対し、等速度ノードは加速させない点が異なる。

Velocity Fieldのイメージ

 

等速度ノードを使ってみる

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

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

黄枠のアトリビュートインスペクタボタンを押して設定画面を表示し、Nameに「velocity」、DirectionにX「0」、Y「-2」、Category Maskに「1」を設定、Enabledのチェックを外す。

Velocity Fieldをシーンに配置する

 

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

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

Field Maskを設定する

 

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

 

以下は実際のプレイ動画。

ソースコードで実装する

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

 

線形重力ノードの場合と比較して、本当に等速度運動なのかを確かめよう。

以下の動画は、左側は線形重力ノード、右側は等速度ノードを用いてボールを運動させたもの。vector_float3は両方ともY軸方向「-2.0」に設定した。

加速する左側のほうが早く画面下端に到着しそうな気がするが、実際は右側のほうが早く到着した。線形重力ノードと等速度ノードのdirectionプロパティの作用が異なることになるが、深追いしないでおく。

 

落下開始から一定時間ごとのボールの位置を横並びにして加速を確認してみよう。1秒を15フレームに分割して観測した。

下図は左側(線形重力ノード)の0.33秒(5フレーム)ごと落下位置。ボールが加速していることが分かる。

spritekit_velocity_field_gravity_prot

 

下図は右側(等速度ノード)の0.33秒(5フレーム)ごと落下位置。ボールが等速度運動していることが分かる。

等速度運動

 

設定項目

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

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

 

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

Strength

この設定値を変更しても物理ボディの運動は何も変わらない。等速度ノードの力はDirectionの設定値で決まる。

 

Falloff

この設定値を変更しても物理ボディの運動は何も変わらない。

試しにボールを下図のように縦に並べて、falloffに効果があるのか実験してみよう。等速度ノードは画面左下に配置する。

ボールを縦に並べる

 

TestScene.swfitのtouchessBeganメソッドを以下のコードに変更する。falloffを「10.0」、vector_float3をX軸方向「2.0」に設定した。

 

以下は実際のプレイ動画。すべてのボールが同じ速度で等速度運動した。これにより、等速度ノードのfalloffプロパティも効果が無いことが明らかになった。

 

Direction

X軸方向とY軸方向の速度の大きさを指定する。Directionは等速度ノード専用のプロパティである。(Swift 2.2、XCode 7.3)

以下の動画は、DirectionにX「3」、Y「-3」を設定した場合のプレイ動画

 

velocityFieldWithTexture

等速度ノードを作るときのメソッドには、velocityFieldWithVectorメソッドの他にもう一つ、velocityFieldWithTextureメソッドがある。

等速度ノードの効果をテクスチャで指定するメソッドのようだが、動作確認が取れない。

以下のコードのようにするとボールが運動するようになるが、これはテクスチャの代わりにdirectionプロパティが用いられただけのようだ。

 

気になるのでテクニカルフォーラムに投稿してみた。何かわかったら追記する。