//tips
//eventtriggerを使用したダメージ判定
アタックモーション時にisTriggerをつけたコライダーをオンにすることでダメージを相手に与える。
Rabbitの右足にコライダーを設置し、足のアタックモーションにあったコライダーの位置調整を行う。
HPスクリプトの下記のように受けて側で接触感知を行おうと考えたが、攻撃手段が増えると全てのパターンの接触反応を受けて側に記述しなければいけないことになるので、攻撃側での接触感知の方法を考えていく。
private void OnTriggerEnter(Collider other)
{
if (other.gameObject.tag == "Weapon")
{
Debug.Log("hit Player");
Debug.Log("hit Damage");
hp -= other.gameObject.GetComponent<rodManager>().powerEnemy;
//hp -= other.gameObject.GetComponent<rodManager>().powerEnemy;
}
//体力が0以下になった時{}内の処理が行われる
if (hp <= 0)
{
Destroy(gameObject); //ゲームオブジェクトが破壊される
}
}
修正した下記をRabbit本体にアタッチし、右足にアタッチしたEventTriggerコンポーネントにPointerEnter型の接触感知をさせ、感知した場合にOnTriggerEnterメソッドを行わせる。
※EventTriggerコンポーネントは間違い
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RabbitAtackManager : MonoBehaviour
{
public float powerEnemy = 1; //攻撃力
HPScriptE hPScriptE;
[SerializeField]
GameObject ParentObject;
Public void OnTriggerEnter(Collider other)
{
if (other.gameObject.tag == "Player"&& other.gameObject != ParentObject)
{
hPScriptE = other.gameObject.GetComponent<HPScriptE>();
hPScriptE.hp -= powerEnemy;
if (hPScriptE.hp <= 0)
{
Destroy(other.gameObject); //ゲームオブジェクトが破壊される
}
}
}
}
次にEnvPlaymove4スクリプト に挿入したAttackmotionメソッドで右足のコライダーの表示/非表示の切り替えを行う。アニメーションの開始地点と終了地点でコライダーの切り替えを行いたいのでコルーチンを使用し、アクション開始時にコンポーネントをオンにし、アクションを終了する際にオフにするコードを追加した。
public void Attackmotion()
{
animator.SetTrigger("Attack1");
StartCoroutine("WaitAnimationfin");
}
IEnumerator WaitAnimationfin()
{
rightfootcollider = GetComponent<Collider>();
rightfootcollider.enabled = true;
var state = animator.GetCurrentAnimatorStateInfo(0);
yield return new WaitWhile(() => state.IsName("bk_rh_right_A"));
rightfootcollider.enabled = false;
}
こうするとRabbitオブジェクト自体が自由落下してしまい、rightfootcolliderの取得コンポーネントがきちんと足になっていなかったのでCollider rightfootcollider = rightfoot.GetComponent<Collider>();として設定しなおした。
一旦decoyに対してダメージを与えてみる。decoyスクリプトにhpの記述をしているのでそちらに参照を一部変更。そして、足にアタッチしているコライダーはオフにしておく。
なぜか足のコライダーコンポーネントがオンにならないので色々と模索していたら、ボタン連打したらオンになった。これはアクション動作が早すぎるためオンオフ動作が一瞬となり表示が読み込まれる前に非表示処理の段階に移っているしまっているのかもしれない。
まずコライダーのチェックをオンにしたままアクションさせてみたがこれでも機能しない。ここで、OnTriggerEnterとeventtriggerを混同していることに気づく。
3dのコライダーのistriggerの接触を感知する場合は、OnTriggerEnter関数を使用する。2dのマウスボタンの位置などに反応させるeventtriggerとは全く異なる。
Rabbitattackmanagerを足オブジェクトに移動させ、private void OnTriggerEnter(Collider other)を足の領域に入ることで発動させるようにした。
アニメーションの遷移時間にはyield return new WaitForSeconds(1);を利用して攻撃判定の残存時間を長くすることで、コライダーのオンオフも確認できた。
一回の攻撃で2度のダメージが入っているのでそこも修正する。