Unityに関連する記事です

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

 手順9〜10では、ゲームの特徴の1つであるバルーンの作成と制御について実装を行います。
この手順では、スクリプトを利用して、プレファブにしたバルーンをゲーム中に生成する処理を追加します。


手順10 −バルーンの生成−
14.バルーンをプレファブにする
15.キャラの子オブジェクトとしてバルーンを生成する



新しく学習する内容


・Instantiateメソッド
・コルーチン処理


14.バルーンをプレファブにする

設計


 キャラのジャンプについては、バルーンの数に応じて制御をすることが出来ました。
ですが、現在のゲーム画面には常にバルーンが表示されてしまっています。
内部的な処理は完成していても、外部的(見た目)があっていなければ、ちぐはぐになってしまいます。

 ここではバルーンのゲームオブジェクトをプレファブにし、ボタンを押すことでバルーンを1つ生成できるように処理を追加していきます。


Ballon ゲームオブジェクトをプレファブにする


 Project 内で右クリックしてメニューを表示し、Create => Folder を選択して、名前を Prefabs にして作成してください。

 ヒエラルキーにある Ballon ゲームオブジェクトを選択して、このPrefabs フォルダへドラッグアンドドロップします。
これで Ballon ゲームオブジェクトはプレファブになりました。ヒエラルキーにある Ballon ゲームオブジェクトのアイコンや文字が青くなっているはずです。

 従来はプレファブを作成すると、その後、ヒエラルキーにあるゲームオブジェクトは削除するのですが、
今回はこの後で利用しますので、削除せずにそのままにしておいてください。

<手順動画 プレファブの作成>
https://gyazo.com/a29a4300e01a6511b3fb6ca0c0ebdf8c


Ballon ゲームオブジェクトのプレファブの設定を行う


 Prefabs フォルダにある Ballon ゲームオブジェクトを選択して、インスペクターの一番上にある Open Prefab ボタンを押して、Sceneビューをプレファブの編集モードにしてください。

 Transform コンポーネントの Position の値をすべて 0 に修正してください。


<手順動画 Open Prefab>
https://gyazo.com/77d2de647302cadd717b8e7064780e24


Ballon ゲームオブジェクト(プレファブ) インスペクター画像



 修正したら、編集モードを終了します。ヒエラルキーの代わりに表示されている、プレファブの階層の画面で戻るボタンを押してください。設定が自動セーブされます。


<手順動画 プレファブの編集モードを終了する>
https://gyazo.com/fb267c30e881e09ab701a9918a19182c


ヒエラルキーにある Ballon ゲームオブジェクトを非プレファブ化する


 ヒエラルキーにある Ballon ゲームオブジェクトは先ほどプレファブにしましたので、現在のヒエラルキーあるゲームオブジェクトは
Ballon ゲームオブジェクトのクローン(インスタンス)の状態です。

 ヒエラルキーにある Ballon ゲームオブジェクトを選択して右クリックをしてメニューを表示し、Prefab => Unpack Completely を選択します。
このコマンドを実行すると、ヒエラルキーにある Ballon ゲームオブジェクトはプレファブではなくなります。青いアイコンと文字が普通の黒い文字に戻ります。
(Prefabs フォルダには、先ほどプレファブにした Ballon ゲームオブジェクトが残っていますので、問題ありません)


<手順動画 プレファブを非プレファブにする>
https://gyazo.com/be282bb3fb9d897be00ec432d06b7793


ヒエラルキーにある Ballon ゲームオブジェクトを修正して、Ballon プレファブが生成される位置として設定する


 先ほどプレファブにした Ballon ゲームオブジェクトですが、スクリプトからプレファブを生成するためには
生成するプレファブの情報の他に、どの位置情報で生成するか、どの回転情報で生成するかを指定する必要があります。

 指定する際には数字での指定の他、変数での指定も可能です。

ちょうど今回は、プレファブになるまで、Ballon ゲームオブジェクト設置されている位置情報や回転情報は、ヒエラルキーにある Ballon ゲームオブジェクトの位置を

 この情報をそのまま、プレファブを生成する際の位置情報・回転情報として利用しましょう。

 
 ヒエラルキーにある Ballon ゲームオブジェクトを選択し、名前を Ballon_Tran_0 に変更します。

 続いて、Transform コンポーネント以外のコンポーネントを Remove します。
何故ならばこのゲームオブジェクトは、今後プレファブを生成する際の「位置情報と回転情報を与える」役割を持つようになるためです。
そのため、SpriteRendererによって描画する画像は不要ですし、コライダーも不要です。

 Transform コンポーネントの Scale の値をすべて (1, 1, 1) に修正します。Position と Rotation はそのままにしておいてください。

 この Ballon_Tran_0 ゲームオブジェクトの子オブジェクトとして Ballon ゲームオブジェクトのプレファブを生成します。
