在非 MonoBehaviour 类中使用协程

2024-01-27

如何在非 Monobehaviour 类的实例中传递 Monobehaviour?我找到了这个link https://forum.unity3d.com/threads/running-startcoroutine-from-a-non-monobehaviour.233817/TonyLi 提到您可以传递 Monobehaviour 来启动和停止类实例内的协程,但他没有展示如何做到这一点。他这样做了 theEvent.StartEvent(myMonoBehaviour);但他没有表明他从哪里得到我的单一行为。我在互联网上环顾四周,但似乎找不到方法。

  • Edit

这就是我正在尝试做的事情。我想在类的实例内运行协程。我还希望能够停止类实例内的协程。我想这样做,这样我的场景中就没有任何具有大型管理器的对象,并且这样我就可以重用我想要以这种方式进行乒乓球的任何对象的代码。代码将游戏对象向一个方向移动,然后休息一下,然后向另一个方向移动,然后再次休息,等等。但我无法从类外部启动协程。

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 提到你可以通过 Monobehaviour 来启动和停止 类实例中的协程,但他没有展示如何 可以做到这一点。他这样做

你可以用this关键词。 this 关键字将获取当前实例MonoBehaviour.

在这个例子中有一棵树,它恰好有一个组件MonoScript:

那个特定的例子MonoScript如果需要的话可以(因为它是一个 C# 程序)实例化一个通用的 C# 类,NonMonoScript:

需通过的班级MonoBehaviour from:

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

收到pass的班级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函数放在局部变量中以供重用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在非 MonoBehaviour 类中使用协程 的相关文章

  • C++ Singleton 类 getInstance (作为 java)[重复]

    这个问题在这里已经有答案了 可能的重复 谁能给我提供一份 C 中的 Singleton 示例吗 https stackoverflow com questions 270947 can any one provide me a sample
  • HttpResponseMessage 的内容为 JSON

    我有一个 ASP NET MVC WEB API 由于多种原因 由于没有授权而重定向 我不能只使用一个简单的对象并在我的控制器方法中返回它 因此我需要 HttpResponseMessage 类来允许我重定向 目前我正在这样做 var re
  • 如何在C编程中获取当前时间(以毫秒为单位)[重复]

    这个问题在这里已经有答案了 可能的重复 如何使用 ANSI C 测量以毫秒为单位的时间 https stackoverflow com questions 361363 how to measure time in milliseconds
  • C 中的分段错误

    我需要用 0 填充二维数组 但编译后的程序会出现此错误 怎么了 int main int vert 1001 1001 int hor 1001 1001 int dudiag 1416 1416 int uddiag 1416 1416
  • 当“”可以分配给std::string时,为什么有“clear”方法?

    一个可以用string clear函数清空字符串 也可以使用空双引号 来执行此操作 有什么不同 当您分配一个空字符串时 编译器必须在数据部分存储一个空的 C 字符串 并创建代码以将指向它的指针传递给赋值运算符 然后 赋值运算符必须从数据部分
  • C++17 中带有 noexcept 的 std::function

    在 C 17 中noexcept 已添加到类型系统中 http www open std org jtc1 sc22 wg21 docs papers 2015 p0012r1 html void r1 void f noexcept f
  • 函数原型和数组参数

    我正在学习 C 语法 并且已经开始研究数组了 我想问你一个问题 但首先让我回顾一下 这样我就知道我已经弄清楚了 我知道您可以使用以下语法将变量定义为数组 name
  • F# 内联如何工作?

    对于 F 我的理解是您可以使用 inline 关键字在调用站点执行类型专门化 那是 val inline a gt b gt c when a or b static member a b gt c 约束条件是 a or b必须有一个静态成
  • .NET 中 IEqualityComparer 中 GetHashCode 的作用是什么?

    我试图了解 IEqualityComparer 接口的 GetHashCode 方法的作用 下面的例子取自MSDN using System using System Collections Generic class Example st
  • 整数与双精度算术性能?

    我正在编写一个 C 类来使用整数执行 2D 可分离卷积 以获得比双对应更好的性能 问题是我没有获得真正的性能提升 这是 X 过滤器代码 对于 int 和 double 情况都有效 foreach pixel int value 0 for
  • “volatile void function( ... )” 做了什么?

    我见过从语法角度来看 C 函数中 volatile 关键字有多少种用法 https stackoverflow com questions 7643528 how many usage does volatile keyword have
  • 为什么测试在 TeamCity 中运行比直接在 NUnit 中运行需要更长的时间?

    我进行了一些 C 性能测试 基本上运行两种不同的方法 并检查一种方法的运行速度是否比另一种方法快得多 当我在 NUnit 本地运行它们时 其中一个测试的运行速度是另一个测试的十倍 因此我有一个 NUnit 测试 它使用Stopwatch检查
  • 适用于 Windows 的键值数据库?

    除了 MongoDB 和 Memcached 之外 Windows 上还运行哪些键值存储 我见过的大多数似乎只能在 Linux 上运行 Hypertable Redis Lightcloud 相关链接 是否有经过商业验证的云存储 Key g
  • 在标准库中静态链接时如何支持动态插件?

    假设一个应用程序myapp exe是使用构建的g 它使用标志 static libstdc 这样就可以安装在没有环境的情况下libstdc so myapp exe还添加了对某些功能的插件支持plugf可以通过动态加载dlopen来自共享库
  • 带有 Unicode 字符的主机名在 Windows 8 中有效

    Uri CheckHostName 回报UriHostNameType Unknown到处都是 但在 Windows 8 上 它又回来了UriHostNameType Dns 为什么突然间带有 Unicode 西里尔字符的主机名在 Wind
  • 如何在 C# 中通过 JavaScript 回调运行 QUnit 测试并获取测试结果?

    在我的几个项目中 我使用 MVC 模式将代码 关注点 分为 3 层 模型层和控制层都在 C 上运行 因此我使用 MSTest 或 NUnit 等测试框架来验证这些层的功能需求 对于视图层 我使用 QUnit 来测试 JavaScript 文
  • C# 编译器编译 .txt .obj .java 文件

    using System class Program public static void Main Console WriteLine Hello World Console ReadLine 我将文件另存为1 java 2 obj an
  • 将函数作为函数参数传递

    Unity C 似乎无法识别Func lt gt 作为函数委托的符号 那么 如何将函数作为函数参数传递呢 我有一个想法Invoke functionName 0 可能有帮助 但我不确定它是否实际上立即调用该函数 或者等待帧结束 还有别的办法
  • 散列 hash_hmac 时,Convert.ToChar(0) 散列结果与 PHP 中的 chr(0) 不同的字符串

    我在 PHP 中有一个字符串 它被转换为字节数组并进行哈希处理 转换为字节数组的字符串如下所示 G 字符 0 便便 我需要 C 中的等效字节数组 这样我才能得到相同的哈希值 编辑 这是完整的问题 生成的哈希值不同 PHP api secre
  • “保留供任何使用”是什么意思?

    注意 这是一个c questions tagged c问题 虽然我补充说c questions tagged c 2b 2b如果某些 C 专家可以提供 C 使用与 C 不同的措辞的基本原理或历史原因 在 C 标准库规范中 我们有这个规范文本

随机推荐

  • 尝试编写 IRC 客户端,但很难找到有关代码和连接协议的优质资源

    我已经看过 RFC 但我仍然在挣扎 我已经用 C 编写了一个基本客户端 但找不到有关如何正确连接的文档 一旦我连接并传输NICK和USER信息 我就需要加入一个频道 如果我立即执行 JOIN 则不会发生任何事情 大概是因为太早了 我必须推迟
  • 将角度分量文件拆分为单独的文件

    我有一个角度分量 绘制组件 它有很多按钮 如绘制矩形 绘制圆形等 我正在使用 paperjs 它有助于实际绘图 我有一些已更新的常见对象 例如 我有一个 paperjs 对象 每当我绘制任何形状 无论是圆形 矩形还是任何其他形状 时 该对象
  • 使用 SAM 在本地调用 Lambda 失败/超时

    我正在尝试获取本地环境来使用 VSCode windows 运行 调试 Python Lambda 我正在使用提供的 HelloWorld 示例来掌握这一点 但我无法调用 用于设置 SAM 和调用 Lambda 的步骤 我已经安装并运行了
  • 是什么导致 MyISAM 损坏? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我听说 MyISAM 表可能会损坏 什么样的操作最有可能损坏它们以及如何安全地修复所述损坏 MySQL 文档对此非常明确 http d
  • 如何在 Javascript 中按属性数量对对象进行排序? [复制]

    这个问题在这里已经有答案了 我有一个对象 William Hill bet365 royal panda pay 0 karamba roller 0 braned 0 pay 0 betfred braned 0 并想按属性数量对其进行排
  • 如何在 Python 中将二叉树打印为节点结构

    我有一个蟒蛇代码 https 1drv ms f s Aj9lfQS8qKqwnWiXL t6pVaPHu0y将字符串数学表达式转换为二叉树并对树的节点进行排序 以便左子节点始终小于右子节点 我想按以下顺序打印二叉树 例如 考虑数学表达式
  • 任务与异步任务

    好吧 我一直在试图解决这个问题 我读过一些文章 但没有一篇提供我正在寻找的答案 我的问题是 为什么Task必须返回一个任务async Task不是吗 例如 public override Task TokenEndpoint OAuthTo
  • 使用循环通过网络抓取创建表

    我正在尝试通过网络抓取tax rates org来获取德克萨斯州每个县的平均税率 我在 csv 文件中有一个包含 255 个县的列表 我将其导入为 TX counties 它是一个单列表 我必须将每个县的 URL 创建为字符串 因此我使用
  • 处理 Hadoop SequenceFile 中的 Writables 完全限定名称更改

    我有一堆 Hadoop SequenceFiles 它们是用我编写的一些 Writable 子类编写的 我们称之为 FishWritable 这个 Writable 在一段时间内运行良好 直到我决定为了清晰起见需要对包进行重命名 所以现在
  • gensim word2vec 访问输入/输出向量

    在 word2vec 模型中 有两个线性变换 将词汇空间中的单词带到隐藏层 in 向量 然后返回词汇空间 out 向量 通常这个输出向量在训练后会被丢弃 我想知道是否有一种简单的方法可以访问 gensim python 中的输出向量 同样
  • 如何从字符向量解析 CSV 数据以提取数据框?

    R 中的 read table 和 read csv 函数用于解析包含分隔数据的文件或 URL 并生成 R 数据帧 但是 我已经有一个包含 CSV 分隔数据的字符向量 使用逗号和 n 作为列和记录分隔符 因此我不需要从文件或 URL 中读取
  • System.Web.UI.ViewStateException,无效的视图状态

    我的网站每天都会抛出以下异常 但我找不到解决方案 我在网络上做了很少的研究 这就是我到目前为止所做的 将以下选项添加到 aspx 不会解决问题 ValidateRequest 假 EnableEventValidation 假 ViewSt
  • 使用二维数组作为一维数组正确吗?可能会导致未定义的行为等等?

    这段代码正确吗 由于某种原因 是否不推荐使用二维数组作为一维数组 char tab1 3 3 for int i 0 i lt 3 i for int j 0 j lt 3 j tab1 i j char i printf c char t
  • 文化不变 Decimal.TryParse()

    我正在编写一个自定义字符串到十进制验证器 它需要使用忽略区域性的 Decimal TryParse 即不关心输入是否包含 或 作为小数点分隔符 这是建议的方法 public static bool TryParse string s Num
  • iPhone - NSFetchedResultsController 的缓存名称

    各位大家好 我的 CoreData 驱动应用程序有多个来自同一存储的数据视图 并且全部使用 NSFetchedResultsController 目前 它们的 NSFetchedResultsController 缓存都具有相同的名称 Ro
  • 签名的 apk 在 proguard 启用中崩溃

    我正在尝试在我的应用程序中使用 proguard 将 proguard 设置为 true 然后问题开始 当我使用 proguard 时 我正在导入 libthis https stackoverflow com questions 1097
  • 迭代 jQuery 集合,无需重建 jQuery 对象

    item each i elt gt elt attr href Doing elt 是获取 jquery 对象所必需的 有没有一种方法可以迭代 jquery 集合 而无需重建 jquery 对象 执行 elt 是获取 jquery 对象所
  • 编码霍夫曼树方案[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我正在尝试编写一个函数 codeWords t 它遍历霍夫曼树 添加 0当它向左移动时 添加 1当它向右时 并以叶子上的
  • jQuery 替换 href 中的特定文本

    如何只更改下面链接的值中的文本 us test 而不必替换整个链接 我当前使用的方法替换了整个链接 我猜这与 attr 的功能有关 我猜我可以通过使用 find 或其他东西来实现这一点 我真的不知道如何做到这一点 有人可以帮助我吗 docu
  • 在非 MonoBehaviour 类中使用协程

    如何在非 Monobehaviour 类的实例中传递 Monobehaviour 我找到了这个link https forum unity3d com threads running startcoroutine from a non mo