Unityに関連する記事です

 前回の手順で作成した収集用のアイテム(宝石のプレファブ・ゲームオブジェクト)とプレイヤーとが接触する侵入判定の機能を実装します。
いわゆる「当たり判定」と呼ばれる機能です。

 この機能を追加することにより、次の手順でアイテムの情報を管理する処理を作ることが出来るようになります。
例えば、宝石に得点を設定しておいて、その得点を加算していく、という機能を追加していくことが出来ます。


<実装動画>
動画ファイルへのリンク



 以下の内容で順番に実装を進めていきます。

手順12 ープレイヤーと宝石の接触する機能の追加ー
1.侵入判定の作成



<新しい学習内容>
 ・Component.CompareTag メソッド
 ・Collider.OnTriggerEnter メソッド
 ・Tag の設定



1.侵入判定の作成

1.設計


 ゲーム画面上では、プレイヤーのゲームオブジェクトが宝石のゲームオブジェクトに侵入したことを
「宝石を取る」という形で表現することが出来ます。

 では、この「宝石を取る」という仕組みについて、設計ロジックを考えてみましょう。

・宝石を取るとは?
   => 宝石とプレイヤーとのコライダー間で侵入判定が行えれば確認が取れる
     宝石とプレイヤーにはコライダーをアタッチし、いずれかのコライダーを侵入可能なコライダー(IsTrigger)として設定する
     
・内部の処理としては?
   => Unity にはコライダー間の侵入判定用の機能として OnTriggerEnter メソッドが用意されている
     このメソッドを利用することにより、コライダーに対して、別のコライダーとが侵入・通過すれば OnTriggerEnter メソッドを利用して「取った」判定を行える

・判定の分岐
   => ただし OnTriggerEnter メソッドはコライダー間であればゲームオブジェクトを問わず実行される
     つまりそのまま利用すると、すべてのゲームオブジェクトを「取った」と判定してしまう

     そのため、「どの」ゲームオブジェクトであるかを条件とし分岐評価することにより「宝石であるかどうか」を判定することができる

 こちらの制御を実装するためには、宝石とプレイヤーのゲームオブジェクトのコライダーのアタッチ
新しく宝石用のスクリプトの作成、そしてタグの設定が必要になります。

 なお今回はタグを条件分岐の条件として利用しますが、次の手順では修正を行います。
あくまでもタグの条件分岐も1つの条件のケースとして覚えていくようにしてください。



 宝石用のスクリプトには次のような情報が必要になります。

 ・宝石のゲームオブジェクトにコライダーを設置し、プレイヤーが侵入した場合に OnTriggerEnter メソッドを使って侵入判定を行えるようにする

 ・そのためには新しく宝石用のスクリプトを作成して、OnTriggerEnter メソッドを用意し、その内に Tag による分岐を作成する
  条件としては「Player の Tag を持つコライダーに侵入したら」=>「侵入・通過」と判定できるように処理を記述する

 この2点です。

 なお今回はこのように宝石側に侵入判定を用意する設計にしていますが、プレイヤー側(PlayerMove)に侵入判定を用意しても構いません
設計方法は自由ですので、考えついた方法を実装していってください。


2.Gem スクリプトを作成する


 設計の情報を元に、スクリプトのロジックを考えて処理を書いてみましょう。

 順次処理を追加・修正することを念頭に記述を行います。
今回の目標は宝石のゲームオブジェクトに対して、他のゲームオブジェクトが侵入してきたかを判定し、
もしもそれがプレイヤーのゲームオブジェクトである場合には、宝石のゲームオブジェクトを破壊する、という処理を作ることです。

 上記の内容をコメントとして日本語で処理を書いておいてから、プログラム化していくとロジックや処理の流れが見えやすくなります。


Gem.cs

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


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


3.<Collider.OnTriggerEnter メソッド>


 Unityの用意している Collider クラスの持つメソッドの1つです。
このメソッドが記述されたスクリプトのアタッチされてるコライダーを持つゲームオブジェクト(プレイヤー)が、
他のコライダーを持つゲームオブジェクトを通過した際に接触(侵入)判定を行うメソッドです。

 このスクリプトがアタッチされているゲームオブジェクトのコライダーの中に、侵入したゲームオブジェクトがある場合、
