Unityに関連する記事です

 1つの NPC に複数の会話イベントを設定し、特定のアイテムを特定数持っていることで、条件を満たして、別の会話イベントを発生させる機能を実装します。

 この処理には「特定の場所にいった」「お金をいくら持っている」という形での条件設定も可能です。
また複数の条件の組み合わせも可能です。「隣街にいったことがある」「お金を1000以上持っている」「薬草を3個以上持っている」といった設定が出来ます。

 条件達成時には「条件となったものを失う」場合と「条件となったものをもったままにする」場合を選択して設定できるようにします。
そのため、対価としてイベントを達成するタイプと、対価は不要で取得のみできるタイプを設定できます。
 

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


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


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


手順31 ーEventData 用のデータベースの改修ー
54.enum にて EventProgressType スクリプトを作成する
55.EventData スクリプトを修正し、新しい EventDataDetail クラスを追加し、変数を修正する
56.EventDataSO スクリプタブル・オブジェクト内に進行型の会話イベントを登録する



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

 ・イベントの管理方法例



54.enum にて EventProgressType スクリプトを作成し、ItemName スクリプトを修正する

1.設計


 会話のイベントを「進行型の会話イベント」と「従来の会話イベント」の2つに分ける設計にします。
進行型の会話イベントというのは、1つの NPC がプレイヤーのアイテムの所持具合によって、会話の内容が変化するものです。
従来の会話イベントというのは、いままでの会話とおなじです。プレイヤーの状態によっては会話の内容は変化しません。

 今回はこの「進行型の会話イベント」をデータベースとして作成できるようにします。
次の手順では、会話イベントの進行状況に応じて、会話イベントが自動的に進行していくように処理を修正します。

 まずは最初に、「会話イベントの進行状況」をゲーム内に作成する必要があります。
こちらは enum で作成して、各会話イベントに情報を利用してもらえるようにします。


2. EventProgressType スクリプトを作成する


 enum のみのファイルを作成します。MonoBehaviour クラスの継承は不要です。

 各列挙子ですが、こちらの列挙子が会話イベントの状態を表すようにします。

 None は従来の会話イベントや探索イベントに利用するものです。会話の内容が変化しません。

 Need と Permission は進行型の会話イベント用に利用するものです。
このタイプを持つ NPC に話しかけると、会話イベントが進行型の会話イベントとなり、プレイヤーに依頼する情報になります。

 Need は、依頼達成時にプレイヤーのアイテムが消耗します。(なくなるので、インベントリーから削除が必要)
Permission は依頼達成時にプレイヤーのアイテムはなくなりません。(提示のみなので、インベントリーは変化なし)

 NPC に対してあげるものなのか、見せるだけでいいのかで設定してください。これはどちらか1つを設定することになります。

 Get も進行型の会話イベントに利用するものです。
プレイヤーが Need か Permission の会話イベントで求められているアイテムを所持している場合に NPC に話しかけた際には
こちらの会話イベントが進行するようになります。ここで登録してあるアイテムを獲得できます。
なお、達成していない場合には、再度、Need か Permission の会話イベントを実行します。

 Cleared も進行型の会話イベントに利用するものです。すでに依頼を完了している NPC に話しかけた際に実行される会話イベントです。

 以上のことから、進行型の会話イベントの場合、1つの NPC に対して、複数の EventProgressType を登録することが必要になります。


EventProgressType.cs

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


 スクリプトを作成したらセーブします。


3.ItemName スクリプトを修正する


 新しい列挙子を5つ追加してください。追加する場所はどこでも構いません。


ItemName.cs

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


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


4.<イベントの管理方法例>


 ItemName スクリプト内に、アイテムとして「抽象物」を登録しておくことにより、お金や経験値、レベルを依頼の対象物にしたり、受け取れるご褒美に設定できるようにします。
また、目的地についた時や特定の NPC と会話イベントを達成した場合なども、このようにアイテムとして取得できるように管理します。
それを依頼の対象物に指定すれば、特定の場所に行ったことがあるか、特定の NPC と会話したことがあるか、といった会話イベントの依頼として設定できます。

 こういった管理方法もあるということを覚えておくと便利です。


55.EventData スクリプト内に新しい EventDataDetail クラスを作成し、修正する

1.設計


 現在の EventData クラスには1つの NPC に対して複数の会話イベントを登録できる変数がありません。
