【unity】3D脱出ゲーム作成_その12

3D脱出ゲーム

UniRxのインストール

これまで同様にギミック操作中はカメラを切り替えようと思うのですが、新しい方法も試してみたいと思います。unityアセットストアより以下をダウンロード_プロジェクトにインストールしてください。プロジェクトウィンドウにPluginsフォルダが表示され、その中にUniRxフォルダが表示されればインストール完了です。

では何ができるのかについて、日本語での公式説明はなかったので抜粋してgoogle翻訳してみました。

GameLoop (every Update、OnCollisionEnter など)、Sensor (Kinect、Leap Motion など) はすべてイベントです。 Rx は、多くの LINQ クエリ演算子を使用して時間ベースの操作を簡単に構成および実行できるリアクティブ シーケンスとしてイベントを考慮します。

様々なイベントを時間ベースで考慮できる=様々なイベントを非同期処理に換算できる という事になるのでしょうか。実践したいと思います。

カメラを指定の位置にズームさせる

前回外観のみ作成したブレーカーをシーン上に配置しました。UniRxを活用してカメラをズームさせてみたいと思います。

プレイヤー視点位置的には箱オブジェクトと同じ面の反対端

その2までで更新したPlayerCameraクラスを以下の通り更新します。

using System;
using UniRx;
[SerializeField]Transform TargetTransform;//移動先
[SerializeField]Transform PlayerTransform;//初期位置
Vector3 StartPosition;//カメラの移動開始位置
Quaternion StartRotation;//カメラの移動開始向き
[SerializeField]private float LerpTime = 3.0f;//ズーム時間
public GameObject PowerBoxClick;//移動先のオブジェクト
public GameObject PowerBoxBack;//ズームから初期位置への戻るボタン
public void ExecuteMove()
{
   StartPosition = Camera.main.transform.position;
   StartRotation = Camera.main.transform.rotation;
   Observable//移動処理を開始する
       .IntervalFrame(1, FrameCountType.FixedUpdate)//1フレーム毎に呼び出し
       .TimeInterval()//フレーム間の経過時間を取得
       .Select(timeInterval => timeInterval.Interval)//TimeSpan型データを抽出
       .Scan((last, current) => last + current)//前回までの経過時間を加算
       .TakeWhile(intervalTimeSpan => (float)intervalTimeSpan.TotalSeconds < LerpTime)//LerpTimeが経過するまで実行
       .SubscribeOnMainThread()//フリーズ対策の為メインスレッド(デフォルト)で実行
       .Subscribe(intervalTimeSpan =>
       {
           float totalInterval = (float)intervalTimeSpan.TotalSeconds;
           float lerpFactor = Mathf.Min(totalInterval / LerpTime, 1.0f);//いずれか最小値をlerpFactorへ代入
           Camera.main.transform.position = Vector3.Lerp(StartPosition, TargetTransform.position, lerpFactor);//Leap使用_lerpFactorで間を補間
           Camera.main.transform.rotation = Quaternion.Lerp(StartRotation, TargetTransform.rotation, lerpFactor);//Leap使用_lerpFactorで間を補間
       },
       () =>
       {
           Camera.main.transform.position = TargetTransform.position;
           Camera.main.transform.rotation = TargetTransform.rotation;
       }
       )
       .AddTo(this);
   PowerBoxClick.SetActive(false);
   Invoke("BoxBack", 3);//3秒後にBoxBackメソッドを実行
}
void BoxBack()
{
   PowerBoxBack.SetActive(true);
}

名前空間にUniRxと何故かなかったのでSystemを追加します。ExecuteMoveメソッドではまず現在位置を保存した後、UniRxを活用した Observable.各種オペレーター を繋ぎ合わせていくことで実行されます。各種オペレーターについてはコメントに記載した通りですが、移動先に到達するまで毎フレーム少しづつカメラを移動させていく流れです。その少しづつを補完するのがLeap(詳細はこちら)になります。今回は移動先の空オブジェクトそのものにClickイベントを設定しました。

ズームは完了したのでズームアウトで元に戻るExecuteBackメソッドも作成しましょう。と言ってもExecuteMoveメソッドの中身をそのままコピペしてTargetPlayerに変更。PowerBoxClickを有効・PowerBoxBackを無効にして元通りにするだけです。今度は戻るボタンを押したら初期位置に移動する事になります。

以下デモになります。

ブレーカーとカメラの間に空オブジェクトPowerBoxClickを設置してます。

コメント

タイトルとURLをコピーしました