2016-11-21 14 views
0

私は自分のゲームに煙プレハブを実装しています。プレハブの異なる3つのインスタンスを異なる位置に作成し、トグルボタンに従って破棄します。問題は、インスタンスが破壊されていないと私は理由が分からない。 boolsが働いているプレハブインスタンスを破壊する

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 要素が壊れているかどうかをいつ確認しましたか? _ "実際のオブジェクトの破棄は、現在のUpdateループの後まで常に遅延されますが、レンダリングの前に常に行われます。" _ – TripleEEE

+0

ゲームが実行されると、トグルを変更するとプレハブが破棄されないことがわかります。 –

+0

私は遅延の理由を見ない、ループはすぐに終了する必要があります。 –

答えて

1

boolが動作し、if条件が満たされていますが、プレハブ は破壊されません。お手伝いできますか?

。プレハブを破壊するべきではありません。 Instantiateで作成したGameObjectのみを破壊する必要があります。

。GameObjectから統計情報を削除します。私はあなたがそれを必要としないと確信しています。

あなたは条件が満たされた場合、その後newinstance機能がわからないproblem.Ifであることを確認してください100%であれば、そのせいでなくて、Destroy(smokeinstancet, 0.1f);を呼び出すことが文句を言わないこの条件が満たされていることを確認するためにif (turbine == false && togglei == 2)Debug.Logを置きます。

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と呼ばれるパラメータでローカル変数にインスタンス化されたゲームオブジェクトを割り当てます。 newSmoke1newSmoke2newSmoke3のように渡されたGameObjectsには割り当てません。

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

SOLUTIONrefまたはoutキーワード.USE

あなたは2つのソリューションを持っています。この場合は、refというキーワードを使用します。

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

さらに、refを呼び出してください。

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

.Make 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のために同じことをしました。私はrefが今のところ理解している!本当にありがとう! –

+0

ようこそ。それはC#のトリッキーな部分の一つです。 – Programmer