Unity脚本(三)

news2024/12/25 13:43:15

视频教程:https://www.bilibili.com/video/BV12s411g7gU?p=128 

目录

Time

Prefab 

Animation


Time

Time.time:自应用程序启动以来,每帧的开始时间(只读)  

Time.deltaTime:每帧间隔,或说完成一帧的时间(等于当前帧的Time.time-下一帧的Time.time)

public float speed=100;

void Update()
{
        transform.Rotate(0,speed*Time.deltaTime,0);
        // 旋转/移动速度*每帧间隔,以保证旋转/移动速度不受渲染影响
}

Time.timeScale:时间的缩放,可用于慢动作效果或加快应用程序速度

ps:当设置为1.0时,时间流逝的速度与实时时间一样快;当设置为0.5时,时间比实时慢2倍 

Time.unscaledTime:不收缩放影响的每帧间隔

//渲染时执行,不受TimeScale影响
void Update()
{
    // transform.Rotate(0, speed * Time.deltaTime, 0);
}

// 固定0.02s执行一次,与渲染无关,受TimeScale影响
void FixedUpdate()
{
    // this.transform.Rotate(0, speed * Time.fixedDeltaTime, 0);
}

void OnGUI()
{
    if (GUILayout.Button("暂停游戏"))
    {
        Time.timeScale = 0;
    }

    if (GUILayout.Button("继续游戏"))
    {
        Time.timeScale = 1;
    }
}

尽管Update的执行不受timeScale的影响,但是在运行后,Update中编写的Transform.Rotate方法仍会受到timeScale的影响,这是因为Time.deltaTime受到了timeScale的影响,若修改代码不乘Time.deltaTime,则按下“暂停游戏”可使物体停止旋转

transform.Rotate(0, speed, 0);

使场景中的某些物体不受“暂停”的影响

public float speed = 100;

void Update()
{
        transform.Rotate(0, speed * Time.unscaledTime, 0);     
}

void OnGUI()
{
    if (GUILayout.Button("暂停游戏"))
    {
        Time.timeScale = 0;
    }

    if (GUILayout.Button("继续游戏"))
    {
        Time.timeScale = 1;
    }
}

Time.frameCount:自游戏开始以来的总帧数(只读)

Time.realtimeSinceStartup:游戏开始以来的实际时间(只读)

可以使用如下代码了解Time.timeScale,Time.unscaledTime及Time.realtimeSinceStartup的区别。运行后点击“暂停游戏”按钮,可以发现除了变量a,其余变量的值仍在累积

public float a;
public float b;
public float c;

void Update()
{
    a=Time.time;
    b=Time.unscaledTime;
    c=Time.realtimeSinceStartup;
}

void OnGUI()
{
    if (GUILayout.Button("暂停游戏"))
    {
        Time.timeScale = 0;
    }

    if (GUILayout.Button("继续游戏"))
    {
        Time.timeScale = 1;
    }
}

每1秒变化一次的时钟

难点:因为Update的执行受渲染的影响,使每帧的时间间隔不同(但一般仍在0.02左右)

方法1:

private float nextTime = 1;

void Update()
{
    if (Time.time >= nextTime)
    {
        second--;
        textTimer.text = string.Format($"{second / 60:d2}:{second % 60:d2}");
        nextTime = Time.time + 1;
    }
}

方法2:

private float totalTime = 1;

void Update()
{
    totalTime+=Time.deltaTime;
    if (totalTime>1)
    {
        second--;
        textTimer.text = string.Format($"{second / 60:d2}:{second % 60:d2}");
        totalTime-=1;
    }
}

 方法3:

void Start()
{
    textTimer = GetComponent<TMP_Text>();
    InvokeRepeating("Timer", 1, 1);
}

void Timer()
{
    if (second <= 0)
    {
        CancelInvoke("Timer");
    }
    second--;
    textTimer.text = string.Format($"{second / 60:d2}:{second % 60:d2}");
}

MonoBehaviour.InvokeRepeating(string methodName, float time, float repeatRate):在time 秒后调用methodName方法,然后每repeatRate秒调用一次

methodName调用的方法名
timen秒后开始调用
repeatRate每n秒重复一次。

MonoBehaviour.CancelInvoke:取消该MonoBehaviour上的所有Invoke调用,或取消该行为上所有名为methodName的Invoke调用

Prefab 

一种资源类型,可以多次在场景进行实例。且对预制件的修改,可以同步到所有实例,从而提高开发效率,当若单独修改实例的属性值,则该值不再随预制件变化 

将处于Hierarchy面板的游戏对象拖入Project面板

 

Open:在场景中打开预制件 

Select:通过预制件实例选择对应预制件

Revert All:放弃对实例属性值的修改,并还原预制件属性值

Apply All:将某一实例的修改应用至预制件和其他所有实例

Animation

Animation.CrossFade:在一定时间内淡入名称为name的动画并使其他动画淡出

Animation.Play:播放不带有任何混合的动画

