Unityと吉里吉里でSLGとかRPGを作るブログ

すっかり、月一更新が普通になってしまった猫ダマシです。
定期的に月2回更新してたのが嘘の様です。

さて、今回はイベントとフラグの制御サンプルをアップします。
ちょっと複雑になってますので、なるべく簡単に解説しようと思います。

いつも以上に分かりにく仕様になっております。
アップしたサンプルを見ながら読み進めて頂けると幸いです。
◆サンプルダウンロード◆

以前の記事も確認いただけると、より理解が進むと思います。
◆第23回「フラグの管理方法」◆
◆第10回「イベント制御について」◆


■プラグイン

・000_CustomLayer
 カスタムレイヤープラグイン、じゃんけんぼたんを表示する為に必要。

・001_ImageLayPlugin
 イメージレイヤープラグイン、上記同様。

・002_ImageListLayPlugin
 イメージリストレイヤープラグイン、上記同様。

・003_WinButtonLayerPlugin
 ウィンドウボタンプラグイン、ジャンケンボタンはこれを使ってます。

・004_JyankenPlugin
 ここで、ジャンケンボタンを作って、表示してます。

・033_GameFlgPlugin
 フラグ管理用プラグイン
 800_GAME_FLG.datのCSVファイルを読み込んでます。

・051_EventPlugin
 イベント制御用プラグイン。
 852_EVENT_DATA.datのCSVファイルを読み込んでます。


■フラグ管理

033_GameFlgPluginの機能を簡単に紹介しておきます。
このプラグインは、800_GAME_FLG.datを読み込みフラグの管理をしています。
800_GAME_FLG.datは、CSVデータ設定(Ver1.01).xlsの「800_フラグ」シートをCSV化してます。

★シートの中身
・フラグID
 管理するフラグの名前です。

・初期フラグ
 フラグの初期値です。

・フラグタイプ
 前回お話した、フラグタイプです。

・コメント
 このフラグのコメントで、情報としては取り込みません。


■イベント管理

051_EventPluginの機能を簡単に紹介しておきます。
このプラグインは、852_EVENT_DATA.datを読み込んでイベントの管理をしています。
852_EVENT_DATA.datは、CSVデータ設定(Ver1.01).xlsの「852_イベント」シートをCSV化してます。

★シートの中身
・ID
 管理しているイベントのIDです。

・タイミング
 どこで発生するかです。

・条件フラグ
 ここに設定されているフラグが全てON(1)なら、イベント発生条件を満たします。
 未設定は出来ません、DUMMYを設定する事で擬似的に未設定にします。
 ※DUMMYは常にONなので。

・否条件フラグ
 ここに設定されているフラグが1つでもONなら、イベントは発生しません。

・ターン
 SLG時に特定ターンを条件にする為に設定してます。今は使ってません。

・終了タイプ
 イベントが何度も発生するかを表します。0なら1度きり、1なら何度も発生します。

・storage
 イベントの発生条件を満たした時に、実行されるイベント用のKSファイル。
 つまり、イベント本体です。

・target
 上記ファイル内のジャンプ先のラベル。
 私はイベント事にファイルを分けるので、基本は同じです。

・セットフラグ
 イベントが発生した時に、立つフラグです。
 イベントの発生をキーにして、次のイベントを発生させたいなら、ここにそのフラグを設定する事で可能です。

・オフフラグ
 イベントが発生した時に、オフになるフラグです。
 イベント発生で、次のイベントを発生させなくするのに使います。


■サンプルの流れ

まず、サンプルの吉里吉里を実行すると、firstが読み込まれ、プラグインがロードされます。
その後、jyanken.ksmainラベルに飛びます。

まずは、jyanken.ksの中身を見てみましょう。

;********************************************************
;じゃんけんメイン
;
;********************************************************
*main
;メインイベント処理
[eval exp="event.exeEvent('MAIN')"]

;じゃんけん結果フラグをクリアします
[eval exp="global.game_flg.clearFlgType('J')"]

;じゃんけんボタンを表示します。
[eval exp="jyanken_win.openWin('fore')"]



;********************************************************
;じゃんけん後に飛ぶラベル
;
;********************************************************
*jyanken_go

;じゃんけんの結果はイベントに飛んでお知らせします
[eval exp="event.exeEvent('JYANKEN_GO')"]
[s]

物凄いシンプルですね。
では、実際に起動してみるとどうでしょうか。
E001_最初のイベント.ksが実行されましたね。

;メインイベント処理
[eval exp="event.exeEvent('MAIN')"]

このイベントの実行は、この部分で行われています。

エクセルのイベントシートを見ると、「最初のイベント」は条件が全て、DUMMYです。
更にタイミングが、MAINです。
DUMMYは、必ずONの状態なので、最初のイベントは、発生条件を満たしてます。

