2、Unity【基础】Mono中的重要内容

Unity基础 MonoBehavior中的重要内容

在这里插入图片描述

在这里插入图片描述

文章目录

  • Mono中的重要内容
    • 1、延迟函数
      • 1、延迟函数概念
      • 2、延迟函数使用
      • 3、延迟函数受对象失活销毁影响
      • 思考1 利用延时函数实现计时器
      • 思考2 延时销毁
    • 2、协同程序
      • 1、Unity是否支持多线程
      • 2、协同程序概念
      • 3、协同程序和线程的区别
      • 4、协程的使用
      • 5、yield return 不同内容的含义
      • 6、协程受对象和组件失活销毁的影响
      • 思考1 利用协程制作一个计时器
      • 思考2 利用协程创建十万立方体
    • 3、协同程序原理
      • 1、协程的本质
      • 2、协程的本体是迭代器方法的体现
      • 总结
      • 思考 通过迭代器自定义协程

Mono中的重要内容

1、延迟函数

1、延迟函数概念

延时执行的函数

2、延迟函数使用

只有继承MonoBehavior的脚本可以使用延时相关函数

1、延迟函数
Invoke();
参数一:函数名字符串
参数二:延迟时间 秒为单位注意:
1、Invoke只调用无参方法,若要调用有参,只需将有参方法写在无参方法体中
2、函数名必须是脚本上声明的函数
2、延迟重复执行函数
InvokeRepeating();
参数一:函数名字符串
参数二:第一次执行延迟时间
参数三:每次执行的间隔时间
3、取消延迟函数取消该脚本的所有延时函数CancelInvoke(); 指定函数名取消CancelInvoke("函数名");    
4、判断是否有延迟函数if(IsInvokeing()){print("存在延时函数");}if(IsInvokeing("函数名")){print("存在延时函数函数名");}

3、延迟函数受对象失活销毁影响

脚本依附对象失活or脚本失活
延时函数可以继续执行脚本依附对象销毁or脚本移除
延时函数无法继续执行void OnEnable(){//对象激活时,开启延迟
}
void OnDisable(){//对象失活时,停止延迟
}

思考1 利用延时函数实现计时器

方法一:

private int time = 0;
void Start()
{InvokeRepeating("DelayFunc",0,1);
}
void DelayFunc()
{print(time+"秒");time++;
}

方法二:

private int time = 0;
void Start()
{DelayFunc();
}
void DelayFunc()
{print(time + "秒");time++;Invoke("DelayFunc", 1);
}

思考2 延时销毁

void Start()
{//Destroy(gameObject,5);Invoke("DelayDes",5);
}
void DelayDes()
{Destroy(gameObject);
}

2、协同程序

1、Unity是否支持多线程

Unity是支持多线程的
只是新开线程无法访问Unity相关对象的内容
新开线程主要进行复杂逻辑运算或者网络消息接收等
注意:新开线程后Unity中的多线程要记得关闭Thread t;
void Start()
{t = new Thread(Test);t.Start();
}
void Test()
{while (true){Thread.Sleep(1000);print("Test");}
}
private void OnDestroy()
{t.Abort();t = null;
}

2、协同程序概念

1、协同程序简称协程:它是“假”的多线程,它不是多线程
2、它的主要作用:将代码分时执行,不卡主线程简单理解,是把可能会让主线程卡顿的耗时的逻辑分时分步执行
3、主要使用场景:异步加载文件异步下载文件场景异步加载批量创建时防止卡顿

3、协同程序和线程的区别

1、新开一个线程是独立的一个管道,和主线程分开执行
2、新开一个协程是在原线程之上开启,进行逻辑分时分步执行

4、协程的使用

继承MonoBehavior的类都可以开启协程函数
第一步:声明协程函数
协程函数2个关键点1、返回值为IEnumerator类型及其子类2、函数中通过 yield return 返回值,进行返回
代码示例:    IEnumerator MyCoroutine(int i, string str){yield return new WaitForSeconds(5);}第二步:开启协程函数常用开后启方式StartCoroutine(MyCoroutine(1,"abc"));第三步:关闭协程关闭所有协程StopAllCoroutines();关闭指定协程Coroutine c = StartCoroutine(MyCoroutine(1,"abc"));StopCoroutine(c);

5、yield return 不同内容的含义

