level 8
如果场景中有一群敌人和一个主角,敌人的标签都是enemy,想让主角脚本获取离自己最近的一个enemy标签的敌人该怎么办。。我用GameObject.FindGameObjectWithTag("enemy")的话它会随机获取一个敌人,不是离自己最近的。。有些时候获取到的还是离自己特别远的。。。
2017年07月30日 09点07分
1
level 1
给你的猪脚加一个碰撞体组件,打开触发器,设置触发器范围为你的攻击范围,然后就能接收到进入你攻击范围的所有敌人
如果有角度判定的话,利用向量点积计算角度,就能算出这个敌人是不是在你攻击范围 ,或者视野范围
2017年07月31日 08点07分
5
level 5
一个你可以用脚本创建敌人,创建的时候保存一个List, 或者给敌人的prefab加一个tag,然后用GameObject.FindGameObjectsWithTag(string tag);会返回一个list。然后自己便利做对比
2017年07月31日 09点07分
6
level 3
}
public GameObject FindClosestEnemy(){
//查找标签为Enemy的全部游戏物体
GameObject closest=GameObject.FindWithTag("Enemy");
if(GameObject.FindGameObjectsWithTag("Enemy")!=null){
GameObject[] gos;
gos = GameObject.FindGameObjectsWithTag("Enemy");
var distance = Mathf.Infinity;
var position = transform.position;
foreach (GameObject go in gos) {
var diff=(go.transform.position-position); //计算player与Enemy的向量距离差
var curDistance = diff.sqrMagnitude; //将向量距离平方(防止有负数产生)
if (curDistance < distance) { //找出最近距离
closest = go; //更新最近距离敌人
distance = curDistance; //更新最近距离
}
2017年08月01日 10点08分
9
![[大拇指]](/static/emoticons/u5927u62c7u6307.png)
,另外说下距离的平方不是为了防止负数,而是对比向量斜边的平方值可以减少一次开方运算,节约性能~
2017年08月28日 16点08分
@靓白白 只是从左右的分割线对比的话,用Dot检测目标和自己的右手向量就可以了
2018年09月12日 12点09分
太麻烦了,消耗太高
2018年09月13日 01点09分
level 1
OverlapSphere方法获取球形范围内所有目标 吧所有的目标添加进list 然后foreach计算出所有目标距离玩家的距离 将距离分别添加进一个list和一个SortedDictionary中 其中SortedDictionary的键是距离 值是gameobject foreach外面在对距离列表list.sort排序 这样距离列表里的顺序就和排序字典里的顺序对应上了 获取list[0] 就是距离你最近的目标。
2017年08月14日 00点08分
10
应该是获取SortedDictionary里面键名为list[0]的目标 这个目标就是距离你最近的
2017年08月14日 00点08分
这个太浪费memory了,占太多gc。可以直接在那个list里面存你自己建的一个struct,然后sort里面加个icomparer就好了
2018年09月19日 11点09分
level 7
噗 楼上说的都麻烦了,10楼的思路是
正确的
,消耗也最少。Collider.OverLarpShpere这个方法获一个球形空间的所有碰撞体,只要更改球形范围的半径即可。
如果有100个敌人,挨个去判断距离,那也太麻烦了吧,消耗太高
2018年09月13日 01点09分
12
消耗最小?未必吧
2018年09月13日 04点09分
我补充说: 我说的是获取敌人的方法,不是判断远近的方法,用Collider.OverLarpShpere获取一定范围的敌人(如果找不到怪则修改半径再找),再判断距离。而不是直接判断所有怪与玩家距离。有数百个怪的话,我这个方法较好,怪物很少时,直接遍历全部怪物效率最高。
2018年09月13日 06点09分
@_JackCat_ 当然,我这个方法缺点也是有的,就是必须有碰撞体和刚体,做包围盒检测,这个消耗就有点高,但是怪物多的情况下我这个方法还是比较好的
2018年09月13日 06点09分
@-304℃ 碰撞检测不就是吧所有物体距离算了一遍吗,都一
![[黑线]](/static/emoticons/u9ed1u7ebf.png)
样。
2018年09月19日 07点09分
level 1
GameObject[] objs = GameObject.FindGameObjectsWithTag(你的标签);
GameObject o = null;
float dis = -1;
for (int i = 0; i < objs.Length; i++)
{
float f = Vector3.Distance(this.transform.position, objs[i].transform.position);
if (i == 0 || f < dis)
{
o = objs[i];
dis = Vector3.Distance(this.transform.position, o.transform.position);
}
}
return o;
//迟来七年的回复
2024年07月17日 13点07分
13