このサンプルでは、以下の様な少し分かりにくい方式でイベントを実行してます。
まず、003_イベント.ksMAINラベルに飛びます。
そして、E001_最初のイベント.kseventラベルに飛びます。
どうして、この様な面倒な事をしているかは、後述の003_イベントの役割で解説します。
ここで大事なのは、イベントが終わったら、再び、jyanken.ksMAINラベルに飛ぶと言う事です。

再びmainラベルに飛んだので、イベントチェックが発生します。
;メインイベント処理
[eval exp="event.exeEvent('MAIN')"]


ここで、E001_最初のイベント.ksは既に実行され、更に終了タイプが0なので、もう実行されません。
その下にある、2回目のイベントが発生します。

ここで、イベントの発生条件にもう1つ条件がある事が分かりますね。
最初のイベント」と、「2回目のイベント」は同じ条件です。
つまり、どちらも条件を満たしていました。
条件を満たしているイベントが複数あった場合、上から順番に優先されます
ですので、2回目イベントは同条件でありながら、2回目の発生なのです。

2回目イベントが終わると、ジャンケンウィンドウが開きます。
じゃんけんウィンドウ

ぐーが勝ち、ちょきが負け、ぱーがアイコです。

この時、ぐー、ちょき、ぱーのボタンを押すと、どれも同じ場所である、jyanken.ksjyanken_goラベルに飛びます。
そして、それぞれのボタンを押した時に、KATI、MAKE、AIKOのフラグをそれぞれ立てています。

004_JyankenPlugin.ksのこの部分ですね。
//===============================================
//ぐーボタンを押下
//===============================================
if(i_id == "GU")
{
  //勝ちフラグON
  global.game_flg.setGameFlg("KATI", 1);
}

//===============================================
//ちょきボタンを押下
//===============================================
if(i_id == "TYOKI")
{
  //アイコフラグON
  global.game_flg.setGameFlg("AIKO", 1);
}

//===============================================
//ぱーボタンを押下
//===============================================
if(i_id == "PAA")
{
  //負けフラグON
  global.game_flg.setGameFlg("MAKE", 1);
}

;じゃんけんの結果はイベントに飛んでお知らせします
[eval exp="event.exeEvent('JYANKEN_GO')"]

ボタン押下時に立てたフラグを元に、この部分でそれぞれのイベントを発生させてます。
発生後は、再びjyanken.ksmainラベルに飛びます。
勝ち負けアイコのイベントは終了タイプが1なので、ボタンを押せば何度でも発生します。


■ジャンケン結果のフラグ制御

ここで、ちょっと疑問を感じませんか?
それは、ジャンケン結果の、勝ち、負け、アイコのイベントは、何度押しても正しいイベントに飛ぶという事です。
当たり前じゃないかと思うかも知れませんが、良く考えて見て下さい。
例えば、1度ぐーのボタンを押すと、KATIフラグがONになります。
そうなると、次は何度イベントチェックをしても、一番上の勝ちイベントが実行される筈です。

では、何故そうならないかと言うと、jyanken.ksmainラベルにある、これが原因です。

;じゃんけん結果フラグをクリアします
[eval exp="global.game_flg.clearFlgType('J')"]


もう一度、フラグのエクセルシートを見てみましょう。
フラグタイプがKATI、MAKE、AIKOは、Jになってますね。
そうです、ここで、フラグタイプがJのフラグは、全てOFF(0)に一度クリアされてます。
ここは、前回も少しお話しましたね。

これにより、戦闘に参加したキャラクターイベントや、敵イベント等が起こせます。


■003_イベントの役割

先ほど記載した通り、イベントは一度、003イベント.ksと言うファイルを通してからそれぞれのイベントに飛ぶ様にしてます。
なぜこの様な、面倒な真似をするかというと、理由は2つあります。

・発生タイミング事の処理を統一
 例えば、戦闘中に発生するイベントなら、終わった後に戦闘に戻る必要があります。
 また、戦闘用のコマンドボタン等を操作出来なくするなど、イベント中に不具合が発生しない様に処理が必要です。
 これらの処理を、各イベントファイルに記載するのはバグの元になります。
 統一する事で、バグの発生を抑え、修正も容易にします。

・イベントの発生場所を自由に出来る
 イベントの発生タイミングをある程度変える事が出来ます。
 つまり、発生タイミング固有の問題を、003_イベント.ksで吸収しているので、戦闘中に起こっていたイベントを、戦闘後にするなど、イベントの発生タイミングを変えても殆ど改修が必要ありません。


■まとめ

今回は、イベントとフラグの制御用のプラグインをアップしました。
動的ゲームを作成するためには必須の機能です。
また、ノベルでも分岐の多いアドベンチャーに近いゲームを作る場合は、使えるかと思います。







◆つぶつぶ主人公HP◆  ◆サンプルダウンロードの一覧◆
スポンサーサイト
2014.11.20 / Top↑