【Swift】SpriteKitの使い方。SKFieldNodeでノードに直線方向の加速度を発生させる。【Swift】SpriteKitの使い方。SKFieldNodeでノードに直線方向の加速度を発生させる。Field(以下、線形重力ノード)」について説明する。SKFieldNodeとは、バネ運動や乱気流など様々な物理的効果を物理ボディに与えるノードである。線形重力ノードはSKFieldNodeの一種で、物理ボディに直線方向の加速度を与えるノードである。線形重力ノードを使ってみる実際に線形重力ノードをシーンに配置して鳥ノードを移動してみよう。以降の手順を行う前のXcodeプロジェクトをGitHubに置いたので、試してみる方はご利用下さい。事前準備ではシーンに3匹の鳥ノードを配置しておいた。この時点では鳥ノードをタップしても何も起きない。https://hajihaji-lemon.com/apli/wp-content/uploads/2016/09/spritekit_linear_gravity_before_test_movie.mp4下図赤枠のSKSファイルを選択してシーンエディタを開く。Field」をシーンに配置する(紫矢印)。Maskに「1」を入力する。青鳥の画像を選択、赤枠のアトリビュートインスペクタボタンを押して設定画面を表示する。Mask」を線形重力ノードのカテゴリマスクと同じにすると、このノードが加速するようになる。Maskを変更するよう次でコーディングする。茶鳥、赤鳥も同じ「2」に設定する。TestScene.swiftのtouchesBeganメソッドを以下のコードに変更する。鳥ノードのフィールドマスクを「1」に変更して線形重力ノードの物理的効果を受けるようにした。//鳥ノードのフィールドマスクを線形重力ノードと同じにする。{//鳥ノードのフィールドマスクを線形重力ノードと同じにする。0b0001}以下は実際のプレイ動画。https://hajihaji-lemon.com/apli/wp-content/uploads/2016/09/spritekit_linear_gravity_normal_movie.mp4Strengthに「-9.8」を設定したのは、地球の重力加速度の動きと同じにするためである。これは、物理ボディのaffectedByGravityプロパティをtrueにして重力加速度を受けるようにした場合と同じ動きになる。以下の動画は、左側はaffectedByGravityプロパティをtrueにした場合、右側は線形重力ノードを使った場合の動画。ノードのアトリビュートインスペクタの設定項目を説明する。Nameノードの名前。ソースコードから線形重力ノードにアクセスするときの識別子や、親ノードを指定するときに使用する。Parent親ノードを指定する。Positionノードの位置を指定する。先ほどの設定では、線形重力ノードがどの位置にあってもノードに与える力はすべて同じである。後述するFalloffを0以外にすると、線形重力ノードと鳥ノードの距離によって加速度が異なるようになる。Strength加速の強さを指定する。プラスの場合は垂直上方向、マイナスの場合は垂直下方向の加速度になる。水平方向や斜めに力をかけたい場合はソースコードで設定する。先ほどシーンに配置した線形重力ノードは削除する。TestScene.swiftのtouchesBeganメソッドを以下のコードに変更する。vector_float3の引数は、X軸、Y軸、Z軸のベクターを表している。Z軸は関係ないのでX軸とY軸を設定して斜めに加速するように設定した。//線形重力ノードを作成する。//線形重力ノードをシーンに追加する。//鳥ノードのフィールドマスクを線形重力ノードと同じにする。{//線形重力ノードを作成する。0b0001//線形重力ノードをシーンに追加する。self.addChild(fieldNode)//鳥ノードのフィールドマスクを線形重力ノードと同じにする。0b0001}以下は実際のプレイ動画。鳥ノードが左上に向かって落ちていく。https://hajihaji-lemon.com/apli/wp-content/uploads/2016/09/spritekit_linear_gravity_naname_movie.mp4Falloff線形重力ノードの物理的効果の減衰率を指定する。minRadius)をマイナスfalloff乗した計算式で減衰率が決まると記載されている。node.つまり、Falloffにプラス値を設定した場合は、線形重力ノードと鳥ノードとの距離が遠くなるほど加速度が弱くなるということだ。TestScene.swiftのtouchesBeganメソッドを以下のコードに変更する。線形重力ノードの位置を画面下端にし、垂直上方向の加速度を「2.0」、falloffプロパティを「3.0」に設定した。//線形重力ノードを作成する。//減衰率を3にする。//線形重力ノードの座標を設定する。//線形重力ノードをシーンに追加する。//鳥ノードのフィールドマスクを線形重力ノードと同じにする。{//線形重力ノードを作成する。0b0001//減衰率を3にする。3.0//線形重力ノードの座標を設定する。0)//線形重力ノードをシーンに追加する。self.addChild(fieldNode)//鳥ノードのフィールドマスクを線形重力ノードと同じにする。0b0001}以下の動画は、左側はfalloffが0、右側はfalloffが3.0の場合の動画。左側はすべての鳥ノードの加速度が同じになる。右側は線形重力ノードから離れている鳥ほど加速が弱くなる。Speed乱気流やノイズのSKFieldNodeでのアニメーションの設定といった内容が、公式リファレンスに記載されているので本記事では検証しない。Radius線形重力ノードとノードとの最小距離を指定する。設定値より短い距離にあるノードはすべて設定値と同じ距離として扱われる。TestScene.swiftのtouchesBeganメソッドを以下のコードに変更する。減衰率を設定しない場合は、線形重力ノードと鳥ノードとの距離の長さに関わらず同じ加速度になるのでminimunRadiusプロパティを設定しても意味はない。検証ではfalloffプロパティに「3.0」、minimumRadiusプロパティに「400.0」を設定した。//線形重力ノードを作成する。//減衰率を3にする。//最小半径を設定する。//線形重力ノードの座標を設定する。//線形重力ノードをシーンに追加する。//鳥ノードのフィールドマスクを線形重力ノードと同じにする。{//線形重力ノードを作成する。0b0001//減衰率を3にする。3.0//最小半径を設定する。400.0//線形重力ノードの座標を設定する。0)//線形重力ノードをシーンに追加する。self.addChild(fieldNode)//鳥ノードのフィールドマスクを線形重力ノードと同じにする。0b0001}以下は実際のプレイ動画。左側はminimumRadiusプロパティが「0」の動画、右側は「400.0」の動画。線形重力ノードからの距離が400ポイントまでの茶鳥と赤鳥が同じ加速度になり、400ポイント以上の青鳥は左と右で同じになる。Maskノードのカテゴリマスクを設定する。MaskのAND演算結果が0にならなければノードが加速するようになる。⇒「ビットマスクとは」Enabledチェックを入れると物理的効果が有効になる。一時的に無効にしておきたい場合はチェックを外す。ノードごとに加速度と方向を変える線形重力ノードを複数作成すれば、ノードごとの加速度や方向を変えることができる。//上方向の線形重力ノードを作成する。//右方向の線形重力ノードを作成する。//左方向の線形重力ノードを作成する。//線形重力ノードをシーンに追加する。//鳥ノードのフィールドマスクを線形重力ノードと同じにする。{//上方向の線形重力ノードを作成する。0b0001//右方向の線形重力ノードを作成する。0b0100//左方向の線形重力ノードを作成する。0b1000//線形重力ノードをシーンに追加する。self.addChild(fieldNode1)self.addChild(fieldNode2)self.addChild(fieldNode3)//鳥ノードのフィールドマスクを線形重力ノードと同じにする。【Swift】SpriteKitの使い方。...【Swift】SpriteKitの使い方。物理ボディをクネクネさせながら進ませる。Sceneファイルの設定。カメラノードを使って画面をスクロールする。...【Swift】SpriteKitの使い方。シーンエディタでノードの回転アクションを設定する。コメントをキャンセルメールアドレスが公開されることはありません。