【制作実習】関数ポインタを使用したiTween風アニメーション

コールアンドマジック製品版では、iTween風のアニメーション(移動、回転、拡大縮小のみのアニメーション)を行う仕組みを自作する予定だ。

アニメーションが必要な局面が体験版で洗い出されていて、iTweenのように汎用的でリッチなコンポーネントは不要だという判断だ。

加えてiTweenではアニメーションごとにインスタンスが生成されるのもオーバーヘッドが大きいので、スレッドプールに近い仕組みでアニメーション用のコンポーネントを再利用する。

アニメーション用のコンポーネントは、シンプルなGameObjectでUpdateメソッドのみを使用する。

//アニメーションを開始するメソッド
public void DoAnimation(Action<float> func, Action callback, float delay, float span) {
	this.func = func;
	this.callback = callback;
	this.delay = delay;
	this.span = span;
	stackTime = 0f;
	completed = false;
	gameObject.SetActive(true);
}

void Update () {
		
	stackTime += Time.deltaTime;

	if (stackTime < delay) {
		return;
	}

	float animTime = stackTime - delay;

	if (animTime > span) {
		animTime = span;
		completed = true;
	}

	//進捗0~100%を引数に関数ポインタを実行する。
	func(animTime / span);

	if (completed) {
		if (callback != null) {
			callback();
		}
		gameObject.SetActive(false);
	}
}

フレーム毎の処理が定義された関数ポインタを渡しているので、実際のアニメーションの振る舞いはアニメーションするオブジェクト自信で定義する形にする。

public void AnimFadeIn(float progress) {
	//アルファ値を直線的に変化させている
	colorBuff.a = 1f - progress;
	fadeFilter.renderer.material.color = colorBuff;
}

アニメーション用のコンポーネントは同時に平行してアニメーションする最大数のインスタンスを作っておいて、ローテーションで使いまわすという簡易的なスレッドプールの実装になっている。

5年前

コメントを残す

メールアドレスが公開されることはありません。