こちらを修正し、1つの EventData クラス内に複数の会話イベントの情報を登録して管理できるようにします。

 このように、同じ情報の塊で、かつ、その内容が可変するような値については配列や List を利用することを考えていくようにしてください。


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


 今回作成する会話のイベントは、同じ NPC が複数の情報を管理できるようにすることが必要になります。

 そのため、EventData の内容を精査し、会話イベントを1つの EventData クラス内にまとめて管理できるように
新しく EventDataDetail クラスを作成します。この中に、dialogs 変数などを管理させます。新しく作成した EventProgressType の enum も利用します。

 またすでにあった ItemType 型と int 型の変数を配列にして、複数のアイテムの情報を登録できる状態にします。変数名も複数形に変更します。
これは、会話イベントによって、「複数のアイテムが必要なイベント」と「複数のアイテムが報酬としてもらえるイベント」を作成できるようにするためです。
ここには「お金」や「目的地に行ったことがある」「誰かと話したことがある」といったものも含まれます。


<EventData クラスで管理する情報>
   public EventType eventType;    // イベントの種類
    public int no;                 // 通し番号
    public string title;           // タイトル。NPC の名前、探す対象物の名前、など

  // 2つ追加
    public TalkEventNameType talkEventName;
    public List<EventDataDetail> eventDataDetailsList = new List<EventDataDetail>();


<EventData クラスではなく、EventDataDetail クラスで管理する情報>
public EventProgressType eventProgressType;

        [Multiline]
        public string[] dialogs;            // NPC のメッセージ、対象物のメッセージ、など
        public Sprite eventSprite;         // イベントの画像データ

        public ItemName[] eventItemNames;      // イベントに必要なアイテム、あるいは獲得できるアイテム。配列にします
        public int[] eventItemCounts;          // イベントに必要な個数、あるいは入手できる個数。配列にします

 EventDataSO クラス間は、次のような構成になります。

<EventDataSO に関連するクラスの構成>
EventDataSO  <複数の EventData クラスを List で管理している>
  |
  | ー NPC(EventData クラス)  <複数の EventDataDetail クラスを List で管理している>
  |    | ー 進行型の会話イベント ^様蟷(EventDataDetail クラス)
  |    | ー 進行型の会話イベント◆ヾ偉算(EventDataDetail クラス)
  |    | ー 進行型の会話イベント 終了後(EventDataDetail クラス)
  |
  | ー NPC(EventData クラス)  <複数の EventDataDetail クラスを List で管理している>
  |    | ー 進行型の会話イベント ^様蟷(EventDataDetail クラス)
  |    | ー 進行型の会話イベント◆ヾ偉算(EventDataDetail クラス)
  |    | ー 進行型の会話イベント 終了後(EventDataDetail クラス)
  |

 このイメージを元に、EventData クラスを修正していきます。


EventData.cs

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


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


56.EventDataSO スクリプタブル・オブジェクト内に進行型の会話イベントを登録する


 EventData スクリプトを修正すると、色々なスクリプトでエラーが発生します。

 いずれかのスクリプトにおいてエラーが発生していると、Unity のコンパイルが通らないため、
新しく追加した EventData の内容が反映されません。

 そのため、まずはエラーの原因の検証を行いながら、先に次の手順32の内容を進めてください。

 そして手順32でエラーの修正が完了してから、下の手順を進めてください。


1.設計


 EventData クラスの設計が変更になっているため、新しく会話イベントや探索イベントを再登録します。

 現段階で登録できるイベントは「進行型の会話イベント(状態に応じて会話が変化する)」、「従来の会話イベント(毎回同じ会話が発生する)」、「探索イベント」の3つです。

 EventData クラスへの情報の登録方法についてまとめます。これは以前と同じで、NPC 1人分、宝箱1つ分のデータになります。

<EventData クラス内の設定>
    public EventType eventType;    // イベントの種類
    public int no;                 // 通し番号
    public string title;           // タイトル。NPC の名前、探す対象物の名前、など
    public List<EventDataDetail> eventDataDetailsList = new List<EventDataDetail>();   // 会話イベントの詳細の登録
 
 eventType 変数は今までと同じです。会話か探索かを選択して登録してください。進行型の会話イベントと従来の会話イベントは Talk を選択します。

 no 変数も今までと同じですが、会話イベントについては従来と進行型の会話イベントの両方を同じ数字で管理することになるため、重複しないようにしてください。

 title 変数もいままでと同じです。メッセージの左上に表示させたい名前を記述しておきます。

 eventDataDetailsList 変数は新しく追加した List 型の変数です。こちらには、進行型の会話イベントの場合は複数の情報が必要ですので、Size を 2 以上で作成します。(基本 3 になります)