その情報を Collider 型で取得し、メソッド内で利用できる状態にしてくれます

 通常コライダーを持つオブジェクト同士は接触し停止しますが、いずれか片方のゲームオブジェクトのコライダーの IsTrigger のスイッチがオンになっている場合、
コライダーを持つゲームオブジェクトを通過(侵入)することができます。その際に、このメソッドが侵入判定を行います。

    // IsTriggerがオンのコライダーを持つゲームオブジェクトを通過した場合に呼び出される、コールバック・メソッド
    private void OnTriggerEnter(Collider col) {  // <= col は変数名なので、自由に名前を付けられる

        // 処理を書く

    // col 変数には侵入してきたゲームオブジェクトのコライダーの情報が入っているので、利用できる

    }

 侵入判定はコライダーであれば反応してしまうため、何も制限をかけないとバレット以外のゲームオブジェクトのコライダーにも反応してしまいます。
そのため、例えば、エネミーのゲームオブジェクトのコライダーが侵入した場合であっても侵入判定が発生してしまいます。

 そのため多くの場合は、Tag の名前やクラスの有無などの情報を利用して、侵入判定を行う対象となるゲームオブジェクトを制御して利用をします。


参考サイト
Unity公式スクリプトリファレンス
OnTriggerEnter


4.<Component.CompareTag メソッド>


 Component クラスに用意されているメソッドです。
