読者です 読者をやめる 読者になる 読者になる

ヘチマのノート

主にプログラムについて、興味の湧いたことを書きます。

【Unity】warframeっぽいカメラを作ってみる-2

前回の記事

前回の記事はこちらになります。
hetima333.hatenablog.com

この記事で作成する挙動

この記事ではエイム動作を作成します。
エイム動作の参考資料です。
f:id:hetima333:20170216230225g:plain

エイム動作の仕様

エイム動作の仕様をまとめておきます。

  • エイムボタンが押された時に、ズームを開始する。
  • エイムボタンが離された時に、ズームしていない状態にする。
  • エイム動作はカメラの正面に向かって行う
    ※プレイヤーが手前(カメラの方向)を向いていても画面の奥に向かってエイム動作を行う

使用したアセット

  • UniRx
    ReactiveExtentions(Rx)をUnity向けに移植したライブラリです。
    処理ごとにスコープがはっきりしてわかりやすくなるので使用しました。
  • DOTween
    比較的簡単にトゥイーンが作成できるトゥイーンエンジンです。
    エイム動作を滑らかにするために使用しました。

ソースコード

PC以外にも対応できるように、InputManagerに画像のようなものを追加しました。
f:id:hetima333:20170223235222p:plain

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);
			});

	}
}

このスクリプトは前回インスタンス化したFreeLookCameraRigにアタッチすると使用できます。
f:id:hetima333:20170224001737p:plain

実際の動作

実際の動作のサンプルgifです。比較用に床とブロックを配置しています。
f:id:hetima333:20170224002340g:plain

ImageEffectをつけると、よりそれっぽくなるかと思われます。

追記

17/02/24 エイムボタンを連打するとカメラが奥のほうに行ってしまっていたのでソースコードを修正