Unity—协程

2023-11-06

每日一句:要活在自己的热爱里,而不是别人的眼光里

目录

协程

概念理解:

Unity协程实现主要组成

使用协程的注意事项

练习:物体本身白色,点击攻击按钮,物体变为红色,两秒后变为原来颜色

练习:让立方体沿指定路线移动+在路点处停两秒


协程

概念理解:

·与方法一样,协程是一种程序组件

·相对一般方法而言,协程更为灵活,方法只有一个入口,而协程可以有多个入口点或出口点,可以用协程来实现任何的方法

·协程更适用于实现合作式多任务,迭代器、无线列表

·开始一个协程时,执行从被调用方法的起始处开始,然而接下来的每次协程被调用时,从协程返回的位置接着执行(协程的“超能力”:它可以暂停逻辑的执行,并将掌控权移交给U3D引擎,但是之后它还可以继续开始执行余下的逻辑)

·协程是单线程的

·协程只能在继承自MonoBehavior的脚本中使用

Unity协程实现主要组成

·Ienumerator/ɪˈnjuːməreɪtə/接口,提供迭代

·yield return XXXX 指定下一次迭代入口

—WaitForxedUpdate            暂停协程直到下一次FixedUpdate时才会继续执行协程

适用于物理控制[在FixedUpdate后执行]

—null,0,WaitForSeconds     使协程等待指定时间后再继续执行

适合于分多帧完成一个任务

WaitForOfFrame                处理等待帧,结束再恢复执行的逻辑

作用:等所有的摄像机和GUI被渲染完成后,再恢复协程的执行

[在每帧结束后执行]

—WWW                                  用来提供的URL获取内容的工具类

适合于网络下载数据

StartCoroutine/ˈkəʊruːˌtiːn/ 开启协程

2个重载StartCoroutine(string methodName,object value)(一切类型都派生自object)

        StartCoroutine(string methodName)(因为value有个默认值null)

        StartCoroutine(IEnumerator routine)

StopCoroutine结束协程

 

使用协程的注意事项

·多个协程可以同时运行,它们会根据各自的启动顺序来更新

·协程可以嵌套任意多层

·如果想让多个脚本访问一个协程,可以定义静态的协程

·协程不是多线程,它们运行在同一线程中,跟普通脚本一样

·如果你的程序需要进行大量的计算,那么可以考虑在一个随时间进行的协程中处理它们

·IEnumerator类型的方法不能带ref或out型的参数

void OnGUI()

{if(GUILayout.Button(“开始计时”))

   StartCoroutine(TimeFunc(3));}

private IEnumerator TimeFunc(float timeCount)

{ yield return new WaitForSeconds(timeCount);

  print(timeCount+“秒时间到”);}

public class CoroutineDemo : MonoBehaviour

{//获取当前正在运行协程的引用

    IEnumerator currentMoveCoroutine;

    //每按下空格时,会随机选择一个新的目的地并移动物体

private void Update()

    {

        if(Input.GetKeyDown(KeyCode.Space))

        {//如果当前有正在运行的协程,就停止该协程

            if (currentMoveCoroutine != null)

                StopCoroutine(currentMoveCoroutine);

            currentMoveCoroutine = Move(Random.onUnitSphere * 5, 8);

            StartCoroutine(currentMoveCoroutine);

        }

}

//创建一个协程,获取一个三维向量作为目标向量,一个浮点型作为速率

    IEnumerator Move(Vector3 destination,float speed)

    {

        while(transform.position!=destination)

        {

            transform.position = Vector3.MoveTowards(transform.position, destination,

                speed * Time.deltaTime一帧内物体能移到的距离);

            yield return null;或yield return new WaitForFixedUpdate();

【暂缓一帧执行(不让一帧过去要一点点移动)】

【移动到某个位置,不是一次,而是分多次,适宜用执行】

        }

    }

}

练习:物体本身白色,点击攻击按钮,物体变为红色,两秒后变为原来颜色

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

/// <summary>

/// 点击攻击按钮,物体变为红色,2秒后,变为白色

/// </summary>

public class Staycolordemo : MonoBehaviour

{

    //public  Color color;

    private Color oldcolor;

    private Renderer render;

    private void Start()

    {

        //color = GetComponent<Renderer>().material.color;

        render = GetComponent<Renderer>();

        oldcolor = render.material.color;

    }

