直接上代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Target : MonoBehaviour {
public Transform source;
public GameObject destination = null;
public static Target Instance;
void Awake() {
if (Instance == null)
Instance = this;
else if (Instance != this)
Destroy(gameObject);
}
GameObject[] enemy;
Vector3 minDestance;
float minDes = float.MaxValue;
void Update() {
enemy = GameObject.FindGameObjectsWithTag("Enemy"); // 寻找敌人
foreach (var item in enemy) {
Vector3 targetDir = source.position - item.transform.position; // 目标坐标与当前坐标差的向量
float angle = Vector3.Angle(-source.forward, targetDir); // 返回当前坐标与目标坐标的角度
//前方夹角10度
if (angle > 10) {
minDestance = new Vector3(0, 0, 0);
continue;
}
float DesX = source.position.x - item.transform.position.x;
float DesY = source.position.y - item.transform.position.y;
float DesZ = source.position.z - item.transform.position.z;
//设置最大距离
if (DesZ > 500) {
minDestance = new Vector3(0, 0, 0);
continue;
}
Vector3 temp = new Vector3(DesX, DesY, DesZ);
float min = (source.position - temp).sqrMagnitude;
//寻找最近目标
if (min < minDes) {
minDes = min;
minDestance = temp;
destination = item;
}
}
float ratio = (source.position.z - transform.position.z) / minDestance.z;
if (minDestance != Vector3.zero) {
Vector3 newPos = new Vector3(source.position.x - minDestance.x * ratio, source.position.y - minDestance.y * ratio, transform.position.z);
transform.position = Vector3.MoveTowards(transform.position, newPos, 0.5f);
if (destination == null) {
minDestance = new Vector3(0, 0, 0);
}
}
else {
minDes = float.MaxValue;
destination = null;
}
}
}
主要的逻辑是运用相似三角形原理,通过角度计算三维坐标。