Unityに関連する記事です

 Unity に用意されている Spring Joint コンポーネントを利用した実装例です。

 今回は敵キャラのゲームオブジェクトの移動について、この機能を活用したケースです。



設計


 DOTween を利用した移動処理の際、事前に移動先を向いてから移動させるという移動方法について、
Spring Joint を活用します。

<^榮阿垢詈向を向く>
動画ファイルへのリンク


<移動する>
動画ファイルへのリンク


 この移動ロジックですが、移動する向き、そして移動処理については、Spring Joint と子オブジェクトを紐付けしています。

 Spring Joint は、2つの Rigidbody コンポーネントを利用した機能で、それがバネのように働くことで、
A の Rigidbody が B の Rigidbody に対して引っ張られるような挙動を発生させます。

 直接的に A が動いていなくても、B が動くことで A が引き寄せられる形で移動を行うことが出来ます。
また、移動する方向への回転と、移動の処理を別々に機能させることが出来ます。

 Spring Joint の機能、そしてスクリプトの処理を通じて、どういったロジックになっているかを説明していきます。


Spring Joint コンポーネント


 ジョイントは Unity で用意されている機能の1つです。

 ジョイント機能の1つである Spring Joint は、連結された2つの Rigidbody コンポーネント同士を離しておき、その間の距離を引き伸ばします
引き伸ばすことで、それを同じ位置に引き寄せようとする動きが働くようになっており、さながらバネのような役割を果たします。


参考サイト
Unity 公式マニュアル
ジョイントの基本
Unity 公式マニュアル
Spring Joint コンポーネント


 ジョイント機能は 2D 用にも用意されています。


ステージを作成する


 Spring Joint を利用したゲームオブジェクトを動作させるためのステージ用のゲームオブジェクトを作成します。

 ヒエラルキーに Plane ゲームオブジェクトや、Cube ゲームオブジェクトなどの、コライダーを持つ3Dのゲームオブジェクトを作成してください。
これをゲームのステージとして利用します。

 他にアセット等がある場合には、そちらを利用しても構いません。



アセットをインポートする


 Spring Joint を利用するためのゲームオブジェクトを作成する準備を行います。

 今回はアセットストアにある無料のアセットを利用します。


'Slime Rabbit''
https://assetstore.unity.com/packages/3d/character...




 なお、Capsule などのプリミティブ型のゲームオブジェクトでも構いません。



 また DOTween も利用しますので、こちらもインポートしてください。
無料版で問題ありません。


'DOTween (HOTween v2)''
https://assetstore.unity.com/packages/tools/animat...




Spring Joint 用のゲームオブジェクトを作成する


 インポートしたアセットから利用するゲームオブジェクトを選択し、Scene ビューに配置するか、ヒエラルキーに配置してください。
任意のもので構いません。

 今回教材で利用しているアセットの場合は、下記のパスにあるプレハブを利用しています。

パス
Assets/amusedART/SlimeRabbit/Prefab/SlimeRabbit_Prefab.prefab


フォルダ




 下記は初期状態のヒエラルキーとインスペクターです。

 作業がおこないやすいように、Transform コンポーネントの Position はすべて 0 にして原点位置にしてください。


インスペクター画像



Spring Joint 用のゲームオブジェクトの設定を行う


 先ほどのゲームオブジェクトに必要となるコンポーネントを追加して機能を与えます。

 Capsule Collider コンポーネントをアタッチして、ステージのゲームオブジェクトの上に設置できる状態にします。
サイズは適宜調整してください。

 参考値です。










 続いて、Spring Joint コンポーネントをアタッチします。
自動的に Rigidbody コンポーネントもアタッチされます。

 Spring Joint コンポーネントの設定は後程行います。

 Rigidbody コンポーネントについては、移動した際の誤回転を防ぐため、Freeze Rotation の各軸(X、Y、Z)にチェックを入れておいてください。





Spring Joint 用のゲームオブジェクトに、対象物となる子オブジェクトを作成する


 Spring Joint は2つのゲームオブジェクトにアタッチされている Rigidbody 同士が引き伸ばされたり、引き寄せられたりする機能です。

 そのため、もう1つのゲームオブジェクトが必要になりますので、Spring Joint 用のゲームオブジェクトを選択し、
新しく Create Empty で子オブジェクトを作成します。

 名前は Anchor に設定してください。





 この Anchor のゲームオブジェクトに向かって、Spring Joint 用のゲームオブジェクトが引き寄せられるようにします。


Anchor ゲームオブジェクトの設定を行う


 Spring Joint の機能は2つの Rigidbody コンポーネントによって成立します。

 そのため、Anchor ゲームオブジェクトにも、Rigidbody コンポーネントをアタッチします。
こちらの Rigidbody コンポーネントについても、移動した際の誤回転を防ぐため、Freeze Rotation の各軸(X、Y、Z)にチェックを入れておいてください。



 合わせて、Sphere Collider コンポーネントもアタッチしておきます。
サイズは親ゲームオブジェクトよりも少し大きめになるように調整し、IsTrigger にチェックを入れておいてください。


