Unityに関連する記事です

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

11.GameManagerスクリプトを修正する◆\言された干支のゲームオブジェクトをタップして選択できる状態にする(選択中の干支は色を変える)



 新しい学習内容は、以下の通りです。

・Physics2D.Raycast()メソッドとScreenToWorldPoint()メソッド
・TryGetComponent()メソッドとoutキーワード宣言
・Listへの要素の追加と削除の方法
・Imageの色の変更方法
・Null許容型の宣言



11.GameManagerスクリプトを修正する◆\言された干支のゲームオブジェクトをタップして選択できる状態にする(選択中の干支は色の透明度を変える)


 前回までの手順の実装により、ゲーム内にランダムな種類の干支が生成されるようになりました。次はこの干支ゲームオブジェクトをタップ(ドラッグ)できるようにします。
ドラッグできるようにしたあとには、スワイプしてつなげていく処理と、そのあとにはドラッグをやめた際の処理を順番に実装していきます。

 この手順をすべて実装することで「ゲーム画面内の干支を指でタップしてスワイプさせて、指を離したときに3つ以上同じ干支がつながっていたら、それらを消す」という処理が実現できます。
またタップしてスワイプしている干支については透明度を半透明にすることで「選択中」であることをユーザーに伝えるようにします。こういった演出への工夫があるとゲームへの没入感が深まります。

GameManager.cs

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


 Upadateメソッドを作成し、最初に干支をドラッグ(タップ)した際の処理をOnStartDragメソッドとして作成して呼び出しています。
その中で、干支をドラッグした際の処理を順次行っています。


<Physics2D.Raycast()メソッド、Camera.ScreenToWorldPoint()メソッド>


 RaycastHit2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector2.zero);

 Physicis2Dクラスの持つRaycastメソッドは、空間のある地点から特定の方向にめがけて、見えない光線(レイ)を投射する処理です。
この光線はコライダーを持つオブジェクトにヒットをして、そのヒットしたオブジェクトの情報を、RaycastHit2Dという型として戻り値を返してくれます。

参考
Unity公式スクリプトリファレンス
Physics2D.Raycast
https://docs.unity3d.com/ja/current/ScriptReferenc...
Unity公式スクリプトリファレンスRaycastHit2D
https://docs.unity3d.com/ja/current/ScriptReferenc...


 今回の処理では、Cameraクラスの持つScreenToWorldPointメソッドを利用して、タップ(マウスの左クリック)した位置の情報をワールド座標へと変換し
その位置から画面内にあるオブジェクトに向けて光線を発射しています。この処理によって、タップした位置にある干支の情報を取得し、干支をドラッグしたり、スワイプしたりする処理を実装しています。
Unity公式スクリプトリファレンス
Camera.ScreenToWorldPoint
https://docs.unity3d.com/ja/current/ScriptReferenc...


 公式リファレンスや、他にも参考になるサイトがありますので、ぜひ自分で調べて知識を増やしてください。

参考
うら干物書き様
【Unity】マウスのある場所にオブジェクトを配置したい
https://www.urablog.xyz/entry/2017/04/28/213010


<TryGetComponent()メソッドとoutキーワード宣言>


 Unity2019.2以降に追加されたメソッドです。処理結果としてbool型で戻り値を返してくれます。
このときの処理結果というのは、指定したコンポーネントの型の取得を行い、それが取得できればtrue、取得できなければfalseが戻ります。

 またoutキーワードによる宣言がありますので、trueの場合には必ず、このoutの後に宣言した変数内に型が代入されます。
 outキーワード宣言を行うと、outを付けた引数で指定した変数はメソッド内で必ず結果が入ることが保証されるものです。

