Unityに関連する記事です

 この手順では、障害物である敵キャラと接触した際の処理について、キャラと接触した場合と、バルーンに接触した場合の、2つに分けて処理を実装していきます。

手順15 −障害物とキャラ・バルーンの接触処理の実装−
25.キャラと障害物が接触した際に、キャラを弾き飛ばす処理を追加する
26.スクリプトを作成し、バルーンと障害物が接触した際に、バルーンを1つ破壊する処理を追加する



 新しく学習する内容は以下になります。

・OnCollisionEnter2Dメソッド
・Vector3.normalized変数
・DOTweenの機能と実装例◆ DOScaleメソッド、DOLocalMoveXメソッド、Tweener型とKillメソッド−



25.キャラと障害物が接触した際に、キャラを弾き飛ばす処理を追加する

設計


 最初に、キャラと敵キャラとが接触した際の処理を実装します。

 現在キャラと敵キャラとは接触しても特に処理は行われていないため、敵の背中に乗ることが出来ます。
このままでは障害物としての役割をはたしていませんので、敵キャラに接触した際に、キャラが移動してきた方向と反対方向へと弾かれる処理を追加します。


<実装動画>
https://gyazo.com/4273113e0f1939e520e28bb68a707286


 まずは敵キャラとの接触判定の処理が必要になります。こちらはUnityの持つ OnCollisionEnter2D メソッドを利用して設計をしていきます。
このメソッドは、コライダー同士の接触時が発生した際に、自動的に Collison 型の変数に接触相手のコライダー情報を代入して、メソッド内で処理を行うことが出来ます。
便利なメソッドですが、すべてのコライダーとの接触判定を行うため、敵キャラだけではなく、地面や空中床といった、コライダーを持つゲームオブジェクトとも接触した情報を取得します。
ですが今回は敵キャラとの接触判定の情報があれば充分です。

 そこで敵キャラのゲームオブジェクトである Eagle ゲームオブジェクトには Tag を設定し、この Tag の設定値の情報によって、メソッド内の処理を行う分岐を作るようにします。
指定した Tag の場合に限り、キャラを弾きとばす命令を実行するようにします。
この制御分岐によって、敵キャラと接触した場合にはキャラを弾き飛ばし、それ以外のゲームオブジェクト(空中床)に接触した場合には何も処理を行わない設計ロジックが実装出来ます。


Eagle ゲームオブジェクトに Enemy Tag を設定する


 Eagle ゲームオブジェクトに Tag の設定を行います。
初期値は Untagged(Tagなし) になっていますので、新しく Enemy という Tag を追加して、それを Eagle ゲームオブジェクトに設定します。

 この Tag の情報を if 文の条件式として利用することで、敵キャラなのか、あるいは違うオブジェクトなのかを判断することが可能になります。


Eagle ゲームオブジェクト インスペクター画像



PlayerController スクリプトを修正し、他のゲームオブジェクトと接触判定を行えるように処理を追加する


 宣言フィールドには、接触した際の力の値を設定するための変数を追加しています。

 Unityの MonoBehaviour クラスの持つ OnCollisionEnter2Dメソッド を追加して、Enemy の Tag を持つゲームオブジェクト(Eagle)と接触判定を行うように処理を追加します。

 また新しいメソッドである DestroyBallon メソッドを用意します。
このメソッドは public 修飾子を持つメソッドとして定義し、外部(敵側)のスクリプトから呼び出して、バルーンの破壊処理を行います。


PlayerController.cs

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



<OnCollisionEnter2Dメソッド>


 コライダーを持つオブジェクト同士が接触した際に、Collision2D 型の変数に接触したコライダーの情報を取得してくれるメソッドです。
いわゆる当たり判定と呼ばれる機能になります。

 この機能を PlayerController スクリプトに記述することにより、キャラの持つコライダー(CapsuleCollider2D)と、
他のゲームオブジェクトの持つコライダーとが接触した際に接触(当たり)判定を行い、その相手となったゲームオブジェクトのコライダー情報をメソッド内で利用することが出来ます。

 すべてのコライダーに反応しますので、今回は次のように if文を用意して、特定の Tag を持つゲームオブジェクトと接触した際にだけ
