プログラマーの大角です。Unityで車を扱ったOculus Rift用のVRアプリ開発を行った際の実装の一部をご説明させて頂きます。
下記記事の続きとなります
https://qiita.com/NestVisual/items/dbb54a920ecf2e5707a7
概要
今回は決められたルートを走る車が指定したポイントに来た時に、STATEを変化させて次のSTATEで処理を行う部分についての実装方法を説明させて頂きます。
前回の記事でWayPointProgressTrackerAuxiliaryForMainCar.csで定義したProgressNumForMainCarという変数を使用します。
実装工程(1)
指定したルートのポイントにProgressNumForMainCarが到達した時にSTATEに連動させるメソッドが下記になります。
UniRxで実装しています。
/// <summary>
/// 指定したWayPoint以上で指定したStateに変更
/// </summary>
/// <param name="state">変更したいState</param>
/// <param name="progressNum">WaypointProgressTrackerのprogressNum</param>
protected void StateChangeInSpecifiedWaypoint (STATE state, int progressNum) {
this.UpdateAsObservable ()
.Select (x => WayPointProgressTrackerAuxiliaryForMainCar.ProgressNumForMainCar)
.DistinctUntilChanged ()
.Subscribe (_ => {
if (CurrentStateAndDifferenceExists (state) &&
WayPointProgressTrackerAuxiliaryForMainCar.ProgressNumForMainCar >= progressNum) {
State = state;
}
});
}
/// <summary>
/// 変更したいSteteと現在のStateとの差分確認
/// </summary>
/// <param name="setState">変更したいState</param>
/// <returns></returns>
bool CurrentStateAndDifferenceExists (STATE setState) {
int setStateIntType = (int)setState;
int currentStateIntType = (int)State;
return setStateIntType > currentStateIntType;
}
実装工程(2)
メソッドを使う側は下記のように記述します。
STATE.ONEなど今回は数字で定義してますが、実際にはそのSTATEで行う内容で定義しています。
switch (State) {
case STATE.ONE:
// MEMO:場合によっては何らかの処理の後に下記メソッドを呼び出す等組み合わせていく
StateChangeInSpecifiedWaypoint (STATE.TWO, 63);
break;
case STATE.TWO:
// TODO:ここに指定したルートのポイントで行いたい処理を記述する
break;
default:
break;
}
あとがき
UniRxは便利なので良く使わせて頂いてます。
最後まで見て頂き有難う御座いました。