【Unity2d】イベントを処理する仕組みを作ろう
こんにちは。なおキーヌです。
ブログ毎日更新は364日目になります。
オブジェクトを調べることによってイベントリストの取得が出来たので、
そのリストをもとにイベントキューを作りイベントシーンに移りましょう。
イベントキューにイベントリストを格納する
イベントマネージャーを作る前にイベントリストを格納しましょう。
// 調べる処理
protected override void Check() {
if (_State.ActState == 8 ) {
// 衝突判定をしたオブジェクトのcolliderがnullでなければ
_isLcastFront = getLineCast2Object(_State.Direction, _Player, _layerMaskEvent, true);
Debug.Log(_isLcastFront.collider);
if (_isLcastFront.collider != null ) {
// イベントリストの有無を調べる
if (_isLcastFront.collider.GetComponent<State_Event>().eventList.Length > 0) {
// イベントリストを取得
string[] ev = _isLcastFront.collider.GetComponent<State_Event>().eventList;
// イベントリストを格納
_State.allSetEventQueue (ev);
}
}
}
}
これでイベントキュー配列に格納することができました。
イベントキューが1つでもあるとイベントモードになるようになってましたね。
State_PlayerのUpdateをもう一度見ておきましょう。
protected override void Update() {
// イベントキューを監視
if (getEventQueue.Count() == 0) {
// フリーズ対策のイベントモードを解除
// ~~~省略~~~
} else {
// イベントキューが1つ入っていればイベントモードにする
Debug.Log("イベントモードだよ");
}
}
ハンマーオブジェクトを調べるとイベントモードに切り替わることがわかります。
イベントモードに入ったらイベントキューから値を取り出して処理します。
イベントキューの処理はステート側ではやらずに、イベントマネージャーに行わせるのが正しいですね。
早速イベントマネージャーを作ります。
イベントマネージャーに関しては子を作る必要性はなさそうなので親のままいきます。
イベントマネージャーを作る
まずイベントキューを操作するためにStateを取得する必要があります。
それではEvent_Managerを作りましょう。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Event_Manager : MonoBehaviour
{
// ステート用変数
private State_Manager _State;
private void Start() {
// ステートを取得
_State = GameObject.FindGameObjectsWithTag("State_Manager")[0].GetComponent<State_Player>();
}
private void Update() {
EventExecutioner();
}
private void EventExecutioner() {
// イベントを監視
if (_State.getEventQueue.Count() != 0 ) {
// イベントが1つでもあったら処理をする
}
}
}
シンプルにState_Playerを持っているオブジェクトを取得し、
イベント執行関数を作成してその中でイベントキューを監視して1つでもあれば処理をするという仕組みにしていきます。
なければ何もしないという関数ですね。
とりあえず1つのマネージャーにイベント処理を書いていきますが、
増えてきたら分割も考えていきましょう。
イベントを取りだす関数を作る
イベントキューはstring型を格納したリスト型になります。
リストから1つ取り出し、文字列をカンマで分割したものをint配列に変換して
そこから判断する処理を書いていきます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Event_Manager : MonoBehaviour
{
// ステート用変数
private State_Manager _State;
private void Start() {
// ステートを取得
_State = GameObject.FindGameObjectsWithTag("State_Manager")[0].GetComponent<State_Player>();
}
private void Update() {
EventExecutioner();
}
// イベントを監視して執行
private void EventExecutioner() {
// イベントが1つでもあったら処理をする
if (_State.getEventQueue.Count() != 0 ) {
// 1.イベントキュー取り出し(大元キューの0個目を削除)
// 2. 取り出したイベントをint型配列に変換
int[] ev = _str2IntArray(_State.getEventData());
// 配列1つ目を元に処理を分岐
switch(ev[0]) {
// メッセージイベント
case 5:
break;
case 0:
break;
}
}
}
// stringを取り出してint配列を返す
private int[] _str2IntArray(string ev) {
return ev.Split(',');
}
}
State側で用意したイベントキューを1つ取り出す関数を使い、
取り出した文字列を関数に渡してint型の配列を返してくれる関数を利用します。
そしてそのint配列を元にイベント処理を分岐させます。
後はメッセージイベントを作ってそれを呼び出して、int配列の2個目で表示するメッセージを
データベースから抽出して3個目の要素でどう表示するかを決めます。
次回はメッセージの表示する仕組みを作っていきましょう。
それでは!