我正试图让团结一样的炸弹人在同一时间学习c#。
我尝试在代码中更改targetDestroyed1 var的bool值,但似乎存在问题..
问题: 在创建对象时,在GetNearestTaggedObject1中,targetDestroyed1变为true。但是在InstantiateFire()的if(!targetDestroyed1)条件下,targetDestroyed1始终保持为false并且实例化为continue而不是stop
这是我的代码:
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;
}
}
感谢您的帮助!
答案 0 :(得分:1)
查看您的InstantiateFire
方法:
public void InstantiateFire (){
FireRate = player_actions.FireRate;
FireRate -= 1;
targetDestroyed1 = false;
...
您在第三行明确设置 targetDestroyed1
到false
。因此在循环的第一次迭代中它总是错误的。这意味着您可以调用Instantiate
和ScanForTarget1
,具体取决于i1_axeZ
和其他变量的值。
如果变量 设置在GetNearestTaggedObject1
内,那么true
中的循环的下一次迭代它确实会保持设置为InstantiateFire
- 但是你' d需要再次进入if
块才会产生任何影响。您应该尝试在调试器中单步执行或添加更多日志记录以查看正在发生的情况。从根本上说,你的代码目前很混乱,我很害怕。
除了其他任何内容之外,我强烈建议您创建一个适当的类,它封装目标以及它是否被销毁...然后创建该类型的列表:
private readonly List<Target> targets = new List<Target>();
这样你就不必拥有八个独立的变量,不同的代码操纵每个变量。