Animation.PlayQueued:在前一个动画播放完成之后直接播放下一个动画(按指定的序列一个接一个地播放动画)

制作开门动画

在场景中使用一个Cube(Base)作为门的模型,用一个空物体(Door)作为门的旋转轴并使其作为前者的父级

 

 调整空物体(Door)的位置,使其Z轴与门的旋转轴重合

  

选择游戏对象Door,并进入Window-->Animation-->Animation创建名为Door的动画后,点击左上角的红点进入录制模式;点击Add Property选择Transform下的Rotation属性(点击右侧的+号)

添加相应属性后,默认的动画长度为0:00到1:00,可拖动末尾的关键帧至适当的位置改变动画长度,或对其按下右键选以删除末尾的关键帧(对关键帧上右键选择Delete Key)后,在合适位置双击添加新的关键帧(亦或是在合适的时间线上右键选择Add Key)

 

返回Inspector面板即可发现相应的属性的显示框成红色,在选择时间线末尾帧的情况下,将Rotation的Y值设置为90(绕Y轴选择90度)

 

ps:如生成了Animator则卸载该组件并挂载Animation组件后,按上图进行设置 

编写脚本Door并将其挂载至游戏对象Door上

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Door : MonoBehaviour
{
    public bool isOpen = false;
    public string animName;
    private Animation anim;

    private void Start()
    {
        anim = GetComponent<Animation>();
    }

    private void OnMouseDown()
    {
        if (isOpen)
        {
            if (anim.isPlaying == false)
            {
                anim[animName].time = anim[animName].length;
            }
            anim[animName].speed = -1;

        }
        else
        {
            anim[animName].speed = 1;

        }
        anim.Play(animName);
        isOpen = !isOpen;
    }
}

ps:对于新版不使用Animator控制动画需进行如下设置,否则会弹出警告

The AnimationClip ‘Door‘ used by the Animation component ‘Door‘ must be marked as Legacy

在Inspector面板右上方的菜单中选择Debug模式后,勾选Legacy 

  

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringData

文档&#xff1a;D:\springdata SpringData是一个用来简化dao层开发的框架.在保证了各个底层存储特性同时,提供了一套统一的数据访问API.它可以很好的支持常用的关系型数据库和非关系型数据库. 使用SpringData做为dao层开发技术,将大大简化代码&#xff0c;而且其API比各个技…

【力扣周赛#326】6279.数组乘积中的不同质因数数目+6196.将字符串分割成值不超过K的子字符串+6280.范围内最接近的两个质数

