Unityに関連する記事です

 前回の手順で作成した分岐用ポップアップウインドウを利用し、経路の分岐処理の実装を行います。

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



発展6 ー経路分岐機能ー

<学習内容>
 ・タプル型の実装例



設計


 複数のスクリプトを修正して、経路分岐機能を設計し、実装を行います。

 作成した分岐用ポップアップウインドウをどのスクリプトが管理すればいいのか、
表示されたポップアップウインドウ内のボタンにはどのような情報があれば分岐の処理として機能するのか、
そういった部分に着目して処理の設計を検討します。

 分岐先のボタンについては、経路のない方向のボタンはプレイヤーを混乱させる原因になるため表示させない方がいいでしょう。

 ここでもやはり、自分がユーザーの目線や立場に立って、遊びやすいポップアップウインドウになるように考えていく必要があります。


UIManager スクリプトを修正する


 表示された分岐用ポップアップウインドウ内にボタンを生成し、ボタンに役割(どの方向に分岐する)のかを与えます。
分岐に利用するボタン用のゲームオブジェクトのプレファブは1つしかありませんが、このゲームオブジェクトにはスクリプトがアタッチされていますので、
このスクリプトに「方向」の情報を与えることにより、同じゲームオブジェクトではありますが、異なる分岐のボタンとして振る舞わせることが出来ます。


UIManager.cs


 スクリプトが完成したらセーブします。

 最後に追加したメソッドの戻り値はタプル型で記述されています。
こちらは後程、利用例を交えて説明します。


UIManager ゲームオブジェクトの設定を行う


 インスペクターを確認し、新しく追加した変数に必要な情報をアサインして登録します。
どの情報が必要になるか、自分で考えてアサインしてみてください。


インスペクター画像



 以上で設定は完了です。


GameManager スクリプトを修正する


 TODO で用意しておいた分岐の処理を実装します。

 分岐の発生するタイミングで UIManager スクリプトに用意した分岐の矢印を生成するメソッドへ命令を出す必要があるため、
新しい変数を追加しています。


GameManager.cs

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


 スクリプトを修正したらセーブします。


<タプル型の実装例>


 タプル(tuple)型は C# の持つ機能の1つです。複数のオブジェクトのデータをひとまとめにして管理することができます。
また、戻り値として利用する場合には、複数のオブジェクトのデータを同じようにまとめて戻してくれることが出来ます。

 タプル型の宣言の書式は複数ありますので、それぞれ紹介します。今回は△僚饉阿納汰しています。

<記述例 
(int, bool) damage = (0, false);

(Sprite, MoveTimeScale) nextTimeScaleValue;

上記の例の場合、damage 変数や nextTimeScaleValue 変数には、2つの型の情報が含まれていることになります。
より丁寧に書く場合には、今回のように、通常の変数のように型に対して宣言も可能です。
出来るだけタプル内のオブジェクトの型にも変数の宣言をつけて利用することをおすすめします。

<記述例◆
(int value, bool isWeakness) = (0, false);

(Sprite nextSprite, MoveTimeScale nextMoveTimeScaleType);

<記述例>
(int value, bool isWeakness) damage = (0, false);

(Sprite nextSprite, MoveTimeScale nextMoveTimeScaleType) nextTimeScaleValue;



 タプル型の情報を扱う場合、タプル内のオブジェクトに対して 変数の宣言を行っているか、いないかによって、参照する場合の記述が変わります

 記述例,里茲Δ法▲織廛詁發之燭里澆靴宣言していない場合には、タプル内の情報は Item1、Item2 というように自動的に採番されます
その場合は、「タプルの変数名.タプル内のオブジェクトの宣言順のItemの番号」の書式で記述できます。

<記述例,両豺腓了仮販磧
Hoge(damage.Item1);  // int 型の引数を参照して渡しています

Hpge(nextTimeScaleValue.Item2)

変数の宣言を行っている場合には、通常の変数のように「タプルの変数名.タプル内のオブジェクトの変数名」の書式で記述できます。
そのため、タプルの変数名から、値の推測が可能です。

<記述例△両豺腓了仮販磧
Hoge(damage.value);  // int 型の引数を参照して渡しています

Hoge(nextTimeScaleValue.nextSprite);   // Sprite 型の引数を参照して渡しています

Item1、Item2 でも処理は動きますが、プログラムは処理を見て、誰でもすぐに内容が理解できる設計が理想です。
なるべく変数名をつけてタプルの宣言をした方がいいというのは、このようにプログラムの可読性に関わるためです。
damage.Item1 よりも、damage.value の方が、変数名だけ見てもどのような値が代入されているか判断がつきやすいので、処理を読み解きやすいということです。



 今回の実装では、メソッドの戻り値としてタプル型を利用し、2つの型の情報を戻す処理を実装しています。
