Unity延迟,协程

2023-11-10

Unity (学习笔记)

主要记录一些重要以及易错的知识点。

1.unity延时方法Invoke和InvokeRepeating

1.Unity Time类

  • 1.Time.time 表示从游戏开发到现在的时间,会随着游戏的暂停而停止计算。
  • 2.Time.timeSinceLevelLoad 表示从当前Scene开始到目前为止的时间,也会随着暂停操作而停止。
  • 3.Time.deltaTime 表示从上一帧到当前帧时间,以秒为单位。

MonoBehaviour里面有两个内置的延时方法

2.Invoke(延迟后调用一次)

Invoke(methodName: string, time: float);
methodName:方法名
time:多少秒后执行

3.InvokeRepeating(延迟后在规定的时间周期重复调用N次)

InvokeRepeating(methodName: string, time: float, repeatRate: float);
methodName:方法名
time:多少秒后执行
repeatRate:重复执行间隔

4.CancelInvoke(); (取消该脚本上的所有延时方法)

using UnityEngine;
using System.Collections;

public class DelayScript : MonoBehaviour {
    //当前时间
    private float nowTime;
    //执行重复方法的次数
    private int count;
    // Use this for initialization
    void Start () {
        nowTime = Time.time;
        Debug.Log("时间点:"+nowTime);
        this.Invoke("setTimeOut", 3.0f);
        this.InvokeRepeating("setInterval", 2.0f, 1.0f);
    }

    private void setTimeOut()
    {
        nowTime = Time.time;
        Debug.Log("执行延时方法:" + nowTime);
    }

    private void setInterval()
    {
        nowTime = Time.time;
        Debug.Log("执行重复方法:" + nowTime);
        count += 1;
        if(count==5)
            this.CancelInvoke();
    }
}

上面代码运行后,输出如下:
请添加图片描述

2.协程(Coroutines)

Unity的协程系统是基于C#的一个简单而强大的接口 ,IEnumerator,它允许你为自己的集合类型编写枚举器。

using System.Collections;//用协程必须要这个命名空间
using System.Collections.Generic;
using UnityEngine;

public class GameManager : MonoBehaviour
{
    public enum STATE{//枚举类型
        IDLE,
        PLAYERA,
        PLAYERB,
        FINISHED
    }
    [Space(10)]//与上面的间隔
    [Header("== Game State ==")]//添加标题
    public STATE state;//枚举类型的state就会是一个下拉框
    private bool firstEnter = true;
 
    void Update()
    {
       if (state == STATE.IDLE)
        {
            if (firstEnter == true)
            {//Trigger once
                StartCoroutine("TaskIDLE");
                firstEnter = false;
            }
            else
            {//Regular tasks
                CheakVictory();
            }
        }
        else if (state == STATE.PLAYERA)
        {
            CheakVictory();
            if (firstEnter == true)
            {
                StartCoroutine("TaskPLAYERA");
                firstEnter = false;
            }
            else
            {
                CheakVictory();
            }
        }
        else if (state == STATE.PLAYERB)
        {
            CheakVictory();
            if (firstEnter == true)
            {          
                StartCoroutine("TaskPLAYERB");
                firstEnter = false;
            }
            else
            {
                CheakVictory();
            }            
        }
       else if (state == STATE.FINISHED)
        {
            if (firstEnter == true)
            {
                StopCoroutine("TaskIDLE");
                StopCoroutine("TaskPLAYERA");
                StopCoroutine("TaskPLAYERB");
            }
        }
    }

	//声明协程
    //协程=IEnumerator + 方法名()
    IEnumerator TaskIDLE()
    {
        yield return new WaitForSeconds(1.0f);
        fgui.Play("SceneBattleStart");
        yield return new WaitForSeconds(2.0f);
        state = STATE.PLAYERA;
        firstEnter = true;
    }
    IEnumerator TaskPLAYERA()
    {
        ac1.anim.SetTrigger("attack");
        yield return new WaitForSeconds(2.0f);
        state = STATE.PLAYERB;
        firstEnter = true;
        CheakVictory();
    }
    IEnumerator TaskPLAYERB()
    {
        ac2.anim.SetTrigger("attack");
        yield return new WaitForSeconds(2.0f);
        state = STATE.PLAYERA;
        firstEnter = true;
        CheakVictory();
    }
}

简写协程就是这样的:

using System.Collections;//用协程必须要这个命名空间
StartCoroutine("TaskIDLE");//调用TaskIDLE()这个协程
IEnumerator TaskIDLE()//声明一个TaskIDLE()协程
{
    yield return new WaitForSeconds(1.0f);//暂停1秒,再执行下面语句

    yield return new WaitForSeconds(5.0f);//暂停5秒,再执行下面语句
}

