エディトリアルデザイナーのアプリ制作日記

Unityで遊ぶ個人開発者のメモ書き

Unityアクションゲーム制作記 その19 ヒットストップみたいなものを入れる

youtu.be

 先週、大阪までえっちら出かけて、某ゲーム部主催の「作ったゲームを持ち寄ってみんなで遊ぶ試遊会」なるものに参加してきました。自分を追い込むための〆切を設定するために参加を決めたのですが、学ぶところもあれば、打ちのめされるところもあったりで、大変刺激を受けました。早くゲームを仕上げたーいと焦る一方、その時に感じた(&言われた)のが、「ヒットストップがあるといいかもー」です。
 一時停止ということまるっきり考えない設計をしているので、いまさら入れるのは抵抗がありました。とはいえ、ヒットストップといっても、アクションゲームや格闘ゲームのようなちゃんとしたものではなく、あくまで攻撃がヒットした時に敵の動きがちょっとだけ「ピタッ」と止まって見える、そんな感じでならいけるかな? とお試しで入れてみました。攻撃を受けた時に以下のメソッドを呼び出すようにするという簡単仕様。本当にコルーチンで時間待ちをして、アニメーション速度を0→1にするだけの単純なものです。

	public void EnemyDamageStopNow(float stime,float stopTime)
	{
		stopStartTime = stime;
		stopTime = stopTime;
		StartCoroutine(EnemyDamageWait());
	}

	IEnumerator EnemyDamageWait()
	{
		yield return new WaitForSeconds(stopStartTime);
		animEnemy.speed = 0f;	//再生スピードを0 animEnemyにanimatorコンポーネントをキャッシュ済み

		yield return new WaitForSeconds(stopTime);

		animEnemy.speed = 1f;	//再生スピードを戻す
	}

 悩んだのが敵の動きを停止させるタイミングです。最初は、敵がプレイヤーからのダメージを受けるとダメージモーションを再生するようにしているので、そのモーション内の最ものけぞったようなタイミングで止めたほうが見栄え的にいいかなぁと、アニメーションクリップの中にイベントを仕込んで上のメソッドを呼び出すようにしました。が、これが大失敗でした。
 当たり前ですが、ダメージモーションといっても敵によって長さや止めたいタイミングが違うので、わんさか敵に囲まれるような本ゲームではばらばらに止まってしまい、非常に気持ちが悪い。攻撃を当てた時の爽快感が欲しいのに、これでは本末転倒です。
 それよりも、攻撃が当たった後、ちょっとディレイを入れてから敵のモーションを止めて、その後一定時間後に動き出すだけ、と画一的に単純にやったほうが、手間もかからず見栄え的にもOKでした。ただ、ザコ敵が群がるシーンでは、止める時間が短すぎたせいか、爽快感があるかどうかは……正直よくわからん状態です。冒頭の映像を見ても「ん〜止まってるか…?」レベルの間違い探しかもしれません。とはいえ、ボスくらいの大きな敵には、ちゃんと攻撃を受けて止まっているように見えていますので、ひとまずこれでヨシとしておきましょう。不具合っぽいのも出てなさそう&またいい手が思いついたら修正するってことで、いつもの棚上げ〜にしちゃいます。
 さて、次はアイテム関係のシステムを入れるかなぁ。やることが止まらないけど、がんばらなきゃだ。うん。