指定したコライダー、あるいはゲームオブジェクトが、CompareTag メソッドの引数で指定したタグが設定されているかを判定し、bool 型の戻り値を返します。

  private string playerTag = "Player";
 
 if (col.CompareTag(playerTag)) {

 今回の例であれば col 変数のコライダーのゲームオブジェクトに "Player" タグが設定されているかを判定し、
設定されている場合には true、設定されていない場合には false を戻します。

 CompareTag メソッドの引数には string 型を指定しますので、直接 "Player" と文字列を書き込むことも出来ますが、
以前にもお伝えしているように、スクリプト内でのリテラル表記は避けるべきであるため、
今回もメンバ変数に string 型の playerTag 変数を用意し、その値に "Player" を登録して利用しています。

 この機能を利用することで、今回のようにタグを判定するための if 文の条件式として活用出来ます。


参考サイト
Unity公式スクリプトリファレンス
CompareTag


5.宝石のプレファブ・ゲームオブジェクトに Gem スクリプトをアタッチする


 作成した Gem スクリプトをヒエラルキーにある宝石のプレファブ・ゲームオブジェクトにドラッグアンドドロップしてアタッチします。
アタッチしたらインスペクターを確認して、アタッチが完了しているかを確認します。

 インスペクターでは、Gem スクリプトのアタッチと合わせて、CapsuleCollider コンポーネントが自動的にアタッチされています。
これは Gem スクリプトに RequireComponent(typeof(CapsuleCollider)) 属性を付与しているためです。


宝石のプレファブ・ゲームオブジェクト インスペクター画像



プレファブ編集ビュー CapsuleCollider のサイズ



プレファブ編集ビュー CapsuleCollider のサイズ◆ 湿紊ら見た図ー



プレファブ編集ビュー CapsuleCollider のサイズ ー横から見た図ー



 コライダーのサイズは自動的にゲームオブジェクトの形状に合わせて設定されているはずですが、念のため確認しておきます。
もしもサイズが小さかったり、大きかったりした場合には Edit Collider ボタンを押して Scene ビューで調整するか、
Radius などの項目を直接調整してください。


6.プレイヤーのゲームオブジェクトのコライダーのスイッチをオンにする


 コライダーとは、物理演算による処理によるゲームオブジェクト同士の衝突や侵入を判定するためのコンポーネントです。
様々な形状が用意されており、いわゆる「当たり判定」と呼ばれる機能を実装する際に利用できます。

 Unity には主に、コライダー同士が接触(衝突)した際
コライダーがもう片方のコライダーに侵入(通貨)した際の2つの方法で当たり判定を用意しています。

 今回は2つ目の、コライダーがもう片方のコライダーに侵入した際の判定の方向で実装を行っていきます。
この処理は、Unity が用意している OnTriggerEnter メソッドを利用することで実装することが出来ます。

 この OnTriggerEnter メソッドを利用した判定を行うためには、
判定を行いたいゲームオブジェクトの双方(プレイヤーと宝石のゲームオブジェクトの両方)にコライダー(形状不問)がアタッチされており
かつ、いずれか片方のコライダーの IsTrigger のチェックがオンになっている必要があります。

 そのために、事前に、プレイヤーのゲームオブジェクトの CapsuleCollider コンポーネントをインスペクターで確認し、
コンポーネントのチェックを入れてコライダーをオンの状態にしてください。

 また、IsTrigger のチェックが入っていない場合にもチェックをいれておいてください。

プレイヤーのゲームオブジェクト インスペクター画像



 最後にプレイヤーのゲームオブジェクトにタグの設定を行います。


7.プレイヤーのゲームオブジェクトに Tag の設定を行う


 ヒエラルキーにあるプレイヤーのゲームオブジェクトを選択します。
インスペクターの一番上のゲームオブジェクトの名前の左下に Tag という設定欄があります。

 現在は Untagged (Tag は未設定)の状態になっていますので、この部分をクリックしてください。
プルダウンメニューが開いて、登録されている Tag の中から1つを選択して登録できる状態になります。


Tag




 使いたい Tag がない場合には、プルダウンメニューの一番下にある Add Tags... ボタンをクリックしてください。
インスペクターの内容が、Tags and Layers という登録用の内容に切り替わります。
今回はすでにある Tag を利用するので、新しく追加する必要はありません。



 プルダウンメニューより Player の Tag を選択してください。


プレイヤーのゲームオブジェクト インスペクター画像



 これで Tag の設定は完了です。


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


 ゲームを実行して、プレイヤーを宝石のゲームオブジェクトに侵入させてください。
Gem スクリプトの OnTriggerEnter メソッドが実行されて、Console ビューに Debug.Log メソッドで設定した "プレイヤー侵入" の文字列が表示されれば制御成功です。
また Destry メソッドが実行されて、侵入の1秒後に宝石のゲームオブジェクトがゲーム画面から削除されてなくなれば、制御成功です。


Console ビュー画像



<実行動画>
動画ファイルへのリンク


 上手くいっても、上手くいかなくても、次のエラーの対応方法を確認してください。


9.<エラー対応方法>


 プレイヤーが宝石に侵入しても、Console ビューに Debug.Log メソッドの内容が表示されない場合には、状況に合わせて確認ポイントがあります。

 プレイヤーが宝石のゲームオブジェクトに侵入できるものの、Console ビューに何も表示されない場合、主に次の2点を疑います。

 1.プレイヤーのゲームオブジェクトの CapsuleCollider は有効(オン)になっているか?
 2.宝石のプレファブ・ゲームオブジェクトに Gem スクリプトがアタッチされているか?



 プレイヤーが宝石のゲームオブジェクトに侵入できない場合、
プレイヤーのゲームオブジェクトの CapsuleCollider の IsTrigger がオンになっているか確認します。



 エラーメッセージが表示されない場合における不具合の解決には、まずは現状の把握、そしてそれに見合った適切なエラーの確認が重要です
特に、ゲームを実行する段階で、どういった不具合が発生する可能性があるのかをイメージしておくことで、より的確かつ、迅速なエラー対応が出来るようになります。



 ロジックを考えたら、一度にすべての処理を実装するのではなく、少しずつイメージしている処理に近づくように細かい実装を積み重ねていくことが大切です

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

 次の手順では、Gem スクリプトに得点の情報を用意したり、得点を加算していく機能について追加します。

 => 次は 手順13 ースコアの加算処理ー です。

コメントをかく


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

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

Menu



技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

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

3D脱出ゲーム(抜粋)

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

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

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

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

VideoPlayer イベント連動の実装例

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

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

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

private



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

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