那我们怎么终止其中的一个协程呢?如果你想要终止某一个特定的协程,那么你必须得在开始协程的时候将它的方法名作为字符串,就像这样:

正确写法
//想开始一个协程,把方法名写入StartCoroutine("这里");即可
StartCoroutine("FirstTimer");
StartCoroutine("SecondTimer");
//想关掉一个协程同理,把方法名写入StopCoroutine("这里");
StopCoroutine("FirstTimer");

错误写法
StartCoroutine(FirstTimer());
StartCoroutine(SecondTimer());

3.区分相识的东西

transform.position和transform.localPosition区别

  • 1.position是根据世界原点为中心
  • 2.localPosition是根据父节点为中心,如果没有父节点,localpositon和position是没有区别的

Awake() 和Start()的区别

  • 加载Scence 时 会先对所有脚本的Awake()先执行. 再执行Start()
  • 因此如果脚本A. 在初始化时需要调用到 脚本B 里的变量.
  • 那A的调用语句 应放在Start()中,而不是Awake()
  • 而B脚本要被调用的变量应 在Awake()中执行初始化.

4.Unity本地持久化类Playerprefs使用详解

1.PlayerPrefs是什么?

PlayerPrefs是Unity3d提供了一个用于数据本地持久化保存与读取的类。工作原理十分简单,就是以key-value的形式将数据保存在本地,然后在代码中可以写入、读取、更新数据。

2.PlayerPrefs有什么用?

可用于存储一些非关键性的数据,尤其在没有服务器的单机游戏中,游戏存档、分数排名等都需要用到数据存储,可以使用PlayerPrefs轻松实现数据存储。

3.PlayerPrefs如何用?

1. 存储数据:
//存储整型数据
PlayerPrefs.SetInt("intKey",999); 
//存储浮点型数据
PlayerPrefs.SetFloat("floatKey",1.11f); 
//存储字符串数据
PlayerPrefs.SetString("strKey","I am Plane");
2. 取出数据:
//取出key为"intKey"的整型数据
int intVal = PlayerPrefs.GetInt("intKey"); 
//取出key为"floatKey"的浮点型数据
float floatVal = PlayerPrefs.GetFloat("floatKey"); 
//获取key为"strKey"的字符串数据
string strVal = PlayerPrefs.GetString("strKey");
3. 删除数据与查数据:
//删除所有存储数据
PlayerPrefs.DeleteAll();
//删除key为"score"的数据
PlayerPrefs.DeleteKey("score");
//查找是否存在key为"score"的数据
bool exist = PlayerPrefs.HasKey("score")
4. 注意事项:

数据以键值对的形式存储,可以看做一个字典。
数据通过键名来读取,当值不存在时,返回默认值。

5.场景切换

制作关卡游戏就特别适合使用这个场景切换

 UnityEngine.SceneManagement.SceneManager.LoadScene(1);//切换到1场景

在unity中添加已有的场景
请添加图片描述
在这里插入图片描述

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

