unity3d - 对敌人 AI 进行多次射线投射
问题描述
我有一个带有 3 个射线投射的锥形,但是如果玩家在 3 条线中的任何一条中,敌人只会检测到玩家,我想向敌人添加更多射线投射。我四处打听,有人说用 for 循环添加更多光线投射,但我不熟悉光线投射,所以我需要帮助。下面的照片附件是我现在拥有的,也是我想要的 ai raycast。
public class enemyControl : MonoBehaviour
{
Ray enemyRay;
public Color rayColor;
RaycastHit rayHit;
bool follow;
public float sightDist;
private float timer = 0f;
public float heightMultiplier;
private Vector3 investigateSpot;
public float visionAngle;
private NavMeshAgent agent;
public GameObject him;
void Start()
{
agent = GetComponent<NavMeshAgent>();
him = GameObject.FindGameObjectWithTag("Player");
heightMultiplier = 1.36f;
}
void Update()
{
timer += Time.deltaTime;
enemyRay = new Ray(transform.position, transform.forward * sightDist);
Debug.DrawRay(transform.position + Vector3.up * heightMultiplier, transform.forward* sightDist, rayColor);
Debug.DrawRay(transform.position + Vector3.up * heightMultiplier, (transform.forward + transform.right).normalized * sightDist, rayColor);
Debug.DrawRay(transform.position + Vector3.up * heightMultiplier, (transform.forward - transform.right).normalized * sightDist, rayColor);
if (Physics.Raycast(transform.position + Vector3.up * heightMultiplier, transform.forward, out rayHit, sightDist))
{
if (rayHit.collider.gameObject.tag == "Player")
{
agent.SetDestination(him.transform.position);
him = rayHit.collider.gameObject;
}
}
if (Physics.Raycast(transform.position + Vector3.up* heightMultiplier, (transform.forward + transform.right).normalized, out rayHit, sightDist))
{
if (rayHit.collider.gameObject.tag == "Player")
{
agent.SetDestination(him.transform.position);
him = rayHit.collider.gameObject;
}
}
if (Physics.Raycast(transform.position + Vector3.up* heightMultiplier, (transform.forward - transform.right).normalized, out rayHit, sightDist))
{
if (rayHit.collider.gameObject.tag == "Player")
{
agent.SetDestination(him.transform.position);
him = rayHit.collider.gameObject;
}
}
}
void OnTriggerEnter(Collider coll)
{
if (coll.tag == "Player")
{
agent.SetDestination(him.transform.position);
him = coll.gameObject;
}
}
}
解决方案
试过了,对我有用,它可以检测到与多个光线投射发生碰撞的玩家。但是很难将玩家定位到这个位置 ,因为它靠近射线原点。调试和工作
脚本中的本机变量
public Color rayColor;
RaycastHit rayHit;
public float sightDist;
public float heightMultiplier;
public float visionAngle;
public GameObject him;
我添加了这些变量:
private bool rayIsDrawn = false;
[SerializeField]
private int raycastCount = 10;
private float RightRay;
private float LeftRay;
`raycastCount' 定义了光线的总数。
无效开始()
enter code here
void Start()
{
him = GameObject.FindGameObjectWithTag("Player");
heightMultiplier = 1.36f;
}
无效更新()。这是绘制射线的代码。Ray0 直接向前绘制,而下一条光线根据 i 号左右绘制;我将光线方向的 y 轴设置visionAngle / 2 - visionAngle / (raycastCount-1) * RightRay
为右光线和-visionAngle / 2 + visionAngle / (raycastCount-1) * LeftRay
左光线。
void Update()
{
if (rayIsDrawn == false) {
for (int i = 0; i < raycastCount; i++) {
if (i == 0) {
Debug.DrawRay (transform.position + Vector3.up * heightMultiplier, transform.forward * sightDist, rayColor, Mathf.Infinity);
} else if (i % 2 != 0) {
Debug.DrawRay (transform.position + Vector3.up * heightMultiplier, Quaternion.Euler (0, visionAngle / 2 - visionAngle / (raycastCount-1) * RightRay, 0) * transform.forward * sightDist, rayColor, Mathf.Infinity);
RightRay++;
} else {
Debug.DrawRay (transform.position + Vector3.up * heightMultiplier, Quaternion.Euler (0, -visionAngle / 2 + visionAngle / (raycastCount-1) * LeftRay, 0) * transform.forward * sightDist, rayColor, Mathf.Infinity);
LeftRay++;
}
}
rayIsDrawn = true;
}
RightRay = 0;
LeftRay = 0;
这是与绘制的光线具有相同光线来源和方向的光线投射。
for (int i = 0; i < raycastCount; i++) {
if (i == 0) {
if (Physics.Raycast (transform.position + Vector3.up * heightMultiplier, transform.forward, out rayHit, sightDist)) {
if (rayHit.collider.tag == "Player") {
Debug.Log ("touched by ray "+(i+1));
}
}
} else if (i % 2 != 0) {
if (Physics.Raycast (transform.position + Vector3.up * heightMultiplier, Quaternion.Euler (0, visionAngle / 2 - visionAngle / (raycastCount-1) * RightRay, 0) * transform.forward, out rayHit, sightDist)) {
if (rayHit.collider.tag == "Player") {
Debug.Log ("touched by ray "+(i+1));
}
}
RightRay++;
} else {
if (Physics.Raycast (transform.position + Vector3.up * heightMultiplier, Quaternion.Euler (0, -visionAngle / 2 + visionAngle / (raycastCount-1) * LeftRay, 0) * transform.forward, out rayHit, sightDist)) {
if (rayHit.collider.tag == "Player") {
Debug.Log ("touched by ray "+(i+1));
}
}
LeftRay++;
}
}
RightRay = 0;
LeftRay = 0;
}