従来の会話イベントと探索イベントについては Size 1 にして登録します。

 eventDataDetailsList 変数の Size の数に応じて Element が作成されます。これが EventDataDetail クラスになります。
1つの EventDataDetail クラスにつき、同じ NPC の会話イベントを1つずつ登録しておきます。
この方法により、1つの NPC に異なる会話のイベントを複数登録しておくことが出来るようになっています。

<EventDataDetail クラス内の設定>
    public EventProgressType eventProgressType;

    [Multiline]
    public string[] dialogs;            // NPC のメッセージ、対象物のメッセージ、など
    public Sprite eventSprite;         // イベントの画像データ

    public ItemName[] eventItemNames;      // イベントに必要なアイテム、あるいは獲得できるアイテム。配列にします
    public int[] eventItemCounts;          // イベントに必要な個数、あるいは入手できる個数。配列にします

 登録する際のパターンを掲載しておきます。

<タイプ1 従来の会話イベント>
eventProgressType = EventProgressType.None
dialogs = NPC のメッセージ。固定。複数ページでの登録可能
eventItemNames = [Size] 0
eventItemCounts = [Size] 0



 進行型の会話イベントは以下のような3つのパターンの組み合わせになります。
そのため、eventDataDetailsList 変数の値 Size は 3 になります。List で管理しているので、1つの NPC の会話イベントとして束ねて管理出来るようになっています。

<タイプ2 進行型の会話イベント ^様衢僉
eventProgressType = EventProgressType.Need か、EventProgressType.Permission を選択する
dialogs = NPC のメッセージ。依頼する際のものを設定。複数ページでの登録可能
eventItemNames = [Size] 1 以上。プレイヤーに依頼するアイテムやお金などを登録する。複数依頼可能。これらが依頼を達成するために必要になる
eventItemCounts = [Size] 1 以上。eventItemNames 変数の Size と同じにすること。依頼するアイテムやお金の値を登録する。eventItemNames[0] <=> eventItemCounts[0] のように、1対1でつなげること

<タイプ3 進行型の会話イベント◆^様蟯偉算用>
eventProgressType = EventProgressType.Get を選択する
dialogs = NPC のメッセージ。依頼が完了した際のものを設定。複数ページでの登録可能
eventItemNames = [Size] 1 以上。プレイヤーにあげるアイテムやお金などを登録する。複数依頼可能。これらが依頼達成時に入手できる
eventItemCounts = [Size] 1 以上。eventItemNames 変数の Size と同じにすること。受け取れるアイテムやお金の値を登録する。eventItemNames[0] <=> eventItemCounts[0] のように、1対1でつなげること

<タイプ4 進行型の会話イベント 依頼終了後用>
eventProgressType = EventProgressType.Cleared を選択する
dialogs = NPC のメッセージ。依頼が完了して、その後のものを設定。複数ページでの登録可能
eventItemNames = [Size] 0
eventItemCounts = [Size] 0



 探索イベント用です

<タイプ5 探索イベント>
eventProgressType = EventProgressType.None
dialogs = 獲得したアイテムと個数が自動的に表示されるため、Size 0 でも構いません。複数ページでの登録可能
eventItemNames = [Size] 1 以上プレイヤーにあげるアイテムやお金などを登録する。複数依頼可能。これらが依頼達成時に入手できる
eventItemCounts = [Size] 1 以上。eventItemNames 変数の Size と同じにすること。受け取れるアイテムやお金の値を登録する。eventItemNames[0] <=> eventItemCounts[0] のように、1対1でつなげること

 基本的にはこれらのパターンで EventData と EventDataDetail を順次登録してください。


2.EventDataSO スクリプタブル・オブジェクトにイベントを登録する


 上記を実際に東特した際の画像を参考用に添付しておきます。自由に登録してください。


<登録例 …名錣硫駭奪ぅ戰鵐(会話固定)>

Element 0  パターン1・EventProgressType を None に設定する




<登録例◆/聞垠燭硫駭奪ぅ戰鵐函

Element 0  パターン2・依頼用。EventProgressType を Need か Permission に設定する


Element 1  パターン3・依頼完了用。EventProgressType を Get に設定する


Element 2  パターン4・依頼完了以後用。EventProgressType を Cleard に設定する




<登録例 パターン5・探索イベント(宝箱の中身は3種類)>
Element 0  EventProgressType を None に設定する





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

 次は 手順32 ー進行型の会話イベントの実装ー です。

コメントをかく


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

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

Menu



技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

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

3D脱出ゲーム(抜粋)

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

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

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

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

VideoPlayer イベント連動の実装例

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

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

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

private



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

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