if(hit.collider.gameObject.TryGetComponent(out Eto dragEto)) {

 今回はこのような処理として利用しています。hit変数の持つcollider情報からgameObject(つまり干支です)へとアクセスし、そのgameObjectに対してTryGetComponentメソッドを実行しています。

 out以降には Eto 型と dragEto という変数を用意しておきます。
もしもこのTryGetComponentの結果がTrueであるならば、outとして用意した dragEto変数にEtoコンポーネントの情報が代入されて、if文内に処理が入ります。
またif文内の間はこのdragEto変数が使用できることになります。(スコープがif文ブロック内であるためです)

 falseの場合にはEtoコンポーネントの取得ができなかったためfalseが結果として戻り、このif文は処理されないままで終了します。

 なおTryGetComponentメソッドには複数の書式があります。こちらは下記のリファレンスを参照してください。

参考
Unity公式スクリプトリファレンス
Component.TryGetComponent
https://docs.unity3d.com/ScriptReference/Component...


<Listへの要素の追加と削除>


 Listとは、同じデータ型の値をまとめて扱えるようにしているコレクションの1つです。
配列との大きな違いとしては、長さ(要素数)が可変可能であることが挙げられます。
Listを利用する場合には配列と同様に初期化が必要ですが、Listでは初期化時に要素数の宣言が不要です。

 そのため、予め要素数の確定しているデータを扱う場合には配列を、要素数が未確定であったり可変長であるデータについてはListを利用するようにします。

参考
.net column様
【初期化の方法】C#で配列やリストを初期化するには?
https://www.fenet.jp/dotnet/column/language/713/

eraseEtoList.Add(dragEto);

 ListはAddメソッドを利用して、引数に指定したデータをList内に要素として追加していくことが可能です。
 削除する場合にはいくつか方法がありますが、Removeメソッドを利用すれば、Addメソッドと同じように引数で指定したデータをList内から削除することができます。

 今回の実装ケースでは、専用のメソッドを作成してその中でListへの追加・削除処理を行いつつ、干支の透明度を操作する処理を行うようにしています。
ゲーム内で何度も繰り返し使う処理については、このように機能ごとにメソッド化しておきましょう。そして同じ処理を処理を毎回書くのではなく、メソッドを呼び出すことで処理できるようにします。

参考
侍エンジニア塾様
【C#入門】Listの使い方総まとめ(ArrayList/Add/Remove/ソート/検索)
https://www.sejuku.net/blog/47378


Imageの色の変更方法


 色の変更についてもスクリプトから命令を出して変更することができます。

 dragEto.imgEto.color = new Color(dragEto.imgEto.color.r, dragEto.imgEto.color.g, dragEto.imgEto.color.b, alphaValue);

 上記の処理は、dragEtoの変数より、Etoクラスの持つimgEto変数(Imageコンポーネント代入済)へアクセスし、ImageコンポーネントのColorを、右辺で指定した色に変更します。

 new Color(R, G, B, A);

 Colorメソッドでは、第1〜4引数までを順番に設定し、その色に変更します。色はそのままにしておきたい場合には、上記のように変数自身の持つ色を指定すれば同じ色のままになります。
第4引数が透明度(アルファ値)となっており、1.0f であれば不透明、0.0fであれば透明になります。0.5fなら半透明です。これをalphaValueの値によって変化させることで透明度を変化させています。


<Null許容型の宣言>


 C#の変数には値型参照型との2つのタイプが存在しています。

 「値型」は構造体(struct) です。int型やenumなどです。nullという、値が無効であったり、参照先がないような状態がありません
 もう一つの「参照型」はクラス(class) や配列です。こちらはnullという状態があります

 enum は構造体であり、値型です。そのため通常は null という状態がありません。
ですが今回は、null という状態を作りたいため、enum である EtoType 型を宣言する際に Null許容型という形式で宣言を行っています。

    // 最初にドラッグした干支の種類
    private EtoType? currentEtoType;

 他の型の宣言と違って、型名の宣言の後ろに ? がついています。これが Null許容型の宣言になります。

 どのような処理になるかというと、enum の型は構造体であり値型であるため、enum で定義されている列挙子(今回でいうと、干支の種類)以外は、
通常の宣言では値として代入をすることができません。つまり、null という状態を作ることが出来ません。
よって、常にいずれかの列挙子が値として currentEtoType変数 に代入されることが求められます。

 今回のケースの場合、いずれの干支の種類も選択していない、という状態がプログラム上求められるため、
この状態を表現するために値型である enum であっても null を設定できるようにし、
currentEtoType = null である場合には、いずれの干支の種類も選択していない、という判定を行えるようにしています

 null 状態を持たない値型であっても null 状態を設定できるようになるのが、このNull許容型の機能です。


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

 
 ゲームを実行して確認を行います。
Editor上ではマウスの左クリックがタップの代わりになりますので、干支を1つ、左クリックしてみてください。
その干支の透明度が半透明になっており、GameManagerゲームオブジェクトのインスペクターにある、EraseEtoListに干支が1つ追加されていれば正しい動作です。

検証確認動画
https://gyazo.com/1780edad406d8cf4ce19f1d8c76f7aa2

インスペクター画像




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

 次は 手順6 です。

コメントをかく


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

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

Menu



技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

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

3D脱出ゲーム(抜粋)

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

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

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

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

VideoPlayer イベント連動の実装例

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

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

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

private



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

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