敌人的视野仅适用于 1 个敌人
Field of View for enemy only works with 1 enemy
我对 "Field Of View" 敌人的脚本有一些问题。在观看了为玩家创建视野的教程后,我想我可以将其切换到敌人的视野,以便他们检测到玩家并做一些其他事情。我创建了一个布尔变量 playerInRange
来检测敌人是否可以检测到玩家并将此变量设置为 true 或 false。
只对付一个敌人效果很好。当我添加另一个时,新敌人将不会检测到玩家。所以可能和协程有关,但我不确定。
这是我的一小部分代码:
void Start() {
StartCoroutine("FindTargetsWithDelay", .2 f);
}
IEnumerator FindTargetsWithDelay(float delay) {
while (true) {
yield
return new WaitForSeconds(delay);
FindVisibleTargets();
}
}
public void FindVisibleTargets() {
visibleTargets.Clear();
Collider[] targetsInViewRadius = Physics.OverlapSphere(transform.position, viewRadius, targetMask);
for (int i = 0; i < targetsInViewRadius.Length; i++) {
Transform target = targetsInViewRadius[i].transform;
Vector3 dirToTarget = (target.position - transform.position).normalized;
if (Vector3.Angle(transform.forward, dirToTarget) < viewAngle / 2) {
float dstToTarget = Vector3.Distance(transform.position, target.position);
if (!Physics.Raycast(transform.position, dirToTarget, dstToTarget, obstacleMask)) {
// Not so nice solution!
// The movement should be in a separate script!
visibleTargets.Add(target);
nav.SetDestination(player.position);
anim.SetBool("IsRunning", true);
if (dstToTarget < attackRange) {
playerInRange = true;
Debug.Log(playerInRange);
}
}
} else {
anim.SetBool("IsRunning", false);
playerInRange = false;
Debug.Log(playerInRange);
}
}
}
谢谢大家的小提示。这确实是一个层次结构问题 :( 很抱歉 newbie/DAU 这个问题。
干杯
妮可
我对 "Field Of View" 敌人的脚本有一些问题。在观看了为玩家创建视野的教程后,我想我可以将其切换到敌人的视野,以便他们检测到玩家并做一些其他事情。我创建了一个布尔变量 playerInRange
来检测敌人是否可以检测到玩家并将此变量设置为 true 或 false。
只对付一个敌人效果很好。当我添加另一个时,新敌人将不会检测到玩家。所以可能和协程有关,但我不确定。
这是我的一小部分代码:
void Start() {
StartCoroutine("FindTargetsWithDelay", .2 f);
}
IEnumerator FindTargetsWithDelay(float delay) {
while (true) {
yield
return new WaitForSeconds(delay);
FindVisibleTargets();
}
}
public void FindVisibleTargets() {
visibleTargets.Clear();
Collider[] targetsInViewRadius = Physics.OverlapSphere(transform.position, viewRadius, targetMask);
for (int i = 0; i < targetsInViewRadius.Length; i++) {
Transform target = targetsInViewRadius[i].transform;
Vector3 dirToTarget = (target.position - transform.position).normalized;
if (Vector3.Angle(transform.forward, dirToTarget) < viewAngle / 2) {
float dstToTarget = Vector3.Distance(transform.position, target.position);
if (!Physics.Raycast(transform.position, dirToTarget, dstToTarget, obstacleMask)) {
// Not so nice solution!
// The movement should be in a separate script!
visibleTargets.Add(target);
nav.SetDestination(player.position);
anim.SetBool("IsRunning", true);
if (dstToTarget < attackRange) {
playerInRange = true;
Debug.Log(playerInRange);
}
}
} else {
anim.SetBool("IsRunning", false);
playerInRange = false;
Debug.Log(playerInRange);
}
}
}
谢谢大家的小提示。这确实是一个层次结构问题 :( 很抱歉 newbie/DAU 这个问题。 干杯 妮可