- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
如何在非 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
:
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/
在我的设置中,我试图有一个界面 Table继承自 Map (因为它主要用作 map 的包装器)。两个类继承自 Table - 本地和全局。全局的将有一个可变的映射,而本地的将有一个只有本地条目的映射。
Rust Nomicon 有 an entire section on variance除了关于 Box 的这一小节,我或多或少地理解了这一点和 Vec在 T 上(共同)变体. Box and Vec
我是一名优秀的程序员,十分优秀!