このコライダー情報を利用するように制御を行っています。


 private void OnCollisionEnter2D(Collision2D col) {

   // 接触したコライダーを持つゲームオブジェクトのTagがEnemyなら
      if (col.gameObject.tag == "Enemy") {

          // キャラと敵の位置から距離と方向を計算して、正規化処理を行い、direction 変数へ代入
          Vector3 direction = (transform.position - col.transform.position).normalized;

          // 敵の反対側にキャラを吹き飛ばす
          transform.position += direction * knockbackPower;
      }
  }


参考サイト
Unity公式スクリプトリファレンス
Collider2D.OnCollisionEnter2D
https://docs.unity3d.com/ja/current/ScriptReferenc...
KATSUYA BLOG 様
【Unityで学ぶC#プログラミング】当たり判定(OnCollisionEnter2D・OnTriggerEnter2D)
https://win8kat.org/archives/4304


<Vector3.normalized変数>


 指定された値を、Vector3型のベクトルに正規化処理を行います。方向はそのままで、速度ベクトルを作成されます。
そのため、今回の処理であれば、向きや距離による速度の差がなくなります。

  // キャラと敵の位置から距離と方向を計算して、正規化処理を行い、direction 変数へ代入
  Vector3 direction = (transform.position - col.transform.position).normalized;

 ゲームは2Dですが、次の処理で利用する座標情報が transform.position (Vector3型)であるため、ここでも Vector3 型の変数を用意しています。


参考サイト
Unity公式スクリプトリファレンス
Vector3.normalized
https://docs.unity3d.com/ja/2019.4/ScriptReference...
TechProjin様
UnityのVector3でよく使うものまとめ
https://tech.pjin.jp/blog/2016/02/16/unity_vector3...


Yuko_Player ゲームオブジェクトの PlayerController スクリプトの設定を行う


 Yuko_Player ゲームオブジェクトの PlayerController スクリプトに新しく追加した変数に情報を設定します。
PlayerController スクリプトにある knockbackPower 変数に数値を設定して、ノックバックした際の衝撃力を任意の値で設定してください。


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


 ゲームを実行して、EnemyのTagを持つ Eagle ゲームオブジェクトとキャラを接触させてみます。
先ほどまでは接触しても何も反応はありませんでしたが、現在は、キャラが移動と反対方向へ吹き飛ばされるようになりました。


<実行動画 Enemy Tag の設定を持つゲームオブジェクトとキャラを接触させる>
https://gyazo.com/4273113e0f1939e520e28bb68a707286


 次に、空中床のゲームオブジェクトに接触してみてください。このゲームオブジェクトは Enemy Tag の設定がありませんので、
今まで通り接触しても無反応です。


<実行動画 Enemy Tag の設定を持たないゲームオブジェクトとキャラを接触させる>
https://gyazo.com/d265c0ccf90cd34a2323ed2649d69138


 このように OnCollisionEnter2D メソッドでは、if 文による制御を行うことにより、必要な情報に対してだけ接触判定を行うことが出来ます。


26.バルーンと障害物が接触した際に、バルーンを1つ破壊する処理を追加する

設計


 次は、バルーンと敵キャラとの接触判定についての処理を実装していきます。

 今回のゲームではバルーンがいわゆる体力の役割を持っています。バルーンがなければ空中浮遊できないため、落下してしまうためです。
キャラ本体と敵キャラは弾かれるのに対して、バルーンと敵キャラが接触した場合には、バルーンが破裂 = 破壊されてしまうようにします。

 つまり、敵キャラにあたったゲームオブジェクトがキャラなのか、バルーンなのかによって、処理が変化するようになります。


<実装動画 バルーンが割れる(破壊される)>
https://gyazo.com/9d63f176e0872b7eb1ab49f5982ffecb


 制御の方法としては、バルーンのゲームオブジェクト用に Ballon スクリプトを新しく作成してアタッチします。
この Ballon スクリプトの中にも先ほど PlayerController スクリプトにも実装した OnCollisionEnter2D メソッドを記述して、
同じように Enemy Tag を持つゲームオブジェクトに接触した場合にだけ、バルーンを破壊するように制御を行います。

 バルーンの管理は PlayerController スクリプトが行っていますので、敵キャラと接触した場合には、PlayerController スクリプトの
DestroyBallon メソッドを呼び出すことにより、バルーンの破壊処理を実行するように設計します。

 それに加えて、バルーンが生成される際の処理を Ballon スクリプトに追加して、バルーンが徐々に膨らみながら生成されるアニメ処理を実装します。
