【Unity】warframeっぽいカメラを作ってみる-2
前回の記事
前回の記事はこちらになります。
hetima333.hatenablog.com
この記事で作成する挙動
この記事ではエイム動作を作成します。
エイム動作の参考資料です。
エイム動作の仕様
エイム動作の仕様をまとめておきます。
- エイムボタンが押された時に、ズームを開始する。
- エイムボタンが離された時に、ズームしていない状態にする。
- エイム動作はカメラの正面に向かって行う
※プレイヤーが手前(カメラの方向)を向いていても画面の奥に向かってエイム動作を行う
使用したアセット
- UniRx
ReactiveExtentions(Rx)をUnity向けに移植したライブラリです。
処理ごとにスコープがはっきりしてわかりやすくなるので使用しました。 - DOTween
比較的簡単にトゥイーンが作成できるトゥイーンエンジンです。
エイム動作を滑らかにするために使用しました。
ソースコード
PC以外にも対応できるように、InputManagerに画像のようなものを追加しました。
using UniRx; using UniRx.Triggers; using UnityEngine; using DG.Tweening; public class AimCamera : MonoBehaviour { [SerializeField, Tooltip("ズームする距離")] private float distance; [SerializeField, Tooltip("エイムにかかる時間"), Range(0.0f, 1.0f)] private float duration; // カメラの基点 private Transform pivot; // 非エイム時のカメラの基点座標 private Vector3 idlePivotPosition; /// <summary> /// 更新前処理 /// </summary> void Start () { // pivotの参照 pivot = GetComponentInChildren<Camera>().transform.parent; // 非エイム時のカメラの基点座標 idlePivotPosition = pivot.localPosition; // エイム開始時 this.UpdateAsObservable() .Where(_ => Input.GetButtonDown("Aim")) .Subscribe(_ => { // 現在の位置から正面にエイム距離分だけ離れた位置に向かってトゥイーンする pivot.DOLocalMove(idlePivotPosition + (Vector3.forward * distance), duration) .SetEase(Ease.InOutCubic); }); // エイム終了時 this.UpdateAsObservable() .Where(_ => Input.GetButtonUp("Aim")) .Subscribe(_ => { // 非エイム時のカメラの基点座標に向かってトゥイーンする pivot.DOLocalMove(idlePivotPosition, duration) .SetEase(Ease.InOutCubic); }); } }
実際の動作
実際の動作のサンプルgifです。比較用に床とブロックを配置しています。
ImageEffectをつけると、よりそれっぽくなるかと思われます。
追記
17/02/24 エイムボタンを連打するとカメラが奥のほうに行ってしまっていたのでソースコードを修正