親子関係にあるゲームオブジェクトは、親のゲームオブジェクトのサイズを元に子オブジェクトのサイズも調整されます。
そのため、ここで Scale を変更していないと画面から見えないくらい小さな Ballon が生成されることになります。


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



 同じ手順を Ballon(1) ゲームオブジェクトにも行ってください。名前は Ballon_Tran_1 に変更してください。
コンポーネントの削除だけではなく、こちらも Scale の値を初期値(1,1,1) に変更することを忘れないで行ってください。


Ballon_Tran_1 ゲームオブジェクト(元Ballon(1) ゲームオブジェクト) インスペクター画像


 これでプレファブと、プレファブを生成する位置・回転情報が整いました。


15.キャラの子オブジェクトとしてバルーンを生成する

設計


 ゲーム中に特定のボタンを操作したら、バルーンを生成するようにします。
作成しておいたバルーンのプレファブを元に、バルーンのゲームオブジェクトをクローンとして生成します。
生成する際には、先ほどの手順で作成しておいた、かつてバルーンのゲームオブジェクトが設置されていた場所を指定します。

 バルーンの数は最大で2つですので、この最大値も登録し、生成できるバルーンの上限を指定出来るようにします。

 バルーンを膨らませることを考えると、すぐに連続でバルーンが出来ても不自然です。そこで、1つのバルーンを生成するために必要な時間も設定できるようにします。
そして1つのバルーンを生成中は、次のバルーンは生成できないように制御をします。そのためには判定値が必要になりますので、そちらも用意します。

 これらの処理をすべて、PlayerController スクリプトを修正して、追加して制御を行うようにします。


PlayerController スクリプトを修正して、プレファブからバルーンを生成する処理を追加する


 宣言フィールドに新しく変数を5つ追加します。変数名の横にコメントがありますので、そちらを参考にしてください。

 StartメソッドとUpdateメソッドを修正して、バルーンを生成するための処理を追加します。

 新しい GenerateBallon メソッドを作成します。この処理の中でバルーンのプレファブのクローンを生成します。


PlayerController.cs

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



<Instantiateメソッド>


 Instantiate(インスタンシエイト)メソッドは、オブジェクトを元にクローンのゲームオブジェクトを生成するための命令です。
この命令を実行することによって、プレファブからバルーンのクローンをゲームオブジェクトとして生成しています。

Unity公式スクリプトリファレンス
Object.Instantiate
https://docs.unity3d.com/ja/2018.4/ScriptReference...


  // 1つ目のバルーン生成を生成して、1番目の配列へ代入
  ballons[0] = Instantiate(ballonPrefab, ballonTrans[0]);

 Instantiateメソッドを実行すると、このメソッドには戻り値があるため、生成したゲームオブジェクトの情報を左辺へ用意してある変数へ戻し、代入処理を行うことが出来ます。
代入処理は、左辺 = 右辺 という条件でなければ成立しませんので、両辺が同じ型である必要があります。

 左辺で用意している変数は GameObject型であり、Instantiateメソッドの戻り値の型も GameObject型 です。このためこの処理が成立しています。


参考サイト
@Tecah様
オブジェクト生成の仕方 Instantiate
https://qiita.com/Teach/items/c28b4fe5ca8dc4c83e26
Samurai Blog様
【Unity入門】Instantiateを使いこなそう!使い方・使用例まとめ!
https://www.sejuku.net/blog/48180


<コルーチン処理とStartCoroutineメソッド>


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

 コルーチンはメソッドとして宣言しますが、戻り値に IEnumerator を必ず利用します。
また処理の内部に yield を含む、中断・遅延処理の命令を必ず用意する必要があります。
今回は、yield break と yield return new WaitForSecondsメソッドを利用しています。


今回実装しているコルーチン・メソッド
  private IEnumerator GenerateBallon() {  <= 戻り値を IEnumerator で宣言する

        // すべての配列の要素にバルーンが存在している場合には、バルーンを生成しない
        if (ballons[1] != null) {
            yield break;                      <= yield による処理。yield break は、コルーチン処理を終了する命令
        }

        // 生成中状態にする
        isGenerating = true;

    // 1つめの配列の要素が空なら
        if (ballons[0] == null) {
            // 1つ目のバルーン生成を生成して、1番目の配列へ代入
            ballons[0] = Instantiate(ballonPrefab, ballonTrans[0]);
        } else {
            // 2つ目のバルーン生成を生成して、2番目の配列へ代入
            ballons[1] = Instantiate(ballonPrefab, ballonTrans[1]);
        }

        // 生成時間分待機
        yield return new WaitForSeconds(generateTime);    <= yield による処理。yield return new WaitForSecondsメソッドは、引数で指定した秒数だけ次の処理へ移らずに処理を一時停止する処理 

        // 生成中状態終了。再度生成できるようにする
        isGenerating = false;
    }


 コルーチン・メソッドを呼び出す場合には、StartCoroutineメソッドを使用して、引数にコルーチン・メソッドを指定して処理を呼び出します。
この命令を利用しないと、コルーチン・メソッドを実行することはできません(コンパイル・エラーがでないので注意しましょう)