1.下一帧执行yield return 数字;yieldreturn null;在Update和LateUpdate之间执行2.等待指定秒后执行yield return new WaitForSeconds(秒);在Update和LateUpdate之间执行3.等待下一个固定物理顿更新时执行yield return new WaitForFixedUpdate();在FixedUpdate和碰撞检测相关承函数之后执行4.等待摄像机和GUI染完成后执行(用来截图)yield return new WaitForEndOfFrame(); 在LateUpdate之后的染相关处理完毕后之后5.一些特殊类型的对象 比如异步加载相关函数返回的对象
在之后【异步加载资源】【异步加载场景】【网络加载】里
一般在Update和LateUpdate之间执行6.跳出协程yield break;

6、协程受对象和组件失活销毁的影响

协程开启后
脚本组件和物体【销毁】,协程不执行
物体【失活】协程不执行
只有在脚本组件失活时协程执行

思考1 利用协程制作一个计时器

//开启协程
void Start()
{StartCoroutine(MyCoroutine());
}
//声明协程
IEnumerator MyCoroutine()
{int time = 0;while (true){print(time + "秒");time++;yield return new WaitForSeconds(1); }}

思考2 利用协程创建十万立方体

void Update()
{if (Input.GetKeyDown(KeyCode.Space)){StartCoroutine(CreateCube(10000));}
}
IEnumerator CreateCube(int num)
{for (int i = 0; i < num; i++){GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);cube.transform.position = new Vector3(Random.Range(-100, 100), Random.Range(-100, 100), Random.Range(-100, 100));if (i % 100 == 0){yield return null;}}
}

3、协同程序原理

1、协程的本质

协程可以分成两部分
1.协程函数本体
2.协程调度器协程本体就是一个能够中间暂停返回的函数
协程调度器是Unity内部实现的,会在对应的时机帮助我们继续执行协程函数Unity只实现了协程调度部分
协程的本体本质上就是一个C#的迭代器方法

2、协程的本体是迭代器方法的体现

