Unityでゲーム作るぞ

Unityでゲーム制作できるようになるまでのリアルドキュメント

敵の攻撃モーションで、何度も接触判定が起きてしまうのを防止


:修正前

敵の攻撃モーションで何回もダメージ判定が起きるのを防ごうと考えた。

まず基本。
手足に当たり判定とスクリプトを付け、OnTriggerEnter,OnTriggerExitをセット。
これで「一度だけ当たり判定に入るのを感知してくれるからOK」だと思っていた。
(hit変数は攻撃モーション前、構えの時点で既に当たり判定に入っていた場合を防ぐ為に用意)

// モーションの前に当たり判定に触れていても大丈夫なように
private var hit : boolean = false;
function OnTriggerEnter(col : Collider){
	hit = true;
}
 

function OnTriggerExit(col : Collider){
	hit = false;
}	

function Update () {
	if( isAttacking() && hit ){
		player.SendMessage("Damaged");
		hit = false;
	}	
}

function isAttacking(){
	var state : AnimatorStateInfo = my_anime.GetCurrentAnimatorStateInfo(0);
	return state.IsName( "Base Layer." + attack_state);
}

しかしだめ。
実際の攻撃モーションは割とがくがくと動き、それに追随する当たり判定も、女騎士にぶつかったり離れたりで結局、数回計測してしまう。

次点。
「女騎士が喰らいモーション中は、ダメージ判定を無視するようにすればいい」と考える。

private var d_hash_val = Animator.StringToHash("damage");

function Damaged(){
	// 既にダメージモーション中なら喰らわない
	var state : AnimatorStateInfo = animator.GetCurrentAnimatorStateInfo(0);
	if(state.tagHash == d_hash_val)return;
        ...

女騎士側のダメージモーションに付けたタグで判定(関係ないがかなり調べて、ハッシュ値の使い方が初めて分かった…)

一見良さそうだがこれもだめ。
女騎士の喰らいモーションより、ゴブリンの攻撃モーションの方が長い。
攻撃モーションが終わるまでに、これでも2回くらい喰らってしまう。


で、最終形。
「受け手より、攻め手の”1回のモーションにダメージ1回”を徹底させるべき」と頭を切り替える。
すなわち当たり判定の接触と、攻撃モーション変化(終了まで)を監視だ。

// モーションの前に当たり判定に触れていても大丈夫なように
function OnTriggerEnter(col : Collider){
	if( isAttacking()){
		if(! isAlreadyHit()){
			player.SendMessage("Damaged");
			StartCoroutine("_AttackAnimeEnd");
		}
	}
}
 
function isAttacking(){
	var state : AnimatorStateInfo = my_anime.GetCurrentAnimatorStateInfo(0);
	return state.IsName( "Base Layer." + attack_state);
}

private var one_hit : boolean = false;
function isAlreadyHit(){
	return one_hit;
}

function _AttackAnimeEnd(){ // 1回の攻撃でヒットは一回まで
	one_hit = true;
	while(isAttacking()){
		yield;
	}
	one_hit = false;
}

一度ヒットしたらコルーチンを呼び出し。
モーションが終わるまで監視する。
モーションが終わってなければ二度目のヒットは無視される。

これで上手くいくようになった。


:修正後