これはバルーンの Scale の値を操作することによって、膨らんでいるように見せています。


<実装動画 バルーンを膨らませる>
https://gyazo.com/59830f0a7ddd0d6e3685312b809cb3c7


Ballon スクリプトを作成する


 バルーンのゲームオブジェクトにアタッチする、Ballon スクリプトを作成します。
 
 SetUpBallon メソッドでは、DOTweenの機能を利用して、Scale を変化させることにより、バルーンが徐々に膨らむようにアニメを実行します。

 OnCollisionEnter2D メソッドでは、PlayerController スクリプトと同じように、Enemy の Tag を持つゲームオブジェクト(Eagle)とバルーンが接触した際に
PlayerController スクリプトにある DestroyBallon メソッドを呼び出して、バルーンを破壊させます。


Ballon.cs

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



<DOTweenの機能と実装例◆ DOScaleメソッド、DOLocalMoveXメソッド、Tweener型とKillメソッド−>


 Ballon スクリプトの SetUpBallon メソッドでは、DoTweenによる補間処理を実装しています。
今回利用しているメソッドについて説明します。

1.DOScale(Vector3 endValue, float duration)

 DOScaleメソッドは、ゲームオブジェクトの Scale(大きさ)を、指定した大きさに変更する処理です。
大きさを変更する時に補間処理を行うことで、アニメーションしているように見せてくれます。

 このメソッドは処理を行いたいゲームオブジェクトの、transfromに対して実行します。
ここではこのスクリプトがアタッチされている、バルーンのゲームオブジェクトの大きさを変更させたいので
このゲームオブジェクトのTransform コンポーネントが代入されている transform 変数に対して処理を行うようにしています。

 // だんだんバルーンが膨らむアニメ演出
 transform.DOScale(scale, 2.0f).SetEase(Ease.InBounce);

 transform.DOScale()の第1引数はVector3型で、最終的に設定したい Scale、大きさを指定します。
この処理を行う前に、バルーン本来の大きさを scale 変数に記録して保持しているので、その後、(0, 0, 0)になった Scale を
元の大きさまで戻すように scale 変数を指定しています。

 第2引数はfloat型で、大きさを変更するまでにかかる時間を指定します。今回は 2.0f と実数(変数指定も可能)を指定しているので 2 秒かけて
このスクリプトがアタッチされているゲームオブジェクトの大きさを (0, 0, 0) => 本来の大きさに変更する、という命令になります。

 この処理によって、生成されたバルーンが徐々に膨らんでいくように演出しています。


2.DOLocalMoveX(float endValue, float duration)

 DOLocalMoveXメソッドは、ゲームオブジェクトの位置のうち、X軸(transform.localPosition.x)だけを指定して移動させる処理です。
移動時に補間処理を行うことでアニメーションしているように見せてくれます。

 このメソッドは処理を行いたいゲームオブジェクトの、transfromに対して実行します。ここではこのスクリプトがアタッチされているゲームオブジェクトを移動させる命令を行いたいので
このゲームオブジェクトのTransform コンポーネントが代入されている transform 変数に対して処理を行うようにしています。

 transform.DOLocalMoveX()の第1引数はfloat型で、移動させる位置を指定します。
この処理では、バルーンを左右に動かしたいので 0.02f を指定しています。

 第2引数はfloat型で、移動する際にかかる時間を指定します。今回は 0.2f と実数(変数指定も可能)を指定しているので 0.2 秒かけて
このスクリプトがアタッチされているゲームオブジェクトのローカル座標の位置を 0.02f の位置まで移動をさせる、という命令になります。

 このメソッドには SetLoops メソッドが付与されており、ループの回数が無制限、ループの方法を Yoyo として設定していますので、
この左右の移動の処理をいったりきたりする処理になります。

 これをゲーム画面で見ると、キャラが動かなくてもバルーン自体が揺れているようになるため、さながら風に揺れてバルーンが動いているように演出することが出来ます。


<実行動画 バルーンが風に揺れているように見せる演出>
https://gyazo.com/ee651d6dd96b8c021155a6cd3f841455


3.Tweener型とKillメソッド

 敵の移動部分でも実装する内容によっては学習済ですが、再度、復習を行います。

 Tweener 型の変数を宣言することで、DOTweenの処理を変数に代入することが出来ます。
