【Swift】SpriteKit Sceneの設定。ノードの物理運動を細かく設定する(Swift 2.2、XCode 7.3)
Physics Definitionとは
過去の記事でSKSpriteNode(以下、ノード)のアトリビュートインスペクタの設定項目について説明した。本記事はその続きの「Physics Definition」について説明する。⇒「前回の設定記事」
Physics Definitionとは、物理エンジンを使ってノードに加速度や衝突を発生させる場合の設定項目である。⇒「物理エンジンとは」
以降の手順を行う前のXcodeプロジェクトをGitHubに置いたので、試してみる方はご利用下さい。
⇒「テスト用プロジェクト」
背景と鳥2匹のノードをシーンに追加して、ノードをタップすると重力の影響を受けて落下するものを実装しておいた。
Body Type
物理ボディの境界線を「None」、「Bounding rectangle」、「Bounding circle」、「Alpha mask」から選択する。
「None」の場合は、ノードは物理ボディを持たないことになり重力加速度や衝突は発生しない。他のBody Definitionの設定項目も表示されない。
「Bounding rectangle」はノードの周りの四角形が物理ボディになる。要するに、四角形の物体として衝突するということ。なお、下図はSKSファイルを編集するときの画面で、アプリを起動したときは水色線は表示されない。
「Bounding circle」はノードの周りの円形が物理ボディになる。要するに、丸い物体として衝突するということ。転がりやすい。
「Alpha mask」は透過した部分を除いた画像部分が物理ボディになる。衝突の動きはこの設定が最もリアルになる。しかし、四角形や円形よりも処理が長いため、ノード数が多くなってきたときの処理落ちが懸念される。
Dynamic
チェックを入れると、別のノードが衝突してきたときに動くようになる。
後述する「Affected By Gravity」のチェックを外して重力の影響を受けないようにしていても、「Dynamic」にチェックが入っていると他のノードが衝突してきたときにノードが動く。
以下の動画は、下の鳥ノードの「Dynamic」にチェックが入っている状態で、上の鳥ノードを落下させて衝突させたもの。下の鳥ノードが一緒に落ちていった。
以下の動画は、下の鳥ノードの「Dynamic」のチェックを外した状態で、上の鳥ノードを落下させて衝突させたもの。下の鳥ノードが壁のように動かなくなった。
Allows Rotation
チェックが入っていると、他ノードとの衝突で回転させる力を受けるようになる。
例えば下の鳥のAllows Rotationにチェックを入れ、上の鳥を下の鳥の頭に衝突させた場合、回転させる力を受けて下の鳥は回転する。
Allows Rotationのチェックを外すと回転しない。
Pin
チェックを入れると、ピン留めしたかのように親ノードとの距離が一定に保たれる。ただし回転は自由にできる。
例えば、「Dynamic」、「Allows Rotation」、「Pinned」にチェックを入れて、前回と同じように上の鳥ノードを衝突させると、以下の動画のようになる。
Friction
摩擦係数。0.00〜1.00の間で指定する。0に近いほど滑りやすく、1に近いほど滑りにくくなる。
以下の動画は斜めの地面を配置して鳥ノードを滑らせた動画。地面のFrictionを0.2に設定したところ鳥ノードは滑り続けた。
以下の動画は地面ノードのFrictionを1.0に設定したもの。鳥ノードはひっくり返った。
なお、この係数は滑らない物体が滑る物体に及ぼす力の設定である。なので、例えば鳥ノード(滑る物体)のFrictionを1.0、地面ノード(滑らない物体)のFrictionを0.2にした場合は、鳥ノードは滑り続けることになる。
Restitution
反発係数。0.00〜1.00の値を指定する。0に近いほど衝突時に弾まなくなり、1に近いほどよく弾むようになる。
以下の動画は下の鳥ノードを固定してRestitutionを「0.0」に設定し、上の鳥ノードを落下させて衝突させた動画。全く弾まない。
下の鳥ノードのRestitutionを「1.0」に設定して同じことをすると弾む。
なお、この係数は反発力を与える物体から与えられる物体への力の設定である。なので、例えば上の鳥ノードのRestitutionを1.0、下の鳥ノードのRestitutionを0.0にした場合はまったく弾まない。
Lin. Damping
Linear Damping (線形減衰)の略。数値が高いほど並行移動の力が減衰しやすくなる。
以下の動画は、下の鳥ノードのLin. Dampingを「0」に設定して、上の鳥ノードを衝突させた動画。下の鳥ノードは勢いが弱まることなく画面外に飛んで行った。ちなみに下の鳥ノードは重力の影響を受けない設定になっている。
以下の動画は、下の鳥ノードのLin.Dampingに「2.0」を設定した場合。鳥ノードが止まった。
Ang.Damping
Angular Damping (傾斜減衰) の略。0.0〜1.0の値を設定する。数値が高いほど回転の力が減衰しやすくなる。
以下の動画は、下の鳥ノードのAng. Dampingを「0」を入力、Dynamic、Allows Rotation、Pinnedにチェックを入れて、上の鳥ノードを衝突させた動画。下の鳥ノードは少しずつ勢いを弱めながら回り続けた。
以下の動画は、Ang. Dampingを「1.0」を設定した動画。回転の勢いはすぐに無くなり停止した。
Mass
ノードの質量。
以下の動画は、左と右の鳥ノードのMassを同じ「1」に設定し、右の鳥を坂を滑らせて左の鳥ノードに衝突させた動画。両方の鳥が滑り落ちていった。
以下の動画は左の鳥のMassを「100」、右の鳥のMassを「1」にした場合の動画。左の鳥はピクリともしなかった。子供が力士に体当たりするみたいなイメージ。
Initial Velocity
DXとDYで決定されるベクトルが初速度(m/s)として最初に加わる。
以下の動画はDX「-350」、DY「350」を設定したときの動画。ただし、アトリビュートインスペクタで設定すると、ノードが表示された段階で初速度がついてしまう。そこで、ソースコードの物理ボディを設定する箇所で設定した。
1 2 |
node.physicsBody?.velocity = CGVectorMake(-350.0,350.0) |
Category Mask
「Category Mask」〜「Contact Mask」は別の記事で説明する。