本投稿は2024年9月時点の内容になります。アップデートにより変更となる場合があります。また環境によって違いがあると思いますのであくまで参考として、ご了承ください。
様々な書籍、ブログや動画を参考にさせていただきました。多すぎて一つ一つは紹介できませんが感謝です。
初心者の自分がUnity ソフトウエアでゲームを作ってみました。とりあえずシンプルなものということでモグラたたきに挑戦です。ゲーム作ってみるかという感じになったときに、いいタイミングで某ゲームのイベントシナリオ内ミニゲームにモグラたたきが実装されていたのでUIとかエフェクトとか、諸々の仕様をぱくって参考にして作ってみましたよ。様々なHowToの中の選択肢のひとつとして、同じ初心者さんの参考になればよいです。
\ チェック /
目次
IPointerxxxHandlerでクリックイベントを実装してみる
敵キャラクターがだいぶ形になったので、もうそろそろモグラたたきらしくマウスクリックでたたけるようにしていこうと思います。マウスの動作を受ける方法は対象のゲームオブジェクトにEventTrigerコンポーネントをつけたり、Buttonコンポーネントをつけたりなどいろいろあるのですが、今回はIPointerxxxHandlerを使っていきます。
本記事のポイント
- IPointerxxxHandlerを使ったクリック検知のスクリプトの書き方
- IPointerxxxHandlerを使うための3つの設定
IPointerxxxHandlerとインターフェース
インターフェースってなに?
IPointerxxxHandlerの「I」はインターフェースを意味します。
今回もざっくり解説。
インターフェースをざっくり解説
- クラスAさんにある決まった仕様の外装(名前と引数、戻り値の型が決まった関数のガワ)を渡すから必ず使ってね。でも仕様(引数、戻り値)から外れなければ中身はクラスAさんに必要なものを入れて実装してもらっていいですよ という仕組みです。
- これによってクラスAさんクラスBさんいった異なるクラスに、同じ名前、意味/役割をもちながら詳細のちがう関数を実装することができます。
- もっとイメージ的な感じだと機能の継承という感じ
- 例えばダメージ判定の機能IDamgeがあったときに、プレイヤーの攻撃はIDamegeを持った敵、障害物にそれぞれの処理でダメージを与えることができる。障害物のなかでもIDamegeを持った障害物は壊せるけど持たないものは壊せない、などの処理ができるみたいな感じです。
- 本当はもっと意味があるようですが今回はこのくらいのイメージでいきましょう。
ちょっとまだイメージ沸きにくいかもしれませんが、習うより慣れろてことで実際にスクリプトを書いて確認していきます。
IPointerDownHandlerでOnPointerDown関数の実装をする
新たにEnemyを操作するEnemyControllerクラスを作ってUnitychanにアタッチします。スクリプトを追加していきます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//IPointerDownHandlerを含む名前空間(識別をはっきりするためのグループ、フォルダー的なイメージで)
//を使うのでこの後は省略するよという宣言
using UnityEngine.EventSystems;
public class EnemyController : MonoBehaviour, IPointerDownHandler//インターフェースを実装したクラスであると宣言インターフェースを実装したクラスであると宣言
{
//IPointerDownHandlerインターフェースの関数
//マウスが押されたメッセージを受け取り実行される
public void OnPointerDown(PointerEventData eventData)
{
Debug.Log("クリックされました");
}
}
スクリプトざっくり解説
- (5)using IPointerDownHandlerを含む名前空間「Eventsystems」を使うのでこの後の記述では省略しますよという宣言
- (8)インターフェース「IPointerDownHandler」の関数OnPointerDownを実装したクラスであると宣言
- (14)「IPointerDownHandler」インターフェースの関数OnPointerDown コールバックという方法でマウスクリックされたときに呼び出されます。コールバックについては、またいずれざっくる説明するかも。。。
- (10)インスペクターで「Enemy」に自身をアサインします。
スクリプト自体は上記3つを追加するだけ。簡単だったと思います。
それではゲーム再生して対象をクリックしてみましょう。どうですか?多分何も起こらないと思います。
実はクリックイベントのメッセージを受け取るのにはスクリプト以外3つの設定が必要です。
IPointerxxxHandlerを使う上の3つの設定
クリックイベントがうまくいかないときにチェックが必要な3つの設定をまとめてみました。
1.PhysicsRaycaster
まず一つ目はメインカメラにPhysicsRaycasterコンポーネントの追加です。今回は2DなのでPhysics2DRaycasterを追加します。
PhysicsRaycasterとはざっくり解説
- Ray(光線)をCast(投射)してその光線の衝突判定で、入力イベントがどこで発生したかを検出するシステムです。
2.Collider
Raycasterの光線は出ているだけでは意味がないので、対象のゲームオブジェクトで受ける必要があります。その判定に必要なのがColliderです。
対象のゲームオブジェクトにBoxCollider2Dコンポーネントを追加します。Colliderのサイズはゲームオブジェクトにに合わせて適宜調整してください。
3.EventSystem
個人的にはこれが一番忘れがちなのですが、マウスの操作やRaycasterのイベントを送信する役割が必要になります。それがEventSystemです。
UIを作成すると自動的に作られるのですが、UIを作成してない段階だと無いことに気付かずハマることが多いので気を付けましょう。
EventSystemの設置
- ヒエラルキー上で右クリック
- 「UI」>「イベント」でヒエラルキー上に作成できます。
ゲーム再生してクリックしてみましょう。コンソールにログが出たらOKです。
IPointerxxxHandlerのクリックイベント実装に必要なもの
- スクリプト
- Raycaster
- Collider
- EventSystem
クリックイベントが発生しない場合は上記がそろってるか確認しよう!
IPointerxxxHandlerの種類
最後にIPointerxxxHandlerの種類をざっとまとめてみました。
インターフェース | メソッド | タイミング |
---|---|---|
IPointerClickHandler | OnPointerClick | オブジェクト上でポインターを押下し、同一のオブジェクト上で離した際 |
IPointerDownHandler | OnPointerDown | ポインターがオブジェクトを押下したとき |
IPointerEnterHandler | OnPointerEnter | ポインターがオブジェクトに乗ったとき |
IPointerExitHandler | OnPointerExit | ポインターがオブジェクトから離れたとき |
IPointerUpHandler | OnPointerUp | ポインターを離したとき |
EventSystemsのHandlerインターフェースにはドラッグなどもあるので、使いどころが多そうです。
まとめ
IPointerxxxHandlerまとめ
- スクリプトに必要な3つは名前空間「using UnityEngine.EventSystems」、「使用するインターフェースの宣言」、「インターフェースのメソッド」です。
- スクリプト以外で必要な3つ、クリックイベントがうまくいかないときチェックすべき3つは「Raycaster」「Collider」「EventSystem」です。
\ 初学に使った書籍です /
動画×解説でかんたん理解! Unityゲームプログラミング超入門
大角 茂之/大角 美緒
\ Unityのスクリプトを書くのに役立ちます /
もっと早く教えてほしかった!Unity C#入門
MARU
おすすめ記事
Unity ソフトウエアでゲーム制作#1モグラたたき編(28.ゲームに効果音…
Unity ソフトウエアでゲーム制作#1モグラたたき編(27.エフェクト2パ…
Unity ソフトウエアでゲーム制作#1モグラたたき編(26.エフェクトその1)
Unity ソフトウエアでゲーム制作#1モグラたたき編(25.プレハブバリア…
Unity ソフトウエアでゲーム制作#1モグラたたき編(24.Buttonで…
Unity ソフトウエアでゲーム制作#1モグラたたき編(23.シンプルなアニ…