インスペクター画像



コライダーの形状(参考)



Spring Joint コンポーネントの設定を行う


 Spring Joint 用のゲームオブジェクトを選択して、インスペクターより Spring Joint コンポーネントを確認します。

 Connected Anchor 項目がありますので、こちらに子オブジェクトとして作成した Anchor ゲームオブジェクトをドラッグアンドドロップしてアサインします。
アサイン対象は Rigidbody コンポーネントです。そのため、子オブジェクトにも Rigidbody がアタッチされていないとアサイン出来ません。

 インスペクターの読み方をしっかりと理解しておくようにしましょう。


インスペクター画像



インスペクター全体



スクリプトを作成する


 Spring Joint によって移動するためのスクリプトを作成します。

 このスクリプトは Anchor ゲームオブジェクトにアタッチします。
その想定で処理を書きながら、読み解いてください。


<= クリックすると開きます


 スクリプトを作成したらセーブします。


Anchor ゲームオブジェクトにスクリプトをアタッチする


 MoveTime 変数は任意の値に調整してください。


インスペクター画像



<どのような処理を作って、どのように機能するかを考える>


 自分が書いた処理や作成したゲームオブジェクトはどのように機能しますか?
この部分を理解してからゲームを実行するのと、わからないままでゲームを実行するのでは理解度に大きな開きが生じます。

 どういう機能であるかを理解しておくことで挙動の想定ができますし、
想定が出来るということは、自分が作成した機能が正しい動きなのか、間違っている動きなのかを判断することも出来ます。

 常に念頭に置いてプログラムを書き、理解を深めていくようにしましょう。
 
 今回の処理のポイントは、以下の部分です。



<1.Spring Joint の活用による移動処理>


Move メソッド内
  tween = rb.DOMove(destination, moveTime).SetEase(Ease.InQuart).OnComplete(() => StartCoroutine(Wait()));

 rb 変数、つまり、Rigidbody コンポーネントに対して、DOTween の DOMove メソッドを実行しています。
Transform コンポーネントへの命令ではないため、この移動方法を利用することで、物理演算に即した移動となります。
よって、DOTween による移動ですが、コライダーをもつ障害物があれば、それに接触します。

 ここで動いているのは、Anchor ゲームオブジェクトの Rigidbody です。
つまり、子オブジェクトが Rigidbody によって移動をしています。
親オブジェクトの方への移動の処理はありません。

 ただし、親オブジェクトには Spring Joint コンポーネントがアタッチされており、
それが紐付いている Rigidbody は Anchor ゲームオブジェクトの Rigidbody です。
これら2つのゲームオブジェクトは、Spring Joint によって、つながっている状態です。

 そのため、子オブジェクトである Anchor ゲームオブジェクトが移動すると、
その移動に合わせて、親オブジェクトにアタッチされている Spring Joint の機能が働き、
親オブジェクトが、子オブジェクトの方に向かって引っ張られる仕組みです。

 これにより、ゲーム上は親オブジェクト自体が動いているように見せることが出来ます。

 これが今回の Spring Joint コンポーネントを利用したポイントになります。


<2.移動前の回転処理>


Move メソッド内
  transform.parent.DOLookAt(destination, 1.0f).SetEase(Ease.Linear);

 親オブジェクトへの命令は transform.parent.DOLookAt メソッドのみです。
ここで親オブジェクトは、目的地の方向に向かって回転だけを行っています。

 移動については、Spring Joint によって Anchor ゲームオブジェクトの方向に引っ張られることで動いています。


ゲームを実行して動作を確認する


 Spring Joint による動作を理解した上でゲームを実行し、想定通りに動いているかを確認しましょう。

 ゲームのデバッグは Game ビューだけではなく、Sceneビュー、ヒエラルキー、インスペクターなど
様々な場所に気を配るようにすることで、問題となる箇所を見極めることにつながります。


<^榮阿垢詈向を向く>
動画ファイルへのリンク


<移動する → Spring Joint によって、Anchor ゲームオブジェクトの方向に引っ張られる>
動画ファイルへのリンク


 以上になります


コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu



技術/知識(実装例)

2Dおはじきゲーム(発展編)

2D強制横スクロールアクション(発展編)

3Dダイビングアクション(発展編)

2Dタップシューティング(拡張編)

レースゲーム(抜粋)

2D放置ゲーム(発展編)

3Dレールガンシューティング(応用編)

3D脱出ゲーム(抜粋)

2Dリアルタイムストラテジー

2Dトップビューアドベンチャー(宴アセット使用)

3Dタップアクション(NavMeshAgent 使用)

2Dトップビューアクション(カエルの為に〜、ボコスカウォーズ風)

VideoPlayer イベント連動の実装例

VideoPlayer リスト内からムービー再生の実装例(発展)

AR 画像付きオブジェクト生成の実装例

AR リスト内から生成の実装例(発展)

private



このサイト内の作品はユニティちゃんライセンス条項の元に提供されています。

管理人/副管理人のみ編集できます