ものららい 2022/02/10 17:00

Unityでモーショントゥイーン的なの実装してみた


(またまた前回と変わり映えしないスク)

こんにちは🍎
今回はモーショントゥイーン的なのを。

ここら辺はアセット頼みでもいいところではありますが、自分で作れば細かい所の調整しやすいよなってなったのでとりあえず作ってみました。

※あくまで自身の学習用なので粗があってもおおめにみてね🦝


とりあえずソース。(※他もあるけど今回は平行移動用の)
Motion_Move.cs

using System;
using UnityEngine;

//モーショントゥイーン 平行移動
public class Motion_Move : MonoBehaviour
{
	float _motionTime;
	float _startTime;
	Vector3 _startPosition;
	Vector3 _endPosition;
	bool _localFlag;
	Action _updateFunc;
	Action _compFunc;
	AnimationCurve _curve;
	
	
	void Awake ()
	{
		//非動作状態にする
		Stop();
	}
	
	
	//移動のセット
	public void SetMove (Vector3 position, float time, bool localFlag = false, AnimationCurve curve = null, Action updateFunc = null, Action compFunc = null)
	{
		//時間設定が0の時は即終了させる
		if(time <= 0)
		{
			if(localFlag == true)
			{
				this.transform.localPosition = position;
			}
			else
			{
				this.transform.position = position;
			}
			
			Stop();
		}
		else
		{
			if(localFlag == true)
			{
				_startPosition = this.transform.localPosition;
			}
			else
			{
				_startPosition = this.transform.position;
			}
			
			_motionTime = time;
			_startTime = Time.timeSinceLevelLoad;
			_localFlag = localFlag;
			_endPosition = position;
			_updateFunc = updateFunc;
			_compFunc = compFunc;
			_curve = curve;
			
			enabled = true;
		}
	}
	
	
	//動作停止
	public void Stop ()
	{
		enabled = false;
	}
	
	
	void Update ()
	{
		//停止時は処理しない
		if(Time.timeScale == 0){ return; }
		
		//経過時間
		float _elapsedTime = Time.timeSinceLevelLoad - _startTime;
		
		//経過割合
		float _ratio = _elapsedTime / _motionTime;
		if(_curve != null)
		{
			_ratio = _curve.Evaluate(_ratio);
		}
		
		//ローカル移動
		if(_localFlag == true)
		{
			this.transform.localPosition = Vector3.Lerp(_startPosition, _endPosition, _ratio);
		}
		//グローバル移動
		else
		{
			this.transform.position = Vector3.Lerp(_startPosition, _endPosition, _ratio);
		}
		
		//更新時処理
		if(_updateFunc != null){ _updateFunc(); }
		
		//終了
		if(_elapsedTime > _motionTime)
		{
			Stop();
			
			//終了時処理
			if(_compFunc != null){ _compFunc(); }
		}
	}
}

実際どうやって作るの?的な感じで難しい処理とか想像しちゃいましたが、Vector3.Lerpを使うと案外簡単に2点の間の補完された移動処理が作れました。
Unity スクリプトリファレンス Vector3.Lerp


肝の部分は大体下記のような感じなので、シンプルです。

現在位置 = Vector3.Lerp(開始位置, 終了位置, 進行割合);


進行割合の部分に関してはスタートからの経過時間に対して移動にかかる時間を割ってやればいいだけなので一回処理の流れを自作してみればおおよそ理解できると思います。


進行割合は大体こんな感じ(%出すときの計算ですね🍎)
経過時間 = 現在の時間 - 開始時の時間;
進行割合 = 経過時間 / 移動時間;


AnimationCurveを設定して動かすとこんな感じの心地いい動きもできます。


実際動作するアセットフォルダも置いておきますので、アセットフォルダを空プロジェクトに入れれば確認できます。(Script/Main.csに使用例があります)

2022_02_10_Assets.zip (82.05kB)

ダウンロード

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

最新の記事

記事のタグから探す

月別アーカイブ

記事を検索