DOTweenの処理は変数に代入せずとも実行できます。本来はそれだけで問題はないのですが、
Tweener 型の変数にDOTweenの処理を代入していることで、DOTweenの処理を一時停止させたり、終了させることが出来るようになります。

 どのような場面で使用するかというと、今回のようにSetLoops メソッドによって無制限のループ処理を行っている場合がその1つになります。
変数にDOTweenの処理を代入していない場合、ループ処理として動いているDOTweenの処理を一時停止したり、終了させる処理ができません。

 DOTweenの処理を中断するには、Killメソッドを実行します。この処理を実行することで、SetLoops メソッドによる無制限のループ処理を終了させることが出来ます。

 private Tweener tweener;  // Tweener型の変数

  // DOTweenの処理を代入できる
  tweener = transform.DOLocalMoveX(0.02f, 0.2f).SetEase(Ease.Flash).SetLoops(-1, LoopType.Yoyo);

 // 左右にふわふわさせるループアニメを破棄する
  tweener.Kill();


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


 Prefabs フォルダにある Ballon ゲームオブジェクトを選択して、インスペクターの一番上にある Open Prefab ボタンを押して編集モードに切り替えます。
作成したBallon スクリプトをドラッグアンドドロップしてアタッチしてください。アタッチしたら、編集モードを終了します。(オートセーブされます。)


<手順動画 Ballon スクリプトをアタッチする>
https://gyazo.com/35a7d3021806ade3042ddfa33c3ed0e5


Ballon ゲームオブジェクト インスペクター画像



PlayerController スクリプトを修正して、バルーン生成時にバルーンを膨らませるアニメを実行する処理を追加する


 GenerateBallon メソッドを修正して、生成されたバルーンのゲームオブジェクトが持つ Ballon スクリプトを取得して、SetUpBallon メソッドを実行させるようにします。
このメソッドが実行されると、バルーンが膨らむアニメを実行します。

 先ほど作成しておいた DestroyBallon メソッドを Ballon スクリプトの OnCollisionEnter2D メソッドから呼び出すようにします。
バルーンが Enemy タグを持つゲームオブジェクトと接触 => PlayerController スクリプトの DestroyBallon メソッドが呼び出されて、バルーンが1つ破壊される、という処理の流れになります。


PlayerController.cs

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



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


 スクリプトを修正したらセーブを行い、ゲームを実行します。

 まず最初に、バルーンを生成しましょう。PlayerController スクリプトの GenerateBallon メソッドを修正し、
生成されたバルーンのゲームオブジェクトの Ballon スクリプトに対して、SetUpBallon メソッドを実行するように処理を追加しています。

 SetUpBallon メソッドの処理が実行されると、バルーンの Scale を操作する処理が行われて、ゲーム画面では、徐々にバルーンが膨らむようにアニメ演出が追加されます。
また常にバルーンが左右に少しだけ揺れているような演出が追加されます。


<実行動画 生成されたバルーンが膨らむ演出、バルーンが左右に揺れる演出>
https://gyazo.com/d265c0ccf90cd34a2323ed2649d69138


 次はバルーンと敵キャラとを接触させてみます。Ballon スクリプトにある OnCollisionEnter2D メソッドの処理が実行されて
Enemy Tag を持つゲームオブジェクトに接触した場合には、PlayerController スクリプトの DestroyBallon メソッドを呼び出す処理が実行されます。
その結果、バルーンが破壊されます。


<実行動画 敵キャラとバルーンが接触するとバルーンが破壊される>
https://gyazo.com/4273113e0f1939e520e28bb68a707286


 空中床のゲームオブジェクトについては、Tag が Enemy ではありませんので、下方向からバルーンを接触させてもバルーンは破壊されません。


<実行動画 空中床とバルーンを接触させる>
https://gyazo.com/616d0282bece8f711c6e1a344d390336


 以上でこの手順は終了です。

 次は 手順16 −コインの設置・移動・キャラとの接触処理の実装− です。

コメントをかく


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

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

Menu



プログラムの基礎学習

コード練習

技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

3D脱出ゲーム(抜粋)

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

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

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

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

3Dトップビューアクション(白猫風)

VideoPlayer イベント連動の実装例

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

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

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

private



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

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