只攻击目标敌人团结

本文关键字:敌人 目标 攻击 | 更新日期: 2023-09-27 18:34:12

我有一个脚本用于控制目标敌人,另一个用于控制玩家攻击,目标脚本似乎可以正常工作,直到第一个目标被杀死,所以当我单击 Tab 时,它按距离顺序瞄准我的敌人,但是当我的第一个目标死亡时,它无法瞄准另一个目标,我收到消息:

缺少引用异常:类型为"转换"的对象已被 已销毁,但您仍在尝试访问它。您的脚本应该 检查它是否为 null,或者不应销毁该对象。

此外,除了第一个玩家之外,我无法攻击任何东西,无论它是否是目标。我尝试切换我的玩家攻击,以便它像我的定位脚本一样与列表一起工作,但是我得到了所有相同的错误。

我的目标脚本是:

public class Targetting : MonoBehaviour {
public List<Transform> targets;
public Transform selectedTarget;
public string targetTag = "Enemy";
private Transform myTransform;
//Use this for initialization
void Start () {
    targets = new List<Transform>();
    selectedTarget = null;
    myTransform = transform;        
    AddAllEnemies();
}
public void AddAllEnemies() {
    GameObject[] go = GameObject.FindGameObjectsWithTag(targetTag);     
    foreach(GameObject enemy in go) {
        AddTarget(enemy.transform);
    }
}
public void AddTarget(Transform enemy) {
    targets.Add(enemy);
}
private void SortTargetsByDistance() {
    targets.Sort(delegate(Transform t1, Transform t2) { 
        return (Vector3.Distance(t1.position, myTransform.position).CompareTo)
            (Vector3.Distance(t2.position, myTransform.position));
    });
}
private void TargetEnemy() {
    if(selectedTarget == null) {
        SortTargetsByDistance();
        selectedTarget = targets[0];
    } else {
        int index = targets.IndexOf(selectedTarget);    
        if (index < targets.Count -1) {
            index++;
        } else {
            index = 0;    
        }
        selectedTarget = targets[index];
    }
}
//Update is called once per frame
void Update () 
{
    if(Input.GetKeyDown(KeyCode.Tab))
    {
        TargetEnemy();
    }
}
}

我的PlayerAttack脚本目前是:

public class PlayerAttack : MonoBehaviour {
public enemyHealth eHealth;
public GameObject enemy;
private float MHCD; // MeleeHit CD
private float hitChance;
// Use this for initialization
void Start () {
}
void Update () {
    hitChance = Random.Range (1, 100); 
    if (Input.GetKeyDown (KeyCode.Alpha1) && Time.time - MHCD > 1) { 
        if (hitChance > 0 && hitChance < 90) {
            Attack1 (); 
            MHCD = Time.time; 
        }
    }
}  
void Attack1() {
    float distance = Vector3.Distance (enemy.transform.position, transform.position);
    if (distance < 4) { 
        eHealth.SendMessage ("MeleeHit");
    } else {
        Debug.LogWarning ("You are too far away!"); 
    }
}
}

基本上,我想做的是使两个脚本相互配合,因此当敌人成为目标时,它只会扣除目标敌人的伤害,当敌人被杀死时,它就会从"目标"列表中删除。

只攻击目标敌人团结

我完全同意 Joe 的诊断,即这里的关键问题是您在调用Destroy()任何成员的关联对象后没有更新List<Transform> targets。不过,我将为该问题提出一个略有不同的解决方案。

当您尝试使用以下方法按目标与玩家的距离对目标进行排序时:

private void SortTargetsByDistance() {
    targets.Sort(delegate(Transform t1, Transform t2) { 
        return (Vector3.Distance(t1.position, myTransform.position).CompareTo)
            (Vector3.Distance(t2.position, myTransform.position));
    });
}

您正在尝试访问每个潜在目标上的Transform进行比较,但没有考虑目标可能已被破坏(使其Transform不存在(的可能性。一个简单的解决方法是在尝试对Transform对象进行排序之前删除对targets对象的所有空引用,方法是将其调整为以下内容:

private void SortTargetsByDistance() {
    targets.RemoveAll(target => target == null);
    targets.Sort(delegate(Transform t1, Transform t2) { 
        return (Vector3.Distance(t1.position, myTransform.position).CompareTo)
            (Vector3.Distance(t2.position, myTransform.position));
    });
}

希望这有帮助!如果您有任何问题,请告诉我。

(虽然这是对代码最小的更改,但我仍然支持让一个跟踪敌人的经理的想法,就像 Joe 建议的那样。从长远来看,如果您的项目不断增长,这将为您省去一些麻烦。