Unityに関連する記事です

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

10.GameManagerスクリプトを修正する  擅機曚離廛譽侫.屬鮗動生成して、異なる干支のイメージを表示させる



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

・SerializeField属性
・Startメソッドの戻り値をvoidからIEnumerator型にして使用する処理
・yield return StartCoroutine()処理による待機処理
・Resources.LoadAll処理
・自作クラスを利用したゲームオブジェクトのインスタンス処理



10.GameManagerスクリプトを修正する  擅機曚離廛譽侫.屬鮗動生成して、異なる干支のイメージを表示させる

干支の画像のファイル名を統一して、ファイル名の最後を通し番号で合わせるように変更する。


 【6】の手順内で示したように、SpriteEditorを利用して、1つのファイルから分割した画像の名前を eto_0 から始まるファイル名に変更します。最後は eto_11 になります。
分割画像ではなく、12個の画像を用意している場合には、それぞれのファイル名を eto_0 〜 eto_11 になるように変更します。

 ファイルの最後に連番で番号をつけているのは、この番号を使って画像ファイルの取得を行うためです。そのため同じ番号は採番せずに、必ず通し番号になるようにします。


Resourcesフォルダを作成して、干支の画像ファイルを配置する


 Project内で右クリックをしてメニューを表示し、Create => Folder を選択してフォルダを作成します。名前を Resources に変更してください。

 フォルダには一部、特別な意味を持つフォルダがあります。この Resources フォルダもその1つです。
このフォルダ内に置かれたファイルについては、スクリプトを通じてゲーム内でファイルを取得することができます。

 Resources フォルダの中で右クリックしてメニューを表示し、 Create -> Folder を選択して、さらにフォルダを1つ作成します。
名前を Sprites に変更してください。
 その後、Sprites フォルダ内にある eto 画像ファイルを、この新しく作成した Resources/Sprites 内にドラッグアンドドロップして移動させてください。
画像のようになっていれば大丈夫です。




GameManagerスクリプトを修正して、Etoスクリプトと関連付けた処理を行う


 GameManagerスクリプトを修正します。
【9】で作成したEtoスクリプトを活用して、生成した干支に情報(画像や干支の種類)を渡すことにより、自動的に画像などを設定するように組み込んでいきます。

GameManager.cs

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




 今回のスクリプトにおいて利用されている新しく学習する技術について説明します。

<SerializeField属性>


 変数の宣言に合わせて宣言できる、属性情報と呼ばれるものの1つです。変数の宣言の前に [ ] 付きで書かれた内容が属性情報となります。

 今回利用している属性は SerializeField という属性情報です。この機能は、インスペクター上に変数名を表示させる、というものです。
主に private 修飾子とセットで用いられ、アサインをインスペクター上で可能にするものの、変数の参照先が外部のスクリプトにない(publicの必要がない)場合に利用します。
たとえばButtonコンポーネントやTextコンポーネントといった、アサインはするものの、その変数の利用先が他のスクリプトにはないようなもの、には利用しやすいです。

 今回2か所で利用していますが、これはインスペクターにてListと配列の中身を確認したいが、外部のスクリプトでは使用する変数ではないために、SerializeField属性を利用してデバッグに役立てています。 
処理が正常に流れて、Listや配列に値が問題なく入っているかをインスペクターから確認したい、ということで利用しています。


<Startメソッドの戻り値をvoidからIEnumerator型にして使用する処理>


 通常のStartメソッドの戻り値は void ですが、用途に応じて戻り値を IEnumerator型 に変更して利用することができます。
その場合、通常と同じようにゲームの実行と同時にStartメソッドが呼ばれる部分は変わりませんが、
コルーチンメソッドとして機能するようになりますので、遅延処理や待機処理などを実装することが可能になります。

 今回のケースでは、用意した配列変数の中に画像データを取得してから次の処理へと移りたいため、そのためのメソッドの待機処理を実装するためにこの処理を利用しています。


<yield return StartCoroutine()処理による待機処理>


 コルーチン(Coroutine)とは一定の時間や条件をもとに、処理を中断・再開・終了させることができる処理のことです。

 コルーチンについての詳細な説明は割愛します。こちらの記事や、サイトで広く情報を取得できますので、そちらを参考にしてください。
XR-HU3様
【Unity】コルーチンで処理を中断・再開・停止させる方法を学ぶ
https://xr-hub.com/archives/20368


 コルーチンメソッド内には、yield を利用した処理を記述することができます。例えば、数秒間の遅延処理や、条件達成まで待機させる処理などを、この yield を利用すると実装できます。
 今回は

yield return StartCoroutine(呼び出すコルーチンメソッド);

 という処理を実行しています。通常のコルーチンメソッドの呼び出しと違いまして、呼び出す前に yield return があります。
