2016-11-21 85 views
0

我在我的游戏中实施了烟雾预制。这个想法是创建预制件的3个不同的实例(在不同的位置),然后根据切换按钮销毁它们。这个问题没有被破坏,我不知道为什么。销毁预制实例

这是我的脚本:

class Smoke1 : MonoBehaviour 
    { 
    public GameObject myPrefab; 
    public GameObject canvasObject; 

    public static GameObject newSmoke1; 
    public static GameObject newSmoke2; 
    public static GameObject newSmoke3; 

    public int toggle1; 
    public int toggle2; 
    public int toggle3; 

    public Vector3 smokeposition1 = new Vector3 (397, -394, 90); 
    public Vector3 smokeposition2 = new Vector3(414, -402, 90); 
    public Vector3 smokeposition3 = new Vector3(432, -410, 90); 

    string newSmoke; 


    void Start() 
     { 
     i = 1; 
     toggle1 = 2; 
     toggle2 = 2; 
     toggle3 = 2; 
     newinstance(smokeposition1, newSmoke1); 
     newinstance(smokeposition2, newSmoke2); 
     newinstance(smokeposition3, newSmoke3); 
     } 

    void Update() 
     { 

     togglecheck(ThermoElectric.t1Bool, toggle1, newSmoke1, smokeposition1); 
     togglecheck(ThermoElectric.t2Bool, toggle2, newSmoke2, smokeposition2); 
     togglecheck(ThermoElectric.t3Bool, toggle3, newSmoke3, smokeposition3); 
     } 

    void newinstance(Vector3 smokeposition, GameObject smokeinstance) 
     { 
     smokeinstance = Instantiate(myPrefab, smokeposition, Quaternion.Euler(-90, 0, 0)) as GameObject; 
     smokeinstance.transform.SetParent(canvasObject.transform, false); 
     smokeinstance.transform.localScale = new Vector3(1, 1, 1); 

     smokeinstance.GetComponent<ParticleSystem>().startColor = new Color(0.1f, 0.1f, 0.1f, 1); 

     } 

    void togglecheck(bool turbine, int togglei, GameObject smokeinstancet, Vector3 smokeposition) 
     { 

     if (turbine == true && togglei == 1) 
      { 
      newinstance(smokeposition, smokeinstancet); 
      togglei = 2; 
      } 

     if (turbine == false && togglei == 2) 
      { 
      Destroy(smokeinstancet, 0.1f); 
      togglei = 1; 
      } 
     } 
} 

的布尔变量正在和如果条件得到满足,但destroyed..Can你帮组合屋没有得到?

+0

https://docs.unity3d.com/ScriptReference/Object.Destroy。html 你什么时候检查过你的元素是否已经被删除? _“实际的物体破坏总是延迟到当前更新循环之后,但总是在渲染之前完成。”_ – TripleEEE

+0

当游戏运行时,我看到当我更改切换时,预制件不会被破坏。 –

+0

我看不出延迟的原因,循环应该马上完成。 –

回答

1

布尔正在工作,如果条件符合,但预制件 不会被破坏..你能帮忙吗?

。你不应该破坏预制件。您应该只销毁使用Instantiate创建的GameObject。

。从GameObject中删除静态图。我相信你不需要那个。

如果你是100%肯定肯定的,如果条件得到满足,则newinstance功能的问题。如果你不知道,把里面Debug.Logif (turbine == false && togglei == 2)验证此条件没有因为见面,Destroy(smokeinstancet, 0.1f);不会被称为。

问题与newinstance函数。

void newinstance(Vector3 smokeposition, GameObject smokeinstance) 
{ 
    smokeinstance = Instantiate(myPrefab, smokeposition, Quaternion.Euler(-90, 0, 0)) as GameObject; 
    smokeinstance.transform.SetParent(canvasObject.transform, false); 
    smokeinstance.transform.localScale = new Vector3(1, 1, 1); 

    smokeinstance.GetComponent<ParticleSystem>().startColor = new Color(0.1f, 0.1f, 0.1f, 1); 
} 

smokeinstance = Instantiate(myPrefab, smokeposition, Quaternion.Euler(-90, 0, 0)) as GameObject;代码将实例化游戏对象分配给名为smokeinstance参数中的局部变量。它不会将它分配给传入它的GameObjects,例如newSmoke1,newSmoke2newSmoke3

newinstance(smokeposition1, newSmoke1); 
newinstance(smokeposition2, newSmoke2); 
newinstance(smokeposition3, newSmoke3); 

SOLUTION

你有2个解决方案

。使用的refout关键字。在这种情况下,我们只会使用ref关键字。

void newinstance(Vector3 smokeposition, ref GameObject smokeinstance) 
{ 
...... 
} 

然后在调用它时也使用ref

newinstance(smokeposition1, ref newSmoke1); 
newinstance(smokeposition2, ref newSmoke2); 
newinstance(smokeposition3, ref newSmoke3); 

。使newinstance函数返回GameObject代替void

GameObject newinstance(Vector3 smokeposition) 
{ 
    GameObject smokeinstance = Instantiate(myPrefab, smokeposition, Quaternion.Euler(-90, 0, 0)); 
} 

然后调用它:

newSmoke1 = newinstance(smokeposition1); 
newSmoke2 = newinstance(smokeposition2); 
newSmoke3 = newinstance(smokeposition3); 

的这个任何一个应该解决您的问题。

+0

你是男人!当场就好了。我使用了解决方案1,并为toggle1,toggle2和toggle 3做了同样的工作,它工作正常!我明白什么是裁判!非常感谢! –

+0

不客气。这只是C#中棘手的部分之一。 – Programmer