    private void OnGUI()

    {

        if (GUILayout.Button("攻击"))

            StartCoroutine(ChangeColor());



    }

    private IEnumerator ChangeColor()

    {

        //color = Color.red;

        render.material.color = Color.red;

        yield return new WaitForSeconds(2);

        render.material.color = oldcolor;

    }

}

练习:让立方体沿指定路线移动+在路点处停两秒

using System.Collections;

using System.Collections.Generic;

using UnityEngine;



public class PathDemo : MonoBehaviour

{

    public Transform[] path;

    void Start()

    {

        StartCoroutine(FollowPath());

    }

    IEnumerator FollowPath()

    {

        foreach(Transform waypoint in path)

        {【等待至对方协程结束后在继续执行//协程的嵌套】

            yield return StartCoroutine(Move(waypoint.position, 6));

            yield return new WaitForSeconds(2);

          

        }

    }

    IEnumerator Move(Vector3 destination, float speed)

    {

        while (transform.position != destination)

        {

            transform.position = Vector3.MoveTowards(transform.position, destination,

                speed * Time.deltaTime);

            yield return null;

        }

    }

}

协程 - Unity 手册

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

Unity—协程 的相关文章

  • Unity中级客户端开发工程师的进阶之路

    上期UWA技能成长系统之 Unity高级客户端开发工程师的进阶之路 得到了很多Unity开发者的肯定 通过系统的学习 可以掌握游戏性能瓶颈定位的方法和常见的CPU GPU 内存相关的性能优化方法 UWA技能成长系统是UWA根据学员的职业发展
  • Unity动画系统详解

    目录 动画编辑器 编辑器面板 动画复用 前言 人形重定向动画 Humanoid 通用动画 Generic 旧版本动画 Legacy 动画控制器 系统状态 切换条件 状态机脚本 IK动画 反向动力学 BlendTree 混合树 Animato
  • Unity中实现倒计时的几种方式

    1 Time time using UnityEngine public class TimeTest MonoBehaviour public float secound 10 void Update Timing private flo
  • Unity中UI框架的使用1-添加面板、显示Loading页面

    其中BasePanel和Canvas都是挂在面板的预制物上的 1 导入我们的UI框架 本篇文章中有用的是两个UIPanelType NUIManager和NBasePanel 会放在文章最后供大家使用 2 先将我们做好的Panel设置成预制
  • Unity 键盘控制人物移动——之输入方式代码的编写

    键盘输入 控制人物移动 在我们制作游戏中最常见的需求之一就是使用键盘移动游戏角色 那么我们首先需要获取键盘输入 以下提供两种方法获取键盘 这里尽量通过截图解释让大家理解代码的含义 GetInput void FixedUpdate Move
  • Unity打开工程时卡住的问题

    自从Unity升级了一个版本后 Unity打开工程卡住的问题越来越严重了 具体表现为 选择工程后 Unity窗口消失 但进程还在 有时候等个几分钟能出来 有时候等10分钟都不见得能出来 直观感受上看 似乎是Unity加载工程的时候某一步卡了
  • unity3d大型互动照片墙

    1 本次应客户需求 制作一个大型照片墙互动 输出分辨率为9600 4320 注 unity3d官方推荐最大分辨率为8192 3686 4 经过现场长达24小时暴力测试中途未发生问题 姑且判定可以达到正常标准 废话不多说 先上效果 unity
  • unity: C#的Action Event Delegate的异同

    目录 一 Action 二 Event 三 Action和Event区别 四 Delegate 总结 Action Event Delegate的异同 前言 Action Event和Delegate都是C 语言中的重要概念 分别用于管理函
  • VLC for unity 插件如何使用

    VLC for unity 插件如何使用 先去下载一个VLC播放器 安装完成后 然后导入插件链接https download csdn net my 这个插件我的另一个上传资源里有 或者到商店去下载 这个插件链接下载完是一个txt文档 里面
  • 【Unity步步升】监控与检测物体的各种方案,如:射线、碰撞、挂载等...

    在制作AR模型数值控制方案的时候遇到了检测的问题 学习过程受益匪浅 故今天为大家整理带来一篇监控与检测物体的参考方案集合 目录 一 射线检测 二 物体存在检测 三 碰撞检测 一 射线检测 单射线检测 首先完成搭建场景如下图1 1 我这里用到
  • Unity旋转以及万向锁问题

    我之前研读了一些关于unity旋转相关的博客 一直想抽个时间写个总结 但是由于实习太忙一直没有写 趁着今天请了假晚上有时间把这段时间一些学习心得写出来 Unity inspector面板中的Rotation 在unity中 想必大家最先接触
  • 【原神游戏开发日志1】缘起

    原神游戏开发日志1 缘起 版权声明 本文为 优梦创客 原创文章 您可以自由转载 但必须加入完整的版权声明 文章内容不得删减 修改 演绎 相关学习资源见文末 大家好 最近看到原神在TGA上频频获奖 作为一个14年经验的游戏开发行业的老兵 我就
  • mixamo根动画导入UE5问题:滑铲

    最近想做一个跑酷游戏 从mixamo下载滑铲动作后 出了很多动画的问题 花了两周时间 终于是把所有的问题基本上都解决了 常见问题 1 动画序列 人物不移动 2 动画序列 人物移动朝向错误 3 蒙太奇 人物移动后会被拉回 4 蒙太奇 动画移动
  • Unity学习笔记

    一 旋转欧拉角 四元数 Vector3 rotate new Vector3 0 30 0 Quaternion quaternion Quaternion identity quaternion Quaternion Euler rota
  • Unity中URP下的指数雾

    文章目录 前言 一 指数雾 雾效因子 1 FOG EXP 2 FOG EXP2 二 MixFog 1 ComputeFogIntensity 雾效强度计算 2 lerp fogColor fragColor fogIntensity 雾效颜
  • U3D游戏开发中摇杆的制作(UGUI版)

    在PC端模拟摇杆 实现玩家通过控制摇杆让玩家移动 以下是完整代码 using System Collections using System Collections Generic using UnityEngine using Unity
  • 游戏开发创建操作之玩家信息系统的建立

    游戏一般都需要玩家信息系统 那么我们应该如何搭建玩家信息系统 接下来我将展示一种简单的方法 完整代码如下 using System Collections using System Collections Generic using Uni
  • 游戏开发常见操作梳理之小地图的制作

    游戏中一般存在小地图系统 实际上就是设置一个新的摄像机放置在玩家的正上方 然后在小地图上显示新摄像机看见的东西就可以了 在小地图上一般存在放大地图和缩小地图的按钮可以方便放大和缩小地图 这些操作是如何实现的呢 接下来直接上核心代码 usin
  • 游戏开发常见操作梳理之角色选择一

    进入游戏后 我们经常会进入角色选择的界面 通常是左右两个按钮可以更改角色供玩家选择 对于这种界面我们通常使用数据持久化将角色信息存储起来 接下来的笔记中 我将使用自带的数据持久化系统对其进行操作 实现角色的选择页面 后续会更新xml系列的文
  • 游戏开发常用实践操作之按动任意键触发

    接下来一些笔记会对于一些大大小小的实践操作进行记录 希望对你有所帮助 在游戏中 我们经常会遇到一些按动任意键触发的操作 接下来展示核心代码 以下是对于Unity中的操作 使用的UI是NGUI 对于核心操作没有影响 你可以自己置换 void

