Unityに関連する記事です

 前回に続き、会話イベントに条件を設定し、特定のアイテムを特定数持っていることで、条件を満たして、別の会話イベントを発生させる機能を実装します。
ここでは登録した進行型の会話イベントをスクリプタブル・オブジェクトより読み込んで、会話イベントの進行状態に合わせて自動的に分岐してイベントを進行させていく処理を実装します。
 

<実装動画 条件達成前>
動画ファイルへのリンク


<実装動画 条件達成時>
動画ファイルへのリンク


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


手順32 ー進行型の会話イベントの実装ー
57.GameData スクリプトと DialogController スクリプトと TeasureBox スクリプトを修正し、進行型の会話イベントを実装する



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

 ・入れ子になっている三項演算子の読み解き方
 ・コルーチンメソッドの注意点



57.GameData スクリプトと DialogController スクリプトと TreasureBox スクリプトを修正し、進行型の会話イベントを実装する

1.設計


 会話イベントのメッセージの表示機能を実行しているのは DialogController スクリプトです。
そのため、修正が必要な部分としては、DialogController スクリプト内にあるメッセージの表示用のメソッド内の処理を見直すことが大切になります。
 
 メソッドを修正する、ということは、その呼び出し元である他のスクリプトも合わせて見直す必要がある、ということにもなります。
このとき、メソッドの引数が変更になっていたり、メソッドの戻り値が変更になっている場合には、必然的にメソッドの呼び出し側のスクリプトも修正が必要になります。

 処理を変更する場合、このように1つずつ、処理を行っている場所と、その処理に行きつくまでに実行されるメソッドをすべて洗い出して
修正が必要になるかどうかを精査していくことが重要です。


2.GameData スクリプトを修正する


 進行型の会話イベントを管理するための List 型の変数とセーブ・ロード用の変数を追加します。
またお金も管理するための変数を追加します。

 これらの変数を利用したメソッドを新しく6つ作成しています。
会話イベントをクリアするためのアイテムを所持しているかを ItemInventryList と照合して確認する処理、
クリアした会話イベントを List に追加する処理、現在クリアしている会話イベントを確認する処理、
クリアした会話イベントをセーブ・ロードする処理、お金を計算して更新する処理です。

 セーブした会話イベントについては、セーブ処理のみで、ロードをする場所を指定していません。
もしも制御を入れるのであれば、Awake メソッド内、GameManager クラスの Start メソッド内で読み込んで利用できる状態にしてください。

 今回はデバッグ用に Update メソッド内に処理を用意しています。
 

GameData.cs

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


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


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




3.<入れ子になっている三項演算子の読み解き方>


 三項演算子はその処理内に別の三項演算子の処理を実装することが出来ます。
三項演算子は if /else 文の省略命令ですので、そちらをしっかりと把握すると読み解くことが出来ます。

CheckTalkEventItemFromItemInvenry メソッド
  // インベントリーが null ではなく、必要な数を超えている場合は true
  return itemInventry == null ? false : itemInventry.count >= checkCount ? true : false;

  銑イ良分に注目して、if / else 文に直してみて、処理を読んでいきましょう。

 if (itemInventry == null) {

    return false;

  } else {
      if (itemInventry.count >= checkCount) {

          return true;
      } else {

          return false;
      }          
  }

 読みにくい処理はこのように、自分でわかりやすく作り直すことが大切です。
特にイメージのみでわかる場合以外には、自分で書いてみることをお勧めします。
書けていれば処理が理解できていると思って問題ありません。


4.DialogController スクリプトを修正する


 DisplayDialog メソッドにおいて、進行型の会話イベントを、その進捗に応じて自動的に分岐して表示する処理を実装します。
いままで処理の中でも、修正箇所がもっとも広く、処理が複雑です。しっかりと読み解いていきましょう。

 会話イベントについてはまず最初に、進行型の会話イベントなのか、従来の会話イベントなのかを判定して処理を分岐します。