1、协程函数本体
如果我们不通过开启协程方法执行协程
Unity的协程调度器是不会帮助我们管理协程函数的
但是我们可以自己执行迭代器函数内容void Start(){IEnumerator ie = Test(); //手动开启ie.MoveNext(); //得到第一个yield return前的内容print(ie.Current); //得到yield return的内容//循环获取内容while (ie.MoveNext())print(ie.Current);}IEnumerator Test(){print("第一次迭代内容");yield return "测试";}2.协程调度器
继承MonoBehavior后 开启协程
相当于是把一个协程函数(选代器)放入Unity的协程调度器中帮助我们管理进行执行
具体的yield return后面的规则也是Unity定义的一些规则总结
你可以简化理解迭代器函数
C#看到迭代器函数和yield return语法糖
就会把原本是一个的函数变成“几部分”!
我们可以通过迭代器从上到下遍历这“几部分”进行执行
就达到了将一个函数中的逻辑分时执行的目的而协程调度器就是利用送代器函数返回的内容来进行之后的处理
比如Unity中的协程调度器
限据yield return返回的内容决定了下一次在何时继续执行代器函数中的下一部分
理论上来说我们可以利用迭代器函数的特点自己实现协程调度器来取代unity自带的调度器

总结

协程的本质就是利用
C#的迭代器函数【分步】执行的特点加上
协程调度逻辑
实现的一套【分时】执行函数的规则

思考 通过迭代器自定义协程

请不使用Unity自带的协程协调器开启协程
通过迭代器函数实现每隔一秒执行函数中的一部分逻辑

CoroutineMgr

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class YieldReturnTime
{//每一次执行的迭代器接口public IEnumerator ie;//下一次执行的时间public float time;
}
public class CoroutineMgr : MonoBehaviour
{private static CoroutineMgr instance;public static CoroutineMgr Instance => instance;//声明用于存储迭代器对象的容器private List<YieldReturnTime> yrtList = new List<YieldReturnTime>();void Awake(){instance = this;}public void MyStartCoroutine(IEnumerator ie){//分步分时逻辑if (ie.MoveNext()){if (ie.Current is int){YieldReturnTime yrt = new YieldReturnTime();//记录迭代器和时间yrt.ie = ie;yrt.time = Time.time + (int)ie.Current;yrtList.Add(yrt);}}}void Update(){//判断预期时间,若正常时间>=预期时间,则执行下一步//倒着遍历,目的是防止遍历时迭代器移除内容发生前移,产生漏读for (int i = yrtList.Count - 1; i >= 0; i--){if (yrtList[i].time <= Time.time){if (yrtList[i].ie.MoveNext()){if (yrtList[i].ie.Current is int)yrtList[i].time = Time.time + (int)yrtList[i].ie.Current;}else{yrtList.RemoveAt(i);}}}}
}

Xiecheng

using System.Collections;
using UnityEngine;public class Xiecheng : MonoBehaviour
{void Start(){CoroutineMgr.Instance.MyStartCoroutine(MyCoroutine());}IEnumerator MyCoroutine(){print("A");yield return 1;print("B");yield return 1;print("C");yield return 1;print("D");yield return 1;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/405482.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

西门子PLC12001500变量标签导入昆仑通态触摸屏

目录 新建DB测试数据块导出DB数据导出结构体类型触摸屏导入标签 新建DB测试数据块 新建DB1数据块&#xff0c;里面包含普通bool数据类型&#xff0c;以及结构体数据类型 同时需要取消优化的块访问 导出DB数据 DB1数据块右击——从块生成源——仅所选块 这里要注意的是导出文…

悟空降世 撼动全球

文&#xff5c;琥珀食酒社 作者 | 积溪 一只猴子能值多少钱&#xff1f; 答案是&#xff1a;13个小目标 这两天 只要你家没有断网 一定会被这只猴子刷屏 它就是咱国产的3A游戏 《黑神话&#xff1a;悟空》 这只猴子到底有多火&#xff1f; 这么跟你说吧 茅台见了它都…

备战秋招60天算法挑战,Day22

题目链接&#xff1a; https://leetcode.cn/problems/missing-number/ 视频题解&#xff1a; https://www.bilibili.com/video/BV1HS42197Hc/ LeetCode 268.丢失的数字 题目描述 给定一个包含 [0, n] 中 n 个数的数组 nums &#xff0c;找出 [0, n] 这个范围内没有出现在数组…

微服务注册中心

目录 一、微服务的注册中心 1、注册中心的主要作用 &#xff08;1&#xff09;服务发现 &#xff08;2&#xff09;服务配置 &#xff08;3&#xff09;服务健康检测 2、 常见的注册中心 二、nacos简介 1、nacos实战入门 &#xff08;1&#xff09;搭建nacos环境 &am…

Vue插值:双大括号标签、v-text、v-html、v-bind 指令

创建应用程序实例后&#xff0c;需要通过插值进行数据绑定。数据绑定是 Vue.js 最核心的一个特性。建立数据绑定后&#xff0c;数据和视图会相互关联&#xff0c;当数据发生变化时&#xff0c;视图会自动进行更新。这样就无须手动获取 DOM 的值&#xff0c;使代码更加简洁&…

外部环境连接kafka

修改配置文件外部环境连接kafka 1、kafka的docker官方镜像地址2、kafka官方介绍的三种连接方式3、方式一&#xff1a;Default configs默认配置4、方式二&#xff1a;File input&#xff08;文件输入&#xff1a;外部配置文件替换docker容器内的配置文件&#xff09;4.1、首先查…

自存实践本地访问 nginx放前端打包好的项目

nginx 部署前端项目_哔哩哔哩_bilibili 将打包好的dits文件放到 配置nginx.conf文件的location 启动命令 start nginx.exe 输入localhost即可访问打包好的项目 nginx的特点 1.静态资源 2.转发 设置代理转发请求 关闭nginx .\nginx.exe -s quit

分享从零开始学习网络设备配置--任务6.2 实现网络设备的远程管理

任务描述 某公司的网络管理员小赵负责公司办公网的管理工作&#xff0c;熟悉了公司内部设备运行情况&#xff0c;每天都需要保障公司内部网络设备的正常运行&#xff0c;同时进行办公网的日常管理和维护工作。 在安装办公网中&#xff0c;路由器和交换机放置在中心机房&…

【生日视频制作】教师节中秋节国庆节红色直升飞机AE模板修改文字软件生成器教程特效素材【AE模板】

红色直升飞机生日视频制作教程AE模板改文字广软件告生成器素材 怎么如何做的【生日视频制作】教师节中秋节国庆节红色直升飞机AE模板修改文字软件生成器教程特效素材【AE模板】 生日视频制作步骤&#xff1a; 安装AE软件下载AE模板把AE模板导入AE软件修改图片或文字渲染出视频…

【Python机器学习】NLP概述——词序和语法

词的顺序很重要&#xff0c;那些在词序列&#xff08;如句子&#xff09;中控制词序的规则被称为语言的语法&#xff08;也被称为文法&#xff09;。这是之前的词袋或词向量例子中所丢弃的信息。在大多数简短的短语甚至许多完整的句子中&#xff0c;上述词向量近似方法都可以奏…

电脑硬盘坏了怎么恢复数据?

在数字化时代&#xff0c;电脑硬盘作为存储核心&#xff0c;承载着我们的工作文档、学习资料、家庭照片以及无数珍贵的回忆。然而&#xff0c;硬盘作为机械设备&#xff0c;也有其寿命和脆弱性&#xff0c;一旦出现故障&#xff0c;数据恢复便成为了一个紧迫而棘手的问题。本文…

Centos7 message日志因dockerd、kubelet、warpdrive、containerd等应用迅速增长

问题&#xff1a;公司服务器在部署一套业务后&#xff0c;message日志记录大量的dockerd、kubelet、warpdrive、containerd应用日志&#xff0c;每天增加2G大小的日志 解决方案&#xff1a; 前期吐槽下&#xff1a;发现某个帖子&#xff0c;需要会员或者花钱才能看&#xff0c…

AfuseKt v1.3.5 — 打造自己的视频库,可刮削

AfuseKt是一款功能全面的安卓视频播放器&#xff0c;支持从阿里云盘、Alist、WebDAV、Emby到Jellyfin等多个平台直接播放视频。注册简单&#xff0c;一次邮箱登记即可畅享所有功能&#xff0c;包括自动刮削和海报墙展示。无论你是电影迷还是系列剧的忠实粉丝&#xff0c;AfuseK…

Elasticsearch-关键词随机查询(8.x)

目录 一、查询语句 二、Java代码实现 基础介绍&#xff1a; ES自定义评分机制:function_score查询详解-阿里云开发者社区ES自定义评分机制:function_score查询详解https://developer.aliyun.com/article/1054571 开发版本详见&#xff1a;Elasticsearch-经纬度查询(8.x-半径…

npm安装时一直在idealTree:npm: sill idealTree buildDeps卡住不动解决方法

npm安装xmysql时一直idealTree:npm: sill idealTree buildDeps卡住不动 问题解决&#xff0c;如下图所示 解决方法&#xff1a; 1、查看.npmrc位置&#xff0c;并去目录中删掉.npmrc文件 --在cmd&#xff08;DOS页面&#xff09;界面执行下述指令&#xff0c;可查看 .npmrc 文…

数学建模起步感受(赛前15天)

0基础直接上手数模&#xff0c;因为大一&#xff01;年轻就是无所畏惧&#xff01;开个玩笑&#xff0c;因为数模比赛比一年少一年… 抱着不打也是浪费的态度&#xff0c;我开始着手准备 首先python啥也不会&#xff0c;知道有元组这玩意… 仅仅在刷软考题的时候遇到python选择…

单域名SSL证书申请三步法

申请单域名SSL证书&#xff0c;确保您的网站安全可信&#xff0c;只需简单三步&#xff1a; 选择证书类型与提供商&#xff1a;首先&#xff0c;确定您需要的单域名SSL证书类型&#xff0c;如DV&#xff08;域名验证&#xff09;证书。接着&#xff0c;选择一个信誉良好的证书提…

[003].第4节:RabbitMQ环境搭建

我的后端学习大纲 RabbitMQ学习大纲 1.rpm包方式搭建&#xff1a; 1.1.搭建RabbitMQ单体架构&#xff1a; 1.MQ下载地址2.这里是提前下载好后上传安装包到服务器得opt目录下&#xff1a; 3.安装MQ需要先有Erlang语言环境&#xff0c;安装文件的Linux命令(分别按照以下顺序安装…

喝酒上头的原因是什么?

酒精进入人体后&#xff0c;会被依次分解代谢成乙醛、乙酸&#xff0c;进而分解成二氧化碳和水&#xff0c;然后排出体外&#xff0c;这一代谢过程主要是依靠肝脏来进行的。如果代谢过程存在问题&#xff0c;那很有可能就会出现“上头”等不适症状。具体来说&#xff0c;主要与…

C++ 设计模式——简单工厂模式

简单工厂模式 简单工厂模式主要组成部分代码实现简单工厂模式模式的 UML 图简单工厂模式 UML 图解析优点和缺点适用场景 简单工厂模式 简单工厂模式是一种创建型设计模式&#xff0c;通过一个工厂类来负责对象的实例。这种模式将对象创建的细节封装在工厂类中&#xff0c;客户…