攻撃の当たり判定をコライダーで作ってみました。まず敵と武器にコライダーを付けます。
刀にはタグとレイヤーを設定し、Rigidbodyも追加します。
レイヤーを使って、武器がプレイヤーと衝突できないように設定しました。
これで、敵のコライダーを付けたボーンにスクリプトを追加して、衝突したときに敵のルートのスクリプトのメソッドを呼んでHPを減らしたり怯んだりさせてみます。
すると、衝突しても反応がありません。しかし巨大化させた刀はちゃんと当たっているように見えます。
試しにスモークグレネードを当ててみると反応しました。
リジッドボディのIsKinematicのチェックが入っていると、衝突しなくなるようです。そこで、刀はトリガーで判定してみるとうまくいきました。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EnemyBodyScript : MonoBehaviour
{
private void OnCollisionEnter(Collision collision)
{
if (collision.collider.tag == "Weapon")
{
transform.root.GetComponent().SetHP(-0.4f);
}
}
private void OnTriggerEnter(Collider other)
{
if (other.tag == "Weapon")
{
transform.root.GetComponent().SetHP(-0.4f);
//other.isTrigger = false;
}
}
}
すると、刀を振らないで手に持っているときに刀が敵と重なっても攻撃できてしまうので、普段はコライダーのIsTriggerのチェックを外しておいて、攻撃モーションの途中でチェックを入れ、攻撃モーションの終わりで再度チェックを外すようにしました。
// 刀で攻撃中
else if (animator.GetCurrentAnimatorStateInfo(0).IsName("KnifeAttack"))
{
if (animator.GetCurrentAnimatorStateInfo(0).normalizedTime > 0.8f)
{
if (katanaColIsTrigger)
{
katanaCollider.isTrigger = false;
katanaColIsTrigger = false;
}
}
else if (!judged && animator.GetCurrentAnimatorStateInfo(0).normalizedTime > 0.4f)
{
judged = true;
katanaCollider.isTrigger = true;
katanaColIsTrigger = true;
これで、刀で攻撃するタイミングをコントロールできるようになりました。
刀のサイズを戻すと、かなり近くでないと攻撃が当たらないので、刀の大きさやモーションを修正する必要があるようです。