0

我正在尝试制作一个像轰炸机一样的游戏,同时学习 c#。

我尝试在我的代码中更改 targetDestroyed1 var 的布尔值,但似乎有问题..

问题:在GetNearestTaggedObject1 中,当一个对象被创建时,targetDestroyed1 变为真。但是在 InstantiateFire() 的 if (!targetDestroyed1) 条件下,targetDestroyed1 始终保持为 false 并且实例化继续而不是停止

这是我的代码:

private bool targetDestroyed1;

  void  Start (){
OriginXplosion = new Vector3(transform.position.x, transform.position.y, transform.position.z); 
InstantiateFire();
}

void  Update (){ 
if (target1 != null) {
        Destroy (target1);
    }

public void  InstantiateFire (){
    FireRate = player_actions.FireRate;
    FireRate -= 1;
    targetDestroyed1 = false;

    for(int i1= 0; i1 <= FireRate; i1++){
            float i1_axeZ= transform.position.z + i1;
        if(i1_axeZ <= 7)
        {
            if (!targetDestroyed1)
            {
                Instantiate (ParticulesFeu, Axe1[i1].transform.position, ParticulesFeu.transform.rotation);
                ScanForTarget1();
            }
        }
}
Destroy (gameObject);
}

void  ScanForTarget1 (){
    target1 = GetNearestTaggedObject1();
}


GameObject GetNearestTaggedObject1 (){

    float nearestDistanceSqr= 0.2f;
    GameObject[] taggedGameObjects= GameObject.FindGameObjectsWithTag(searchTag); 

    foreach(GameObject obj in taggedGameObjects) {

        Vector3 objectPos= obj.transform.position;
        float distanceSqr= (objectPos - transform.position).sqrMagnitude;

        if (distanceSqr < nearestDistanceSqr) {
            target1 = obj;
            targetDestroyed1 = true;
            nearestDistanceSqr = distanceSqr;
        }
    }

    return target1;
}

}

谢谢您的帮助 !

4

1 回答 1

1

看你的InstantiateFire方法:

public void  InstantiateFire (){
    FireRate = player_actions.FireRate;
    FireRate -= 1;
    targetDestroyed1 = false;

    ...

您在第三行明确设置 targetDestroyed1为。false所以在循环的第一次迭代中它总是错误的。这意味着您可以调用Instantiateand ScanForTarget1,具体取决于i1_axeZ和 其他变量的值。

如果变量设置在 内GetNearestTaggedObject1,它确实会true在循环的下一次迭代中保持设置为InstantiateFire- 但您需要if再次进入该块才能产生任何效果。您应该尝试在调试器中单步执行或添加更多日志记录以查看发生了什么。从根本上说,恐怕您的代码目前非常混乱。

除此之外,我强烈建议您创建一个适当的类,它封装了目标以及它是否被销毁......然后创建该类型的列表:

private readonly List<Target> targets = new List<Target>();

这样你就不必有八个单独的变量,用不同的代码来操作每个变量。

于 2013-05-26T13:36:21.560 回答