判断物体是否在扇形内
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class FanAttack : MonoBehaviour
{
public float r;
public float angle;
private Transform[] targets;
private void Start()
{
targets = FindObjectsOfType<Transform>();
Cast(transform.forward);
}
public void Cast(Vector3 dir)
{
if (targets == null || dir.y != 0)
return;
Vector3 targetPos = Vector3.zero;
for (int i = 0; i < targets.Length; i++)
{
if (targets[i] == null || targets[i] == transform)
continue;
targetPos.Set(targets[i].position.x, transform.position.y, targets[i].position.z);
if (Vector3.Distance(transform.position, targetPos) <= r &&
Vector3.Angle(dir, targetPos - transform.position) <= angle / 2)
{
Debug.Log(targets[i].name);
}
}
}
}
矩形检测
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RectAttack : MonoBehaviour
{
public float len;
public float wid;
private Transform[] targets;
private void Start()
{
targets = FindObjectsOfType<Transform>();
Cast(transform.forward);
}
public void Cast(Vector3 dir)
{
if (targets == null || dir.y != 0)
return;
Vector3 verticalDir = default;
for (int i = 0; i < targets.Length; i++)
{
if (targets[i] == null || targets[i] == transform)
continue;
Vector3 vct = targets[i].position - transform.position;
verticalDir.Set(dir.z, dir.y, dir.x);
if (Vector3.Project(vct, dir).magnitude <= len / 2 &&
Vector3.Project(vct, verticalDir).magnitude <= wid / 2)
{
Debug.Log(targets[i].name);
}
}
}
}