gpt4 book ai didi

c# - 在非 MonoBehaviour 类中使用协程

转载 作者:太空狗 更新时间:2023-10-29 22:21:33 25 4
gpt4 key购买 nike

如何在非 Monobehaviour 类的实例中传递 Monobehaviour?我找到了这个 link其中 TonyLi 提到您可以传递 Monobehaviour 以在类的实例中启动和停止协程,但他没有展示如何做到这一点。他这样做 theEvent.StartEvent(myMonoBehaviour);但他没有显示他从哪里得到 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
}
}

最佳答案

TonyLi mentions that you can pass a Monobehaviour to start and stop coroutines inside a instance of a class, but he does not show how you can do that. He does this

您可以使用 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!");
}
}

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

关于c# - 在非 MonoBehaviour 类中使用协程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40508327/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com