0

I'm trying to make a bomberman like game in unity and learning c# in the same time.

I try to change the bool value of targetDestroyed1 var in my code but it seems that there is a problem..

The issue: in the GetNearestTaggedObject1 when a object is founded, the targetDestroyed1 becomes true. but in the if (!targetDestroyed1) condition of InstantiateFire(), targetDestroyed1 always stay false and the instantiate continue instead of stop

Here is my code:

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;
}

}

Thank you for your help !

4

1 に答える 1

1

あなたのInstantiateFire方法を見てください:

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

    ...

3行目に明示的に設定 targetDestroyed1しています。falseしたがって、ループの最初の反復では常に false になります。つまり、 およびの値に応じて、およびを呼び出すことができます。InstantiateScanForTarget1i1_axeZ

変数内で設定されている場合、ループの次の繰り返しでも にGetNearestTaggedObject1設定されたままになりますが、効果がある前にもう一度ブロックに入る必要があります。何が起こっているかを確認するには、デバッガーでステップスルーするか、ログを追加してください。基本的に、あなたのコードは現時点ではかなり混乱しています。trueInstantiateFireif

他のことは別として、ターゲットとそれが破棄されているかどうかの両方をカプセル化する適切なクラスを作成することを強くお勧めします...次に、そのタイプのリストを作成します。

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

そうすれば、8 つの個別の変数を用意する必要がなくなり、各変数を異なるコードで操作する必要がなくなります。

于 2013-05-26T13:36:21.560 に答える