この場合、呼び出されたコルーチンメソッドの処理がすべて終了するまで、ここでプログラムを一時待機させる、という処理が実行されます。

 呼び出すコルーチンメソッドの処理は、「画像ファイルをUnityのResources フォルダより読み込んで、配列に代入する」という内容です。

 つまり、この画像ファイルの準備が終わる前に次の干支を生成する処理に移ってしまうと、タイミングによっては画像ファイルが取得できていない状態が発生する恐れがあります。

 そこでまず、画像ファイルを取得し、その処理が終了してから干支を生成する、というように、処理の順番と流れをきちんと作ってあげることによて
不具合が発生することを未然に防げる設計になっています。


<Resources.LoadAll処理>


 Unityの Resources フォルダは特別な役割を任されていることは先ほどもお伝えしました。
この Resources フォルダからUnityにデータを読み込む処理がResources.Loadメソッド、あるいはResources.LoadAllメソッドという処理です。

 こちらの処理では呼び出したいファイルの型を指定し、Resources フォルダ内のパス(ディレクトリ)を指定することで、その場所にあるファイルを読み込む処理が実行されます。

 今回は画像ファイルの用意方法が2種類ありますので、それぞれに応じて、Resourcesの読み込み処理を使い分けています。
 
 1つの画像ファイルをSpriteEditorを利用して分割している場合には、元となる画像ファイルを読み込んで、それを分割されたファイルと同数の配列に代入しています。
こちらの場合にはResources.LoadAllメソッドを利用し、型にはSpriteを指定しています。またパスの指定も Sprites/eto となっており、1つの画像ファイルのみを指定しています。

 
 12種類の画像ファイルがある場合には、for文を利用し、Resources.Loadメソッドを使い、パスには画像ファイルの通し番号を指定してそれぞれを順番に見つけてそれを配列に代入する処理を行っています。


<自作クラスを利用したゲームオブジェクトのインスタンス処理>


 ゲームオブジェクトをインスタンスする場合、多くはGameObject型の変数を用意しておいて、その変数に作成してあるゲームオブジェクトのプレファブをアサインして利用します。

 このとき、ゲームオブジェクトのプレファブ(親のゲームオブジェクト)にスクリプトがアタッチされている場合、GameObject型ではなく、そのスクリプトを型として宣言して利用することができます。

 今回のケースでははじめはGameObject型にてインスタンスして利用していましたが、この手順ではEto型にてインスタンスして利用しています。

今回の修正前
[Header("干支のプレファブ")]
public GameObject etoPrefab;   

// 干支プレファブのクローンを、干支の生成位置に生成
GameObject eto = Instantiate(etoPrefab, etoSetTran, false);


今回の修正後
[Header("干支のプレファブ")]
public Eto etoPrefab;     // <= ☆ 変更。 GameObject型からEto型に変更する。プレファブは同じようにアサインできる

// 干支プレファブのクローンを、干支の生成位置に生成
Eto eto = Instantiate(etoPrefab, etoSetTran, false);    // <= ☆ 変更。 生成された干支を代入する型をGameObject型からEto型に変更する

 このようにしてクラスを利用して、インスタンスする際の利点はその後の処理にあります。

 今回はインスタンス後にEtoクラスのSetUpEtoというメソッドを呼び出す処理を行います。GameObject型にてインスタンスを行いますと
その後、GameObject型であるためEtoクラスをGetComponentメソッドを利用して、Etoクラスを取得してから使用する必要がありますが、
インスタンス時にEtoクラスにて生成することができれば、GetComponentを行う必要なく、すぐに利用することが可能になります。

 処理の前後を考えて設計を行っていくと、このように効率のよい処理を実装することができます。


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


 GameManagerスクリプトの修正が終了しましたら、ゲームを実行して、動作の確認を行います。

 正しい挙動としましては

1.GameManagerスクリプトのEtoSprites配列に、12種類の画像ファイルがResources.LoadAllメソッドによって読み込まれて代入される(インスペクターで確認できます) EtoSpritesの Size 0 が 12 になっている
2.生成された干支の画像が、ランダムに変更されている
3.EtoSetTran内に生成されたEtoPrefabの名称が、干支の種類の名前に変更されている
4.生成された干支がGameManagerスクリプトのEtoListに代入されて Size 0 が 50 になっている
 

 これらを確認します。

 
GameManagerのインスペクター動画
https://gyazo.com/eea58b6437b2cfd4ccf44e87e4fe2d22

ゲーム画面動画
https://gyazo.com/9fa56623fd367442534633a0a5d16474

ヒエラルキーのEtoSetTran内に干支が生成され、同じ順番でGameManagerのEtoListに入っているか検証動画
https://gyazo.com/666332b78f58e7c411d4b4760870245d



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

 次は 手順5 です。

コメントをかく


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

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

Menu



技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

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

3D脱出ゲーム(抜粋)

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

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

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

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

VideoPlayer イベント連動の実装例

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

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

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

private



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

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