コルーチン・メソッドを呼び出す場合
  StartCoroutine(GenerateBallon());  <= StartCoroutine(呼び出すコルーチン・メソッドの名前(引数)) の書式で記述する


参考サイト
Samurai Blog様
【Unity】はじめてのコルーチン!これさえ読めば基礎はカンペキ
https://www.sejuku.net/blog/83712
XR-HU3様
【Unity】コルーチンで処理を中断・再開・停止させる方法を学ぶ
https://xr-hub.com/archives/20368


Yuko_Player ゲームオブジェクトの PlayerController を設定する


 スクリプトを修正したらセーブを行い、Yuko_Player ゲームオブジェクトを選択して、PlayerController を確認します。
新しく宣言した public 修飾子の変数が5つ追加されていますのでそちらを順番に設定します。


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



 maxBallonCount 変数は、バルーンを生成する最大数の設定値です。0 になっていますので、こちらを 2 に変更します。

 ballonTrans 変数は、Transform 型の配列です。この情報は、プレファブのクローンを生成する位置や回転情報を持つTransform コンポーネントを登録する場所です。
以前、バルーンを設置し、位置情報として利用することになったゲームオブジェクトを、ここにアサインします。

 Size が 0 になっていますので、これを 2 に変更します。Element 0 と Element 1 が追加されますので、
ヒエラルキーにある、Ballon_Tran_0 ゲームオブジェクトを Element 0 に、Ballon_Tran_1 ゲームオブジェクトを Element 1 にドラッグアンドドロップしてアサインしてください。

 この手続きによって、1つ目のバルーンは Ballon_Tran_0 ゲームオブジェクトの子オブジェクトとして、
2つ目のバルーンは Ballon_Tran_1 ゲームオブジェクトの子オブジェクトとして生成される設定が完了しました。


<手順動画 アサイン 
https://gyazo.com/8e58b8bba4ee1d2d01da3495ddb9ba75


 ballonPrefab 変数は、バルーンのプレファブを登録する場所です。Prefabs フォルダに作成してある Ballon ゲームオブジェクトを
ドラッグアンドドロップしてアサインしてください。このゲームオブジェクトが設計図となり、このクローンがゲーム中に生成されます。

 generateTime 変数は、1つのバルーンを生成するための時間の設定値です。大きな数字ほど、次にバルーンを生成するまでの待機時間が伸びます。
初期値は 0 になっていますので、2 に変更してください。これにより、1つのバルーンを生成すると 2 秒間の待機時間後に、再度バルーンの生成が可能になります。

 isGenerating 変数は、バルーンを現在生成しているか、していないか、を判定するための情報です。この値はそのままにしておいてください。(チェックなし)
ゲーム中にバルーンの生成を行うと、この値が true になり、この情報を利用することで、バルーンの生成後の待機時間が終了するまでは、次のバルーンを生成できないように制御します。
バルーンを生成が終了すると false になり、再度、ボタンを押した際にバルーンを生成が可能になるように制御しています。


<手順動画 アサイン◆
https://gyazo.com/dd36e60e9186800a3cc828165ec633b6


 すべてのアサインが完成すると、以下のような状態になります。


Yuko_Player ゲームオブジェクトの PlayerController アサイン完成後のインスペクター画像



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


 すべてのアサインが終了したら、ゲームを実行しましょう。

 まずはStartメソッドに追加した処理が実行されているかを確認します。
インスペクターの Ballons 配列の Size が 0 から 2 に変更になっているか確認します。
初期化の処理に成功していれば、2 になります。


<実行動画 Ballons 変数の Size が 0 から 2 に変更になるか確認する(Startメソッド内の配列の初期化命令)>
https://gyazo.com/85a5007c52b7e96dd72c1349ac00dc3d


 続いて、地面に接地している状態で、キーボードの Q ボタンを押します。ジャンプ中に押しても生成しないか確認してください。
バルーンが1つ生成されれば、成功です。また生成中に Q ボタンを押しても続けて生成しないか確認します(2秒の待機時間があるためです)

 1つ目が生成されたら、さらに Q ボタンを押して2つ目を生成してください。その後は、何回 Q ボタンを押してもバルーンが生成されなければ成功です。
正常に処理が制御されています。


<実行動画◆.丱襦璽鵑離廛譽侫.屬順番に生成されるか確認する>
https://gyazo.com/54f3fd5e3e16577936b6bea96804840c


 生成されたバルーンは、それぞれ Ballons 配列に代入されています。PlayerController のインスペクターで確認しましょう。


<実行動画 生成されたプレファブのクローンと配列の値がリンクしているか確認する>
https://gyazo.com/d2616f3d2269f31946d1a0b45b7e89f3


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

 次は 手順11 −床の設置・移動− です。

コメントをかく


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

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

Menu



プログラムの基礎学習

コード練習

技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

3D脱出ゲーム(抜粋)

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

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

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

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

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

VideoPlayer イベント連動の実装例

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

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

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

private



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

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