Unity延迟,协程 的相关文章

  • c和java语言中的换行符

    现在行分隔符取决于系统 但在 C 程序中我使用 n 作为行分隔符 无论我在 Windows 还是 Linux 中运行它都可以正常工作 为什么 在java中 我们必须使用 n 因为它与系统相关 那么为什么我们在c中使用 n 作为新行 而不管我
  • VB.NET 相当于 C# 属性简写吗?

    是否有与 C 等效的 VB NET public string FirstName get set 我知道你能做到 Public Property name As String Get Return name ToString End Ge
  • 向 Nhibernate 发出 SQL 查询

    如何将此 SQL 查询发送给 Nhibernate SELECT Customer name FROM Company INNER JOIN Customer ON Company CompanyId Customer CompanyId
  • 如何修复此错误“GDI+ 中发生一般错误”?

    从默认名称打开图像并以默认名称保存 覆盖它 我需要从 Image Default jpg 制作图形 将其放在 picturebox1 image 上并在 picurebox1 上绘制一些图形 它有效 这不是我的问题 但我无法保存 pictu
  • 将内置类型转换为向量

    我的 TcpClient 类接受vector
  • 在新的浏览器进程中打开 URL

    我需要在新的浏览器进程中打开 URL 当浏览器进程退出时我需要收到通知 我当前使用的代码如下 Process browser new Process browser EnableRaisingEvents true browser Star
  • 将 System.Windows.Input.KeyEventArgs 键转换为 char

    我需要将事件参数作为char 但是当我尝试转换 Key 枚举时 我得到的字母和符号与传入的字母和符号完全不同 如何正确地将密钥转换为字符 这是我尝试过的 ObserveKeyStroke this new ObervableKeyStrok
  • 在 C# 中循环遍历文件文件夹的最简单方法是什么?

    我尝试编写一个程序 使用包含相关文件路径的配置文件来导航本地文件系统 我的问题是 在 C 中执行文件 I O 这将是从桌面应用程序到服务器并返回 和文件系统导航时使用的最佳实践是什么 我知道如何谷歌 并且找到了几种解决方案 但我想知道各种功
  • C# Dns.GetHostEntry 不返回连接到 WiFi 的移动设备的名称

    我有一个 C 中的 Windows 窗体应用程序 我试图获取列表中所有客户端的主机名 下面给出的是 ra00l 来自此链接的代码示例 GetHostEntry 非常慢 https stackoverflow com questions 99
  • Rx 中是否有与 Task.ContinueWith 运算符等效的操作?

    Rx 中是否有与 Task ContinueWith 运算符等效的操作 我正在将 Rx 与 Silverlight 一起使用 我正在使用 FromAsyncPattern 方法进行两个 Web 服务调用 并且我想这样做同步地 var o1
  • 如何将自定义 JSON 文件添加到 IConfiguration 中?

    我正在使用 asp net Autofac 我正在尝试加载自定义 JSON 配置文件 并基于该文件创建 实例化 IConfiguration 实例 或者至少将我的文件包含到默认情况下构建的 IConfiguration asp net 中
  • 使用 Moq 使用内部构造函数模拟类型

    我正在尝试模拟 Microsoft Sync Framework 中的一个类 它只有一个内部构造函数 当我尝试以下操作时 var fullEnumerationContextMock new Mock
  • std::async 与重载函数

    可能的重复 std bind 重载解析 https stackoverflow com questions 4159487 stdbind overload resolution 考虑以下 C 示例 class A public int f
  • (de)从 CSV 序列化为对象(或者最好是类型对象的列表)

    我是一名 C 程序员 试图学习 C 似乎有一些内置的对象序列化 但我在这里有点不知所措 我被要求将测试数据从 CSV 文件加载到对象集合中 CSV 比 xml 更受青睐 因为它更简单且更易于人类阅读 我们正在创建测试数据来运行单元测试 该集
  • 为什么在setsid()之前fork()

    Why fork before setsid 守护进程 基本上 如果我想将一个进程与其控制终端分离并使其成为进程组领导者 我使用setsid 之前没有分叉就这样做是行不通的 Why 首先 setsid 将使您的进程成为进程组的领导者 但它也
  • Process.Start() 方法在什么情况下返回 false?

    From MSDN https msdn microsoft com en us library e8zac0ca v vs 110 aspx 返回值 true 表示有新的进程资源 开始了 如果由 FileName 成员指定的进程资源 St
  • 有没有办法强制显示工具提示?

    我有一个验证字段的方法 如果无法验证 该字段将被清除并标记为红色 我还希望在框上方弹出一个工具提示 并向用户显示该值无效的消息 有没有办法做到这一点 并且可以控制工具提示显示的时间 我怎样才能让它自己弹出而不是鼠标悬停时弹出 If the
  • 编译时“strlen()”有效吗?

    有时需要将字符串的长度与常量进行比较 例如 if line length gt 2 Do something 但我试图避免在代码中使用 魔法 常量 通常我使用这样的代码 if line length gt strlen Do somethi
  • 在客户端系统中安装后桌面应用程序无法打开

    我目前正在使用 Visual Studio 2017 和 4 6 1 net 框架 我为桌面应用程序创建了安装文件 安装程序在我的系统中完美安装并运行 问题是安装程序在其他计算机上成功安装 但应用程序无法打开 edit 在客户端系统中下载了
  • 如何正确使用 std::condition_variable?

    我很困惑conditions variables以及如何 安全 使用它们 在我的应用程序中 我有一个创建 gui 线程的类 但是当 gui 是由 gui 线程构造时 主线程需要等待 情况与下面的函数相同 主线程创建互斥体 锁和conditi

