2016-06-18 14 views
0

オブジェクトが破壊されたときに別のスクリプトメソッド(星)を呼び出したい、以下は私が行ったコードです。私が間違っていた提案はありますか?ここに私のコードです。別のスクリプトからの呼び出しメソッドC#Unity3d

using UnityEngine; 
using System.Collections; 
public class clear : MonoBehaviour { 
// Use this for initialization 
void Start() { 
    GetComponent<ParticleSystem>().emissionRate = 0; 
} 
// Update is called once per frame 
void Update() { 
    if (Input.GetMouseButtonDown (1)) { 
     GetComponent<ParticleSystem>().Emit (10); 
    } 
} 
void OnParticleCollision(GameObject obj) 
{ 
    if (obj.gameObject.tag == "fire1") { 
     Destroy (obj, 5.0f); 
     TimingForIndust2 tim = GetComponent<TimingForIndust2>(); 
     tim.stars(); 
    } 
     StartCoroutine (TestCoroutine()); 
    } 
IEnumerator TestCoroutine(){ 
    yield return new WaitForSeconds(8); 
    Application.LoadLevel (25); 
} 
} 

ここにあなたのコメントを読むことでTimingForIndust2

using UnityEngine; 
using System.Collections; 
using UnityEngine.UI; 
using MadLevelManager; 
public class TimingForIndust2 : MonoBehaviour { 
public Transform TimingBar; 
public Transform TextIndicator; 
public Transform TextRemaining; 
[SerializeField] private float currentAmount; 
[SerializeField] private float speed; 

// method to reduce the time continously 
void Update() { 

    if (currentAmount > 0) { 
     currentAmount -= speed*Time.deltaTime; 
     TextIndicator.GetComponent<Text>().text=((int)currentAmount).ToString()+"s"; 
     TextRemaining.gameObject.SetActive(true); 

    } else { 
     TextRemaining.gameObject.SetActive(false); 
     TextIndicator.GetComponent<Text>().text="TimeUP"; 
     Application.LoadLevel (62); 

    } 
    TimingBar.GetComponent<Image>().fillAmount = currentAmount/60; 
} 
public void stars() 
{ 
    if (currentAmount > 45.0f) { 

     MadLevelProfile.SetLevelBoolean (MadLevel.currentLevelName, "star_1", true); 
     MadLevelProfile.SetLevelBoolean (MadLevel.currentLevelName, "star_2", true); 
     MadLevelProfile.SetCompleted (MadLevel.currentLevelName, true); 
    } else if (currentAmount > 20.0f && currentAmount < 29.0f) { 

     MadLevelProfile.SetLevelBoolean (MadLevel.currentLevelName, "star_1", true); 
     MadLevelProfile.SetLevelBoolean (MadLevel.currentLevelName, "star_2", true); 
     MadLevelProfile.SetCompleted (MadLevel.currentLevelName, true); 

    } else if (currentAmount > 2.0f && currentAmount < 19.0f) { 

     MadLevelProfile.SetLevelBoolean (MadLevel.currentLevelName, "star_1", true); 
    } 
} 
} 
+0

「TimingForIndust2」スクリプトは、同じゲームオブジェクトに添付されていますか?(上記のスクリプトは「クリア」)が添付されていますか?または、 'timingForIndust2'が' fire1'タグでgameobjectにアタッチされていて、衝突を検出しますか? – Programmer

+0

クリアスクリプトにはMy(消火器プリフェッブ)が付属しており、TimingForIndust2スクリプトはTimerに添付されています(タイマーは実際に時間が走っているキャンバスです)。 クリアスクリプトとTimingForIndust2スクリプトが別のオブジェクトに添付されています。 @Programmer –

答えて

1

私の第二のスクリプトで、あなたはGameObject.FindTimerはそれからコンポーネントを取得見つける必要があります。衝突が発生するたびにこれを行うことはできません。それを一度Start()関数でキャッシュしてから再利用する必要があります。

私もParticleSystemを新しいコードでキャッシュしました。また、タグを直接obj.gameObject.tag == "fire1"と比較する代わりに、CompareTag関数を使用してタグを比較してください。

これで問題は解決します。ここでTextコンポーネントを、TimingForIndust2スクリプトからupdat関数で呼び出すTextIndicatorスクリプトに添付されたものにキャッシュすることはあなたの仕事です。

using UnityEngine; 
using System.Collections; 
public class clear : MonoBehaviour { 
TimingForIndust2 timingForIndust2; 

ParticleSystem particles; 

// Use this for initialization 
void Start() { 
    particles = GetComponent<ParticleSystem>(); 
    particles.emissionRate = 0; 

    GameObject tempObj = GameObject.Find("Timer"); 
    timingForIndust2 = tempObj.GetComponent<TimingForIndust2>(); 
} 
// Update is called once per frame 
void Update() { 
    if (Input.GetMouseButtonDown (1)) { 
     particles.Emit (10); 
    } 
} 
void OnParticleCollision(GameObject obj) 
{ 
    if (obj.CompareTag("fire1")) { 
     Destroy (obj, 5.0f); 
     timingForIndust2.stars(); 
    } 
     StartCoroutine (TestCoroutine()); 
    } 
IEnumerator TestCoroutine(){ 
    yield return new WaitForSeconds(8); 
    Application.LoadLevel (25); 
} 
} 
+0

回答ありがとうございますが、今は私の答えを置くことでこのエラーが発生しています ArgumentException:GetLocalizedStringはメインスレッドからのみ呼び出すことができます。 コンストラクタとフィールドイニシャライザは、シーンをロードするときに読み込みスレッドから実行されます。 コンストラクタまたはフィールドイニシャライザでこの関数を使用しないで、代わりに初期化コードをAwake関数またはStart関数に移動します。 TreeEditor.TreeGroupLeaf..cctor() TypeInitializationExceptionとしてRethrow:TreeEditor.TreeGroupLeafの型初期化子によって例外がスローされました –

+0

@FarhanAli私が提供した答えは、別のスクリプトの別の関数を呼び出すために探しているものを行う必要があります。あなたの 'null'問題も解決するはずです。この質問に答えました。新しいエラーはまったく違うものです。この質問を閉じて、新しい質問を投稿することができます。また、問題が発生するコード行を指定して、すべてのスクリプトを投稿してください。そのスクリプトがなければ、そのエラーをほぼ不可能にすることができます。あなたが望むなら、ここに新しい質問をリンクすることができます。 – Programmer

+0

正確に、ありがとうございました、私は考えました:-) –

関連する問題