その後、進行型の会話イベントであった場合、初めて会話イベントが発生したときには、依頼となる Need/Permission の会話イベントを実行します。

 2回目以降に同じ NPC に話しかけた際には、依頼達成となるためアイテムをプレイヤーが所持しているかどうかを自動で判定します。
複数のアイテム指定や、複数個の指定がある場合には、それらすべてを満たしている場合のみ、依頼達成と判定し、それ以外は未達成と判定します。

 判定結果によってまた自動で分岐を行う処理を用意しておいて、依頼を達成している場合には Get の会話イベントを実行します。
未達成の場合には再度、Need/Permission の会話イベントを実行します。

 依頼を達成している場合には、Need の場合には、依頼されているアイテムが消費されます。
そのため、GameData クラスで管理しているアイテムのインベントリーから減らす処理が必要にもなります。

 Permission の場合には消費はされません。

 その後、依頼達成のご褒美がある場合には、アイテムなどを入手した処理を実行します。こちらもアイテムインベントリーの更新が必要になります。
アイテムについては複数種類の登録が可能になっているため、メソッドもそれに合わせて変更します。そうしないと、いままでと同じように1種類しか獲得できないためです。
 
 このアイテムの獲得処理の変更に伴い、GetEventItems メソッドの処理も変更になっています。
こちらはコルーチンメソッドとなっているため、戻り値が変更になり、複数のアイテムを獲得できるようにしたためです。

 DisplaySearchDialog メソッドも同様にコルーチンメソッドになって、GetEventItems メソッドの呼び出し命令をコルーチンメソッドの呼び出しに変更しています。

 依頼達成以降に NPC に話しかけた場合には Cleard の会話イベントを実行します。

 こちらの流れが、今回実装する処理の内容になっています。



 難しいため、少しずつ実装して処理を見直しながら進めてください。


DialogController.cs

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


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


4.TreasureBox スクリプトを修正する


 DialogController スクリプトの DisplaySearchDialog メソッドがコルーチンメソッドに変更になっているため、
OpenTresureBox メソッド内の DisplaySearchDialog メソッドの呼び出し処理をコルーチンメソッド用に変更します。

 また SwitchStateTreasureBox メソッド内の処理を修正し、宝箱を開けた際の画像の参照先を変更します。
なお、その中にあるゲームオブジェクトを非表示にする方の処理については利用しないようにしてください。

 ゲームオブジェクトが非表示になると、この TreasureBox クラスの処理もすべて停止します。
クラス内の処理が停止した場合、外部のクラスにあるコルーチンメソッドの呼び出し命令も停止してしまうため、エラーが発生するようになります。
これはゲームオブジェクトが破壊されてしまった場合にも発生します。今回はこれを未然に防ぐために、ゲームオブジェクトを非表示にする方の処理は止めてください。


コルーチンメソッドの呼び出し元のゲームオブジェクトが非表示や破壊されてしまい、コルーチンメソッドの処理が動かなくなった場合のエラーメッセージ



TreasureBox.cs

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


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


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


 処理の全容をしっかりつかんでから、どの部分をデバッグするのか把握した上でゲームを実行して確認を行っていきましょう。

 会話イベントの処理自体を修正しているため、進行型の会話イベントだけではなく、新しく登録し直した探索イベントや、従来の会話イベントも正常に制御されているかを確認してください。
デバッグ内容が多いため、1つずつ順番に確認をしていきましょう。

 達成した会話イベントのセーブは自動的に行われていますが、ロード処理は未実装になっています。
自分で考えて実装してみてください。デバッグ時にはデバッグ用に用意してある処理を利用してロードを行って確認してください。


<実装動画 条件達成前>
動画ファイルへのリンク


<実装動画 条件達成時>
動画ファイルへのリンク


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





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

 次は 手順33 ー実装全体の振り返りー です。

コメントをかく


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

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

Menu



技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

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

3D脱出ゲーム(抜粋)

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

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

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

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

VideoPlayer イベント連動の実装例

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

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

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

private



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

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