随机推荐

  • 异步日志的实现

    异步日志的实现 异步管理类 异步工厂类 登录校验 登录 异步管理类 采用单例模式的静态饥饿加载 利用空间换时间 提高效率 使用异步延迟任务线程池 通过其内直接创建饥一个static对象 形成饥饿加载 以达到记录日志时的单例模式 import
  • Android-Studio-常用配置和快捷键

    原文链接http www open open com lib view open1466732917214 html articleHeader1 http www jianshu com p bc8f6bfe12c6 以下直接在 Sett
  • VS版本、GCC版本与C++版本的对应关系

    做嵌入式开发经常遇到一些编译器和C 版本不匹配的问题 现整理如下 目前C语言的标准有 C89 ANSI C C90 C95 C99 ISO C C11 C1x 目前C 语言的标准有 C 98 C 03 对98小幅修改 C 11 全面进化 C
  • C语言与C++,C#究竟是什么关系?

    简单来说 C 就像是C语言的亲弟弟 而C 就是他们二者的远房亲戚 其实它更像是Java的表兄弟 小编c 学习群825414254获取c 一整套系统性的学习资料还有数十套pdf这三门语言都是十分优秀的编程语言 也都有很高的运行效率 这三种编程
  • Gradle是个啥东东?

    如何通俗地理解 Gradle 我以前一直用 Eclipse with ADT 来开发Android 项目 而且对它的基础的原理掌握不深 直接上手开发的 没有去考虑太多的东西 现在手头上有一个新的项目要使用到Android Studio 我早
  • SQL编程:外键约束

    外键 foreign key 一个表中的foreign key指向另一个表中的unique key 唯一约束的键 对于两个具有关联关系的表而言 相关联字段中主键所在的表就是主表 外键所在的表就是从表 子表 外键约束 foreign key约
  • SpringCloud gateway+zookeeper实现网关路由

    准备工作 需要两个项目去实现路由 demo1为springboot项目用于接入网关 测试网关连通性 gateway为网关路由项目 网关搭建 1 电脑安装好zookeeper 并且正常运行服务 Zookeeper官网 2 创建一个spring
  • python3 100示例学习

    http www runoob com python python 100 examples html
  • CSS属性之渐变属性(gradient)

    渐变分为线性渐变和径向渐变 所谓渐变就是几种颜色之间的平稳过渡 线性渐变 线性渐变 linear gradient 实现线性渐变 你至少需要定义两种颜色的结点 这两种结点就是你想平稳过渡的颜色 即 其中一种颜色结点为起点 另一种颜色结点为结
  • 论文阅读—基于目标偏置的双向APF-RRT*算法的无人机轨迹规划

    基于目标偏置的双向APF RRT 算法的无人机轨迹规划 算法 APF选择最好的父节点 双向搜索树 主要提升策略 实验分析 J Fan X Chen and X Liang UAV trajectory planning based on b
  • 40核至强服务器性能如何,Intel 10nm 14核心至强曝光:同频性能暴涨54%

    日前我们曾经从GeekBench测试数据库里见到一颗疑似Intel 10nm Ice Lake SP服务器平台的6核心型号 外媒称对比现有14nm产品 多线程性能提升多达118 颇为不可思议 但真实性也有待检验 现在 SiSoftware数
  • 期刊分区常识

    作为一个科研工作者 了解期刊论文的一些基本常识是大有裨益的 这对于我们深入了解所从事领域的研究 和论文的写作与发表等都会有很大的帮助 比如对于期刊分区的问题 从事科研的人都听过 但是也许你并没有深入了解其概念和意义 尤其对于刚刚步入科研领域
  • 用docker 创建centos7 ,无法使用systemctl解决方法

    docker run privileged it d name centos odoo centos centos7 9 2009 usr sbin init 1 privileged it d 一定要加 2 name 后面是容器名称和使用
  • 一句话征服了美国人,这位饱受争议的数学博士竟从未上过学?

    全世界只有3 14 的人关注了 青少年数学之旅 前两天 有位不愿意透露姓名的模友问了超模君一个问题 虽然这个问题超模君已经解答过无数遍了 但看到模友如此虔诚的态度 超模君决定今天再给模友们讲一个犹太小伙用数学征服美国军官的故事 偌大维也纳
  • qt的visible hide 等布局隐藏函数

    https blog csdn net dbzhang800 article details 6300021
  • xpath手册

    XPath手册 源于ZVON AAA AAA CCC AAA DDD BBB BBB DDD BBB AAA CCC DDD BBB AAA BBB 1 AAA BBB last id BBB id BBB name BBB BBB not
  • 手机驱动工程师门,准备转行了吗

    前80后从事手机研发的年轻人目前已经人到中年后了 时间过得真的很快 从2004左右开始红火的山寨手机 已经耗去了你们青春 你们中的不少人也从中过得不错的收益 但随着iPhone的出现 智能手机视乎在一瞬间就冒了出来 大佬Nokia都没有缓过
  • 交换机与路由器技术-05-路由器工作原理

    目录 一 路由器的工作原理 1 1 回顾交换机的工作原理 1 2 回顾路由器相关知识 1 3 网络层IP数据包格式 二 路由器工作原理 2 1 路由 2 2 路由器工作模式 2 3 路由表 2 4 静态路由 2 5 动态路由 2 6 分层次
  • 独占指针 std::unique_ptr

    学习智能指针之前需要知道的 智能指针是原始指针的封装 在头文件
  • Unity延迟,协程

    Unity 学习笔记 主要记录一些重要以及易错的知识点 笔记目录 Unity 学习笔记 1 unity延时方法Invoke和InvokeRepeating 1 Unity Time类 2 Invoke 延迟后调用一次 3 InvokeRep