この値を受け取る側では、同じ内容のタプル型を準備しておくことにより、戻り値の情報を2つまとめて受け取れるようにしています。

UIManager.cs
    /// <summary>
    /// 分岐情報の取得
    /// </summary>
    /// <returns></returns>
    public (bool, BranchDirectionType) GetSubmitBranch() {
    return (isSubmitBranch, chooseBranchDirectionType);
}


GameManager.cs
<戻り値のあるメソッドを実行する側>
// 分岐を選択するまで待機(while でもOK)
yield return new WaitUntil(() => uiManager.GetSubmitBranch().Item1 == true);

// 選択した分岐のルートを設定
originRailPathData = DataBaseManager.instance.GetRailPathDatasFromBranchNo(nextStagePathDataNo, uiManager.GetSubmitBranch().Item2);

 2つの命令文で uiManager.GetSubmitBranch() メソッドを実行し、それぞれ異なる型の情報をタプル型の戻りの中から取得しています。
Item1 の方は bool 型、Item2 の方は BranchDirectionType 型になります。

 この処理の中で登場する WaitUntil クラスは以前の手順で学習済です。(手順17に実装と解説があります。)
処理をしっかりと読み解けるように、この機会に復習しておいてください。



 なお、タプルも入れ子を作ることができます。通常であれば2つの型ですが、この機能を使えば複数の情報を持たせることが出来ます。

<入れ子になっているタプル>
(int x, (string a, int b) y) tuple = (0, ("String", 100));


参考サイト
MicroSoft C#リファレンス
タプル型
https://docs.microsoft.com/ja-jp/dotnet/csharp/lan...


GameManager ゲームオブジェクトの設定を行う


 インスペクターを確認し、新しく追加した変数に UIManager ゲームオブジェクトをドラッグアンドドロップしてアサインして
UIManager スクリプトの情報を登録します。


インスペクター画像



 以上で設定は完了です。


RayController スクリプトを修正する


 分岐用ポップアップウインドウが開いている間は、画面のタップの制御を行い、弾を発射する処理を一時停止するようにします。
この処理がないと、選択肢用のボタンを押下する際に弾を発射してしまうことになるためです。

 弾の発射制御は RayControlller スクリプト内で処理していますので、この中に処理を追加します。
どのような処理があれば、分岐用ポップアップウインドウが開いている間だけ弾を発射しないように制御できるようになるのかを考えてみてください。

 ちょっとした気配りではありますが、いつも遊んでいるゲームにも盛り込まれている内容になります。
自分でも処理の内容を読み解いていって、「この処理は、この時にはどのような制御になっていることがよりよい状態なのか」を考え、検討していく姿勢が重要です。


RayController.cs

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



StageDataSO スクリプタブル・オブジェクトに分岐用のデータを追加する


 分岐機能は、スクリプタブル・オブジェクト内のデータをプログラムが確認して、
分岐がある場合に自動的に分岐用ポップアップウインドウを表示する設計になっています。
(どの部分でこの処理を行っているのか、プログラムを読み解いて確認しておいてください。)

 StageDataSO スクリプタブル・オブジェクトでは、分岐も含めて登録出来るようになっています。
各 Element に含まれる BranchDatasList の情報がそれに当たります。
両方とも Element によって List 内部の情報が提示されていますので、混同しないようにしてください。

 StagePathDatasList の Element 0 では分岐なしでゲームが進行するように、Element 0 内の BranchDatasList の Element は1つとし、BranchDirectionType を NoBranch に設定します。

 StagePathDatasList の Element 1 では分岐が発生するように、Element 1 内の BranchDatasList の Element は2つとし、それぞれの BranchDirectionType に NoBranch 以外の設定を行います。
また、移動経路の異なる RailPathData ゲームオブジェクトを作成してプレファブにしておき、それを登録します。


参考例 インスペクター画像



 以下のようにならないように気を付けてください。


Element を追加する場所を間違えている場合の参考例 インスペクター画像



 以上で設定は完了です。


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


 ゲームを実行し、移動経路の最終地点(StageDataSO スクリプタブル・オブジェクトの Element 0 に登録してある RailPathData の最終地点)まで到達した際に、
Element1 に登録した内容で分岐用ポップアップウインドウが開き、分岐の処理が起動すれば制御成功です。

 ポップアップウインドウが正常に動作したら、分岐もボタンも押して、分岐先の経路に移動するかを確認してください。


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


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

 => 次は 発展7 ー使用している武器のゲームオブジェクト表示の切替機能ー です。

コメントをかく


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

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

Menu



技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

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

3D脱出ゲーム(抜粋)

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

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

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

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

VideoPlayer イベント連動の実装例

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

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

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

private



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

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