目录 6278.统计能整除数字的位数 - 简单ac 6279.数组乘积中的不同质因数数目 - 质因数 6196.将字符串分割成值不超过K的子字符串 - 贪心 6280.范围内最接近的两个质数 - 质数筛 贪心 6278.统计能整除数字的位数 - 简单ac 6278. 统计能整除数字的位数 class Solution {pu…

aws codebuild 配置codecommit更新触发和squid正向代理

本文主要讨论如何通过监听codecommit仓库自动触发codebuild的构建&#xff0c;以及为codebuild配置正向代理 通过codecommit更新触发codebuild codecommit触发器相关 每个codecommit最多配置10个触发器 sns触发器 为sns创建lambda函数订阅&#xff0c;在lambda日志中查看s…

一个例题,了解包装类

下列代码输出什么,为什么? public class Test3 {public static void main(String[] args) {Integer a1 100;Integer a2 Integer.valueOf(100);Integer a3 new Integer(100);System.out.println(a1 a2);System.out.println(a1 a3);System.out.println(a1.equals(a3));Sys…

分离编译、类型萃取、变参模板

分离编译 一个程序由若干个源文件共同实现&#xff0c;每个源文件单独编译生成目标文件&#xff0c;最后将所有的目标文件链接起来形成单一可执行文件的过程称之为分离编译模式。模板不支持分离编译 编译器报的这种错误属于链接性错误&#xff0c;也就是当程序预处理、编译、汇…

Sutherland–Hodgman 算法介绍(简单易懂)

目录 一、算法介绍 二、算法描述 三、计算细节补充 四、算法总结 一、算法介绍 我们使用Sutherland–Hodgman算法来裁剪多边形的边&#xff0c;一般是给你一个多边形顶点序列(P1,P2,P3,P4,…Pn)让你裁剪&#xff0c;最终裁剪掉裁剪多边形的外部部分(下图黑框就是裁剪多边形…

大中型政企机构网络安全建设发展趋势研究报告

声明 本文是学习大中型政企机构网络安全建设发展趋势研究报告. 下载地址而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 研究背景 大中型政企机构是网络安全保护的重中之重&#xff0c;也是国内网络安全建设投入最大&#xff0c;应用新技术、新产品最…

Proteus8仿真:51单片机25AA020A(SPI接口EEPROM)的使用

51单片机25AA020A实验内容25AA020A引脚功能SPI信号模拟8位写8位读EEPROM读写函数EEPROM写使能EEPROM写一个Byte实验程序例程main.c工程文件Microchip的25AA020A是一个2Kbit串行电可擦除可编程只读存储器&#xff08;EEPROM&#xff09;。内存可以通过一个简单的串行外围接口&am…

第三十讲:神州路由器路由重分发配置

RIP和OSPF协议是目前应用最广泛的路由协议&#xff0c;两种协议交接的场合也很多见&#xff0c;两种协议的重分布是比较常见的配置。主校区原来所采用的网络协议为OSPF&#xff0c;而分校区采用的路由协议是RIP&#xff0c;采用RIP和OSPF重分发技术可以解决此问题。 实验拓扑图…

HDLBits练习汇总-14-时序逻辑设计测试--状态机(二)

水箱问题&#xff08;Exams/ece241 2013 q4&#xff09; 一个大水库的水为几个用户服务。为了保持足够高的水位&#xff0c;三个传感器以5英寸的间隔垂直放置。当水位高于最高传感器S3时&#xff0c;输入流量应为零。当液位低于最低传感器(Si)时&#xff0c;流量应处于最大(公…

【技术分享】戴尔工作站安装Win10+Ubuntu20.04双系统避坑指南

文章目录引言1.安装前的几个注意事项&#xff08;避坑指南&#xff09;1.1.有多块硬盘&#xff0c;该如何分配给Win10和Ubuntu系统&#xff1f;1.2.Ubuntu分区应该怎么分&#xff1f;2.系统安装步骤2.1.下载系统镜像2.2.制作U盘启动盘2.3.进入Win10系统分配系统空间2.4.BIOS设置…

82.【LibraryManger】

图书管理系统(一)、搭建环境1.数据库语句2.导入需要的依赖(二)、配置文件3.创建MyBatis的xml文件 mybais-config.xml4.创建dao层接口以及dao层的 mapper.xml5.创建数据库的资源 database.properties6.创建spring的配置文件 spring-dao.xml【】7.创建service层的接口以及servcie…

查找

章节目录&#xff1a;一、线性查找1.1 概述1.2 代码示例二、二分查找2.1 概述2.2 代码示例三、插值查找3.1 概述3.2 代码示例四、斐波那契查找4.1 概述4.2 代码示例五、结束语一、线性查找 1.1 概述 线性查找又称顺序查找&#xff0c;是一种最简单的查找方法&#xff0c;它的…

若依框架:前端登录组件与图像验证码|用户登录逻辑

在上一篇《若依框架&#xff1a;前端项目结构与初始页面渲染流程》中&#xff0c;我们探讨了与“vue.config.js文件配置、.env模式和环境变量配置、vue-router全局导航守卫配置、vue-router路由配置简介”相关的内容&#xff0c;书接上回&#xff0c;我们继续探讨若依前端项目的…

【C语言进阶】字符函数与字符串函数

目录 1、函数介绍 1.1 strlen 1.2 strcpy 1.3 strcat 1.4 strcmp 1.5 strncpy 1.6 strncat 1.7 strncmp 1.8 strstr 1.9 strtok 1.10 strerror 【补】字符分类函数&#xff1a; 1.11 memcpy 1.12 memmove 1.13 memcmp 1.14 memset 1、函数介绍 1.1 strlen siz…

基于卷积神经网络的高光谱分类(1D、2D、3D-CNN)

算法原理 卷积神经网络&#xff08;Convolutional Neural Networks&#xff0c;CNN&#xff09;是深度学习中最常见的一种 算法&#xff0c;它具有强大的特征学习能力。CNN 通过结合局部感知区域、共享权重、空间或者 时间上的降采样来充分利用数据本身包含的局部性等特征&…

绘图仪 与 示波器 Plotter Oscilloscope

【后台管理&#xff0c;这哪里是广告了&#xff1f;图都是百度搜的&#xff0c;又没有销售信息&#xff0c;就事论事而已&#xff01;】 Plotter &#xff1a; 对低频信号持续测量并绘制到一张很长的纸上&#xff0c;通常是卷纸。 常见的比如传统心电图机&#xff08;图左&am…

『分分钟玩转VueRouter●下』我对VueRouter在项目中如何使用的理解

路由的设置会根据系统中用户角色的数量而有所不同&#xff0c;大致分为三种单角色同权限、单角色不同权限、多角色。这里的角色均是只一种身份&#xff0c;而不是用户量。接下来的讲解纯属个人见解&#xff0c;大型项目会将不同权限的用户直接分开开发不同的系统。如果是小型多…

c++基础——for循环

for循环是循环的一种 以下是 for 循环的结构&#xff1a; for (初始化; 判断条件; 更新) {循环体; } 执行顺序&#xff1a; for 语句的三个部分中&#xff0c;任何一个部分都可以省略。其中&#xff0c;若省略了判断条件&#xff0c;相当于判断条件永远为真。 for (int i …

fpga实操训练(从模块到系统开发)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们学习了fpga的一些基本操作&#xff0c;熟悉了这些操作&#xff0c;基本上说fpga已经入门了。但是距离我们用fpga开发产品&#xff0c;这中…