<= クリックすると開きます
using UnityEngine; /// <summary> /// 攻撃のオーナーの種類 /// </summary> public enum OwnerType { Player, Enemy } public class HitController : MonoBehaviour { [SerializeField] private float knockbackPower = 5.0f; // ノックバックさせる力 [SerializeField] private OwnerType ownerType; // アイテムの所有者 [SerializeField] private float forcePower = 1000.0f; // アイテムを落とす際の力 private float range = 3.0f; private float height = 2.0f; /// <summary> /// 初期設定 /// </summary> /// <param name="ownerType"></param> public void SetUpOwner(OwnerType ownerType) { this.ownerType = ownerType; } private void OnTriggerEnter(Collider other) { Debug.Log(other.gameObject.name); // ここに書くと先にアイテムを落とす JedgeKnockBackItem(other.transform); // この攻撃のオーナーがプレイヤーで、攻撃対象が敵なら if (ownerType == OwnerType.Player && other.TryGetComponent(out Enemy enemy)) { // 敵をノックバック KnockbackTarget(enemy.transform); // 敵のステート変更。合わせて移動停止させる enemy.PrepareChangeState(EnemyState.STOP, 2.0f); } // この攻撃のオーナーが敵で、攻撃対象がプレイヤーなら else if (ownerType == OwnerType.Enemy && other.TryGetComponent(out PlayerController player)) { // プレイヤーをノックバック KnockbackTarget(player.transform); } // ここにアイテムを落とす処理を書くと、ノックバック後にアイテムを落とす // 対象の位置からアイテムがノックバックするので、落とした相手がアイテムを拾いやすくなる //JedgeKnockBackItem(other.transform); } /// <summary> /// 肉を持っているか判定 /// </summary> /// <param name="target"></param> private void JedgeKnockBackItem(Transform target) { // GetChild メソッドと for 文を組み合わせて Radar を見つける // 子オブジェクトの数を固定化しないので、敵でもプレイヤーでも問題なく動く for (int i = 0; i < target.childCount; i++) { if (target.GetChild(i).TryGetComponent(out ItemBase item) == true) { // アイテムをドロップ item.Drop(); Debug.Log("アイテム落としに成功!"); // アイテム自体をノックバック KnockbackItem(item); break; } } } /// <summary> /// アイテムのノックバック /// </summary> /// <param name="item"></param> private void KnockbackItem(ItemBase item) { // アイテムをランダムに吹き飛ばす if (radar.gameObject.TryGetComponent(out Rigidbody rb)) { rb.AddForce(new Vector3(Random.Range(-range, range), height, Random.Range(-range, range)) * forcePower); } } /// <summary> /// 対象をノックバック /// 敵やプレイヤー、という風に対象を固定化せず、引数でもらった情報をノックバックの対象とする /// </summary> /// <param name="target"></param> private void KnockbackTarget(Transform target) { // 対象を吹き飛ばす方向(移動してきた反対方向)を設定 Vector3 direction = (target.transform.position - transform.position).normalized; // 高さを調整 direction = new(direction.x, 0, direction.z); // 対象を吹き飛ばす target.position += direction * knockbackPower; } }
[SerializeField] private HitController hitControllerPrefab; // 見えない当たり判定用のプレハブ [SerializeField] private Transform hitControllerGenerateTran; // 見えない当たり判定の生成位置 [SerializeField] private float duration = 0.25f; // 見えない当たり判定の生存時間 /// <summary> /// AnimationEvent より実行 /// </summary> public void Hit() { Debug.Log("Hit メソッドの呼び出し"); // 見えない当たり判定を指定した位置に生み出す HitController hitController = Instantiate(hitControllerPrefab, hitControllerGenerateTran.position, Quaternion.identity); // 見えない当たり判定の初期設定 hitController.SetUpOwner(OwnerType.Player); // 見えない当たり判定を言って時間後に破棄 Destroy(hitController.gameObject, duration); }