2016-11-09 6 views
5

Monobhaviourを非Monobhaviourクラスのインスタンス内でどのように渡すことができますか?私はこれを見つけましたlink TonyLiはクラスのインスタンスの中でコルーチンを開始したり停止したりするためにMonobehaviourを渡すことができると述べていますが、あなたはそれをどうやって行うことができないのかを示しています。彼はこれを行うtheEvent.StartEvent(myMonoBehaviour);彼はどこから彼が私のMonobehaviourを取得するかを示していません。私はインターネット上を見回しましたが、どうやって見つけることができません。ここでMonoBehaviourクラス以外のクラス内のコルーチンを使用

  • 編集

は私がしようとしているものです。クラスのインスタンス内でコルーチンを実行したい私はクラスのインスタンスの中でコルーチンを止めることもできるようにしたい。私はこのようにして、大規模な管理者を持つオブジェクトを私のシーンに持たないようにします。そして、私がこのようにピンポンしたいオブジェクトのコードを再利用できるようにします。コードはゲームオブジェクトをある方向に動かし、その後ブレークして別の方向に動かし、ブレークします。しかし、クラス外からコルーチンを開始することはできません。

using UnityEngine; 
using System.Collections; 
using UnityEngine.UI; 

[RequireComponent (typeof(Image))] 
public class SpecialBar : MonoBehaviour { 

    public float rangeX; 
    public float breakTime; 
    public float step; 
    float startProgress = 0.5f; 
    PingPongGameObject pingPonger; 

    Color[] teamColors = new Color[]{new Color(255,136,0),new Color(0,170,255)}; 

    void Start() 
    { 

     for(int i = 0; i < teamColors.Length; ++i) 
     { 
      teamColors[i] = StaticFunctions.NormalizeColor (teamColors[i]); 
     } 

     pingPonger = new PingPongGameObject (gameObject.transform.position, 
      new Vector3(rangeX,0.0f,0.0f), 
      gameObject, 
      startProgress, 
      breakTime, 
      step 
      ); 
    } 
} 

私のコルーチンをしているところ第二のクラスがある。

public class PingPongGameObject 
{ 
    float step; 
    Vector3 center; 
    Vector3 range; 
    GameObject ball; 
    float progress; 
    float breakTime; 
    Vector3 endPos; 
    Vector3 oppositePosition; 


    public PingPongGameObject(Vector3 _center, Vector3 _range, GameObject _ball, float _startProgress, float _breakTime, float _step) 
    { 
     center = _center; 
     range = _range; 
     ball = _ball; 
     progress = _startProgress; 
     breakTime = _breakTime; 
     step = _step; 
     endPos = center - range; 
     oppositePosition = center + range; 
     // This is where I want to start the coroutine 
    } 

    public IEnumerator PingPong() 
    { 


     while (progress < 1) { 
      progress += Time.deltaTime * step; 
      Vector3 newPos = Vector3.Lerp (oppositePosition, endPos, progress); 
      ball.transform.position = newPos; 
      yield return null; 
     } 
     Vector3 temp = endPos; 
     endPos = oppositePosition; 
     oppositePosition = temp; 
     progress = 0; 
     yield return new WaitForSeconds (breakTime); 
     yield return null; 
    } 

    public float Step 
    { 
     set{step = value;} 
    } 

    public void StopCoroutine() 
    { 
     // This is where I want to stop the coroutine 
    } 
} 
+0

はい、私はちょうど私の質問にexplenationを入れます。 –

+0

私はその質問を書き直しました。 –

+0

私が残した答えを確認してください。 'this'キーワードを使うことができます。 – Programmer

答えて

7

TonyLiあなたはクラスのインスタンス内部 コルーチンを開始および停止するMonobehaviourを渡すことができることに言及、しかし、彼はどのようにあなたは それを行うことができます表示されません。彼はこれを行う

thisキーワードでこれを行うことができます。このキーワードは現在のインスタンスMonoBehaviourを取得します。

この例ではコンポーネントMonoScript有するたまたま木、あります:(それは交流#プログラムのため)、それはたい場合MonoScriptの特定のインスタンスができること

enter image description here

は、一般的なC#のクラスをインスタンス化し、 NonMonoScript

public class MonoScript : MonoBehaviour 
{ 
    void Start() 
    { 
     NonMonoScript nonMonoScript = new NonMonoScript(); 
     //Pass MonoBehaviour to non MonoBehaviour class 
     nonMonoScript.monoParser(this); 
    } 
} 

クラスからMonoBehaviourを渡しますMonoBehaviourインスタンスを渡す受信

クラス:

public class NonMonoScript 
{ 
    public void monoParser(MonoBehaviour mono) 
    { 
     //We can now use StartCoroutine from MonoBehaviour in a non MonoBehaviour script 
     mono.StartCoroutine(testFunction()); 

     //And also use StopCoroutine function 
     mono.StopCoroutine(testFunction()); 
    } 

    IEnumerator testFunction() 
    { 
     yield return new WaitForSeconds(3f); 
     Debug.Log("Test!"); 
    } 
} 

また、再利用されるローカル変数にmonoParser関数からmono参照を格納することができます。

+0

Dude - マイクの説明を読んでください: ""このようにしてpingpongしたいオブジェクトです。コードはGameObjectを一方向に動かし、休憩して別の方向に移動させます。 "*彼はすべてがピンポンのコンポーネントであることを知っています!!!!!!!! !!! – Fattie

+1

ありがとう!プログラマーはこれがまさに私が探していたものでした。 Joe Blow私は、これがあなたとあなたの探求に目を向ける問題に対処する最もスマートな方法ではないかもしれないことを認識しています。これは私が探していた大型機であったので、これを取っ手のために取る。 –

+0

@MikeOttinkようこそ。私はかつて 'StartCoroutine'と' StopCoroutine'関数を使用できないというこの問題に遭遇しました。これが私が解決した方法です。場合によっては、MonoBehaviourからスクリプトを派生させる必要はありません。あなたがする他の回。あなたの状況によって異なりますが、この答えはあなたが尋ねたような 'MonoBehaviour'を別のスクリプトに渡す方法を示すことだけです。ジョーの答えもうまくいくはずです。ハッピーコーディング! – Programmer

関連する問題