在非MonoBehaviour类中使用coroutine

时间:2016-11-09 13:36:45

标签: c# unity3d

如何在非Monobehaviour课堂的实例中传递Monobehaviour?我找到了这个link,其中TonyLi提到你可以通过一个Monobehaviour来启动和停止一个类的实例中的协同程序,但他没有说明你如何能做到这一点。他做了这个theEvent.StartEvent(myMonoBehaviour);但是他并没有表明他从哪里获得了我的神经行为。我在互联网上环顾四周,但我似乎无法找到它。

  • 修改

这是我想要做的。我想在一个类的实例中运行一个协同程序。我还希望能够在类的实例中停止协程。我想这样做,这样我的场景中就没有任何拥有大型管理器的对象,所以我可以将代码重用于我想以这种方式打乒乓的任何对象。代码将游戏对象向一个方向移动,然后休息并向另一个方向移动并再次休息等等。但我无法从课堂外启动协程。

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
    }
}

1 个答案:

答案 0 :(得分:9)

  

TonyLi提到你可以通过Monobehaviour开始和停止   在一个类的实例里面的coroutines,但他没有显示你是怎么做的   可以做到这一点。他这样做

您可以使用this关键字执行此操作。 this关键字将获取MonoBehaviour的当前实例。

在这个示例中,有一棵树,恰好有一个组件MonoScript

enter image description here

MonoScript的特定实例如果需要(因为它是一个c#程序)可以实例化一般的c#类NonMonoScript

MonoBehaviour传递的类:

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

接收传递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!");
    }
}

您还可以将mono函数中的monoParser引用存储在要重用的局部变量中。