随机推荐

  • cocos3.10版本IphoneX 1分钟适配方案

    1 第一部找到 LaunchScreen storyboard 还有 LaunchScreenBackground png 拷贝到项目中 我的是放在 过场加载图片那里 cocos里面有 2 项目的 BulidPhases 找到 CopyBu
  • 电脑强制关机两次后报错自动修复你的电脑未正确启动

    强制关机两次后报错自动修复你的电脑未正确启动 因为电脑太卡就强制关机了 开机之后没有等全部加载完 又觉得卡强制关机 再次打卡后显示正在准备自动修复 之后就自动修复你的电脑未正确启动 当时很慌 自己的毕设还有毕业论文都在电脑里 虽然没有放到系
  • 队列的实现(Java)

    Java数据结构学习笔记 一 队列 数组实现 核心逻辑代码 class ArrayQueue private int maxSize 0 private int front private int rear private int arr
  • [C语言]进一步的来了解指针(多多多图详解)

    本文章进一步的来讲解指针 如果是第一次接触指针的可以先看一下对于指针的初步理解 C语言 初步的来了解一下指针 多图详解 HY PIGIE的博客 CSDN博客 目录 1 字符指针 2 指针数组 2 1指针数组 char 类型举例说明 2 2指
  • 对接网络摄像头——使用RTSP协议进行取流

    使用RTSP协议对大华网络摄像头进行取流 目标 具体操作 目标 用电脑或者带有网口的移动设备将大华网络摄像头的视频流取出来 具体操作 给摄像头供电 用网线将摄像头与笔记本连接起来 用大华的工具管家设置IPC的IP地址 使摄像头与笔记本在同一
  • HTML+JavaScript实现在浏览器里自由画线1.0

    gt gt
  • 参考文献引用网页

    格式 序号 主要责任者 电子文献题名 电子文献出处 电子文献及载体类型标识 或可获得地址 发表或更新日期 引用日期 举例 16 王明亮 关于中国学术期刊标准化数据库系统工程的进展 EB OL http www cajcd edu cn pu
  • torch用GPU训练

    需要手动将数据和模型都放到GPU中 法一 是否用GPU训练 train on gpu torch cuda is available device torch device cuda 0 if torch cuda is available
  • onvif抓包分析(三)

    GetProfile POST onvif Media HTTP 1 1 Content Type application soap xml charset utf 8 action http www onvif org ver10 med
  • vue-cli-service原理研究,以及其与webpack-dev-service的区别

  • eNsp下载地址(官网)

    http support huawei com enterprise softdownload action idAbsPath fixnode01 7919710 9856717 7923123 9858914 9017384 pid 9
  • 八大排序算法时间空间复杂度分析

    作者 番茄焖鸡蛋 链接 https www nowcoder com discuss 200097 type 1 来源 牛客网 1 冒泡排序不管序列是怎样 都是要比较n n 1 2 次的 最好 最坏 平均时间复杂度都为O n 需要一个临时变
  • 前端node该怎么接受ajax送过来的数据并且保存至数据库呢?

    如题 百度半圈也没查到有用的信息 或者html不用ajax也行 但是要把html里几个var 声明的变量传到nodejs并且保存至数据库就好
  • OpenWrt目录结构

    在未编译前 OpenWrt目录如下 1 package 此目录主要存放OpenWrt的软件包 我们自己添加的应用层代码都应存放于此文件夹 代码包存放于此文件夹并编写相应的Makefile后 在编译过程中OpenWrt会自主识别并编译 可以看
  • 【计算机网络】网络故障排错的基本思路

    网络故障排错的基本思路 1 检查物理链路是否有问题 2 查看本机IP地址 路由 DNS的设置是否有问题 3 测试网关或路由器的通畅情况 先测网关然后再测路由器 一级一级地测试 4 测试ping公网ip的通畅情况 平时要记几个外部IP 5 测
  • 第四章神经网络的学习算法——随机梯度下降numpy代码详解

    本专栏是书 深度学习入门 的阅读笔记一共八章 第一章深度学习中的Python基础 主要讲解了深度学习将要用到的python的基础知识以及简单介绍了numpy库和matpoltlib库 本书编写深度学习神经网络代码仅使用Python和nump
  • mysql 有newid()_MySQL中,有无GUID函数?就像SQL Server中的newid()解决方法

    mysql中 有无GUID函数 就像SQL Server中的newid 如题 有无直接返回GUID唯一标识的函数 解决方案 函数 UUID mysql gt select uuid uuid f6561a2e 8a6d 102a a914
  • GithubImageHost图床本地缓存设计

    GithubImageHost图床本地缓存设计 项目介绍 一个简易的Github图床客户端 项目仓库 GithubImageHost 试过很多图床 都缺少全部图片预览的功能 按照目录 预览仓库内所有图片 只有预览通过该图床上传过的图片 想了
  • Linux中pip install延时问题

    pip下载库出现延时问题一般因为GFW 所以在pip install 包名的时候我们可以指定镜像源解决这种问题 如果该镜像没有这个库我们可以制定其他的国内源 如下所示 pip install packageName i https pypi
  • Unity—协程

    每日一句 要活在自己的热爱里 而不是别人的眼光里 目录 协程 概念理解 Unity协程实现主要组成 使用协程的注意事项 练习 物体本身白色 点击攻击按钮 物体变为红色 两秒后变为原来颜色 练习 让立方体沿指定路线移动 在路点处停两秒 协程