Unity笔记(二)——Time、Vector3、位置位移、角度、旋转、缩放、看向

写在前面

写本系列的目的(自用)是回顾已经学过的知识、记录新学习的知识或是记录心得理解,方便自己以后快速复习,减少遗忘。这里只有部分语法知识。

五、Time时间相关

1、时间缩放比例

概念:可以通过UnityEngine.Time类的timeScale属性控制游戏时间流速

用法:暂停时间: 设置Time.timeScale = 0

           正常速度: 设置Time.timeScale = 1(默认值)

           倍速播放: 设置Time.timeScale = nn>1时为n倍速,如2表示两倍速)

应用场景:游戏暂停功能实现、​​​​​​​过场动画的慢动作/快进效果​​​​​​​、技能冷却时间加速/减速。

2、帧间隔时间

概念:帧间隔时间指最近⼀帧完成⼀次游戏循环所⽤的时间,单位是秒。游戏本质是死循环,⼀帧即⼀次循环执⾏。

用法:​​​​​​​通过Time.deltaTime获取受时间缩放影响的帧间隔时间,Time.unscaledDeltaTime获取不受影响的帧间隔时间。

其中,受影响的帧间隔时间 = 不受影响的帧间隔时间*缩放比例timeScale。不受scale影响的帧间隔时间始终返回实际帧间隔时间。如下例:

public class time : MonoBehaviour
{void Update(){//Time.timeScale = 0;//Time.timeScale = 1;Time.timeScale = 2;print("帧间隔:"+Time.deltaTime);print("不受影响帧间隔:"+Time.unscaledDeltaTime);}
}

输出: 

作用: 

(1)实现位移计算:​​​​​​​基于物理公式路程 = 时间 × 速度,在Update()中每帧⽤Time.deltaTime参与计算实现平滑移动。

(2)选择是否跟随游戏静止:​​​​​​​需要随游戏暂停停⽌移动:使⽤Time.deltaTime、​​​​​​​需要⽆视游戏暂停继续移动:使⽤Time.unscaledDeltaTime

(3)加速原理:timeScale=2时,受影响的帧间隔时间值变为实际值×2,导致位移计算量倍增,表现为2倍速效果。

3、游戏开始到现在的时间

Time.time:​​​​​​​timeScale影响的游戏运⾏时间

Time.unscaledtime:不受timeScale​​​​​​​影响的真实运⾏时间

print("游戏时间" + Time.time);

应用:主要用于单机游戏计时,网络游戏一般使用服务器时间。

4、 物理帧间隔时间

(1)物理帧间隔时间和帧间隔时间的区别

物理帧间隔时间:指 Unity物理引擎(如刚体运动、碰撞检测、关节模拟)的更新间隔时间,用于保证物理模拟的一致性和稳定性。

帧间隔时间:指渲染帧(游戏画面更新)之间的时间差,即一帧渲染完成到下一帧开始渲染的间隔。

(2)物理帧间隔时间

物理帧间隔时间是固定的,可以通过​​​​​​​EditProject SettingsTime设置Fixed Timestep值。默认值为0.02秒(50Hz)

获取方法:

    void Update(){Time.timeScale = 2;}private void FixedUpdate(){print("物理帧间隔" + Time.fixedDeltaTime);print("不受scale影响" + Time.fixedUnscaledDeltaTime);}

 5、帧数

​​​​​​​概念:帧数表示从游戏开始到现在运⾏的循环次数,⼀帧即⼀次游戏循环。Unity底层只有⼀个主循环,不同脚本中的Update⽅法都在同⼀帧中按顺序执⾏。

获取方法:​​​​​​​通过Time.frameCount静态属性获取,该属性返回int类型值,记录当前累计帧数。

print(Time.frameCount);

六、 Vector3基础、位置位移

transform:​​​​​​​游戏对象的位移、旋转、缩放等操作都由Transform组件处理,是Unity中极其重要的类

vector3主要用于表示三维坐标系中的点和向量

1、Vector3

(1)Vector3的声明

vector3的声明可以采用无参构造、有参构造。vector3可以不new直接赋值。

    void Start(){Vector3 v = new Vector3();v.x = 10;v.y = 10;v.z = 10;//当参数不满3个时,没有传入的参数默认为0Vector3 v1 = new Vector3(10, 10);Vector3 v2 = new Vector3(10, 10, 10);Vector3 v3;v3.x = 10;v3.y = 10;v3.z = 10;}

需要注意的是,当使用有参构造时,若传入的参数不足三个,没传入的参数默认为0。

(2)Vector3的运算

+ - * / 都有

void Start()
{Vector3 v4 = new Vector3(1, 1, 1);Vector3 v5 = new Vector3(2, 2, 2);print(v4 * 10);print(v5 / 2);print(v4 + v5);
}

输出如下:

(3)常用静态属性与方法

Vector3有一些常用静态属性,可以生成特殊的向量

void Start()
{print(Vector3.zero);//000print(Vector3.right);//100print(Vector3.left);//-100print(Vector3.forward);//001print(Vector3.back);//00-1print(Vector3.up);//010print(Vector3.down);//0-10
}

结果是:

 Vecotr3的常用方法可以直接计算两个点之间的距离:

void Start()
{Vector3 v4 = new Vector3(1, 1, 1);Vector3 v5 = new Vector3(2, 2, 2);print(Vector3.Distance(v4, v5));
}

 2、位置

(1)相对于世界坐标系的位置

位置获取:通过this.transform.position获取当前脚本挂载的对象相对于世界坐标系原点的位置

由于面板里显示的对象位置与父对象有关,所以如果当前对象有父对象且​​​​​​​父对象位置不在原点,⾯板显示的位置与transform.position获取的值会不同。当父对象的位置在原点000时,相同。

此时没有父对象:

    void Start(){this.transform.position = new Vector3(10, 10, 10);print(this.transform.position);}

运行前后的面板及控制台输出:

当有父对象时,由于面板显示的是子对象相对父对象的位置坐标,就会与输出结果(世界坐标产生差异),所以也可以直接输出相对父对象的位置坐标。 

(2)相对父对象的位置

位置获取:使⽤this.transform.localPosition获取相对于⽗对象的位置

这样,localPosition始终与Inspector面板显示的位置一致。

    void Start(){print(this.transform.position);print(this.transform.localPosition);}

(3)对象的位置修改、朝向获取

对象的朝向获取可以采用之前提到的Vector3.up、Vector3.forward等。例如:

print(this.transform.forward);
print(this.transform.up);

这里分别打印的是对象的面朝向和头顶朝向。 

若是要对对象的x、y、z轴进行修改,需要统一修改,不能单独修改其中一个坐标的值,除非采用整体赋值。

    void Start(){this.transform.localPosition = Vector3.up * 10;print(this.transform.localPosition);//若是想改变单一坐标轴this.transform.localPosition = new Vector3(10, this.transform.localPosition.y, this.transform.localPosition.z);print(this.transform.localPosition);//还可以整体修改Vector3 vt = this.transform.localPosition;vt.x = 0;this.transform.localPosition = vt;print(this.transform.localPosition);}

结果为:

3、位移

在坐标系下,位移的核心公式为:路程=方向 × 速度 × 时间,适⽤于所有维度坐标系。类似于数学里的,向量以及向量在每个坐标轴上的分量。

位移可以自己计算以及利用API计算。

(1)自己计算位移

自己计算位移严格遵循核心方式:路程=方向×速度×时间即可。由于运动与帧相关,因此写在upDate函数中。

其中,方向传入的是Vector3向量。位移方向有两种:相对于自身的坐标系、相对于世界的坐标系。如果要相对于自身,就可以使用this.transform.方向。需要相对于世界就直接传入对应的Vector3向量,例如Vector3.right。

速度写入一个数字即可,时间可以使用Time.deltaTime保证帧率无关的平滑运动。如下:

    void Update(){//相对于对象自身的坐标系的x轴正方向移动this.transform.position += this.transform.right * 1 * Time.deltaTime;//相对于世界坐标系的x轴正方向移动this.transform.position += Vector3.right * 1 * Time.deltaTime;}

(2)使用API位移

使用transform.Translate方法。常用的重载方法是:​​​​​​​

Translate(Vector3 translation)、​​​​​​​Translate(Vector3 translation, Space relativeTo)

其中第一个参数是位移向量,计算公式为路程 = 方向 × 速度 × 时间;第二个参数是相对坐标系(默认Space.Self)。

其中,参数为Space.Self时表示相对于物体自身坐标系,为Space.World表示相对于世界坐标系。

    void Update(){//1、相对于世界坐标系,朝向z轴世界坐标系的正方向this.transform.Translate(Vector3.forward * 1 * Time.deltaTime, Space.World);//2、相对于世界坐标系,自己的面朝向去动this.transform.Translate(this.transform.forward * 1 * Time.deltaTime, Space.World);//3、相对于自己坐标系的自己的面的z方向动 (基本不使用)this.transform.Translate(this.transform.forward * 1 * Time.deltaTime, Space.Self);//4、相对于自己的坐标系下 z轴正方向移动this.transform.Translate(Vector3.forward * 1 * Time.deltaTime, Space.Self);}

七、角度和旋转

1、角度

角度同样有两种,相对世界坐标系的角度和相对父对象的角度。角度采用的方法是transform.eulerAngles。

    void Start(){//打印相对世界坐标的角度print(this.transform.eulerAngles);//打印父对象的角度print(this.transform.localEulerAngles);}

打印结果:

 修改角度的方式与修改位置的方式一样,必须同时设置x,y,z三个方向,不能单独修改某一方向。

this.transform.localEulerAngles = Vector3.zero;

2、旋转

旋转分为自传和公转(绕某个点或某个对象旋转)

(1)自转

自转使用Unity自带的API,transform.Rotate,这个方法常用的有两种形式:两参数形式和三参数形式。

以下例子的第一句就是两参数形式,两个参数分别为:指定每个轴具体转多少度、坐标系选择(世界or自己,默认为自己)

第二句是三个参数,三个参数分别为:旋转轴方向(常用Vector3.up/right/forward)、旋转角度、坐标系选择(世界or自己,默认为自己)

    void Update(){this.transform.Rotate(new Vector3(0, 10, 0) * Time.deltaTime,Space.World);this.transform.Rotate(Vector3.right, 10 * Time.deltaTime);}

(2)绕着点转

绕着点转使用的是函数transform.RotateAround(),会传入三个参数:旋转中心点、旋转轴方向、旋转角度

void Update()
{transform.RotateAround(Vector3.zero,Vector3.up,10*Time.deltaTime);
}

运行时,当前对象会绕着000点公转:

八、缩放和看向 

1、缩放

(1)两种缩放

缩放同样有两种,相对世界坐标系进行缩放和相对父对象进行缩放,其中

使⽤this.transform.lossyScale获取相对于世界坐标系的缩放值;

使⽤this.transform.localScale获取相对于⽗对象的缩放值。

例子中,父对象的缩放值为2,2,2;当前对象(子对象)的缩放值为1,1,1。由于inspector面板显示的是相对于父对象的缩放值,因此此时子对象相对世界坐标的缩放值也应该是2,2,2。

    void Start(){print(this.transform.lossyScale);print(this.transform.localScale);}

结果是: 

(2)缩放的修改 

关于缩放的修改。对于相对于世界坐标系的缩放值只能获取不能修改,而相对于父对象的可以修改,也只能同时修改x、y、z,不能单独修改。

this.transform.localScale = new Vector3(3, 3, 3);

可以在UpDate函数中实现随时间渐变缩放:

    void Update(){this.transform.localScale += Vector3.one * Time.deltaTime;}

2、看向

看向是指定当前对象看向一个点或者一个对象,使用this.transform.LookAt(),里面传入该点的位置信息。

(1)看向一个点

    void Update(){this.transform.LookAt(Vector3.zero);}

结果:

(2)看向一个对象

需要在this.transform.LookAt()中传入对应向量的transform信息。

public class Scale_cube : MonoBehaviour
{public GameObject lookAtObj;void Update(){this.transform.LookAt(lookAtObj.transform);}
}

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

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

相关文章

vue+vite项目中怎么定义一个环境变量可以在开发环境和生产环境使用不同的值,并且可以在vue页面和index.html通用。

首先我们需要下载一个插件vite-plugin-html然后再项目最外层和index.html同级目录下新建.env.development和.env.production两个项目并且定义你想要的环境变量名:注意要以VITE_开头VITE_APP_MAP_TOKEN1233444然后vite.config.js文件import { defineConfig,loadEnv } from vite…

Python-深度学习--2信息熵,条件熵(ID3决策树),KL散度

一、信息熵(Entropy)的计算与应用信息熵用于衡量一个概率分布的不确定性,值越大表示分布越分散(不确定性越高)。1. 数学定义对于离散概率分布 P,信息熵公式为:(通常以 2 为底单位是比…

国产化Word处理控件Spire.Doc教程:Python提取Word文档中的文本、图片、表格等

在现代办公场景中,Word文档已成为信息存储与交流的重要载体,承载着关键的业务数据、结构化表格、可视化图表以及协作批注等重要内容。面对日益增长的文档处理需求,传统的人工操作方式已难以满足效率与准确性的双重标准。采用Python实现Word文…

Spring IOC 原理

Spring IoC(控制反转)是Spring框架的核心机制,其原理是通过容器管理对象生命周期和依赖关系,实现解耦。 1. 控制反转(IoC)核心思想 传统模式:对象主动创建依赖(如new Service()&…

VSCode:基础使用 / 使用积累

官网 Visual Studio Code - Code Editing. Redefined 记录一、更新依赖 尝试删除yarn.lock文件 记录二、“解决冲突”的方式变了 更新后,“解决冲突”的方式变了,有的时候能选中两者,有的时候不能 现在又更新了,回复到了原来…

tcp 确认应答和超时时间

1. 确认应答之间的时间(RTT)这是指 从发送方发送数据到接收方返回确认(ACK)之间的时间。它反映的是数据传输的 往返延迟。例如,发送方发送一个数据包,接收方收到后,回传一个确认包(A…

图的应用-最短路径

最短路径的典型用途:交通网络的问题——从甲地到乙地之间是否有公路连通?在有多条通路的情况下,哪一条路最短?交通网络用有向网来表示:顶点——表示地点,弧——表示两个地点有路连通,弧上的权值…

【qt5_study】1.Hello world

模板 作为初学者我们选择第一个Application(Qt)和 Qt Widgets Application,所谓的模板就是 Qt为了方便开发程序,在新建工程时可以让用户基于一种模板来编写程序,包括 cpp文件, ui文件都已经快速的创建,而不用用户手动创建这些文件。 基类 这里默认选择的基类为 QMainWin…

项目构想|文生图小程序

Date: August 4, 2025项目介绍 👋,我们通过 Vibe Coding 做一个文字生成图片的小程序。 我们会从需求分析、技术选型、UI设计、项目构筑到最后打包,一路尝试 Vibe Coding 实现。 创建项目 创建文件夹:ai-pic-mini-app 采用 Git 进…

TiDB/MongoDB/Taosdb存储引擎概览

数据库类型存储引擎数据结构源码位置tidbRockDBLSM树https://github.com/facebook/rocksdbmongodbWiredTigerB 树/LSM树https://github.com/wiredtiger/wiredtigerTDengineTSDBBRINhttps://github.com/taosdata/TDengine 1、tidb存储引擎概览 LSM树数据结构描述LSM树(Log Str…

qt窗口--01

文章目录qt窗口--01窗口概览菜单栏工具栏状态栏浮动窗口子窗口对话框model结语很高兴和大家见面,给生活加点impetus!!开启今天的编程之路!! 作者:٩( ‘ω’ )و260 我的专栏:qt,Li…

Neo4j 社区版 Mac 安装教程

最近用到了nebulagraph图数据库做金融反欺诈项目,虽然nebula属于分布式架构,但依然感觉nebula使用不太顺手,这里顺便研究一下neo4j这款数据库如何,这里先从安装开始? 一、 准备工作 确认 Java 版本要求: N…

Android Studio(2025.1.2)Gemini Agent 使用指南

Android Studio(2025.1.2)Gemini Agent 使用指南 文章目录Android Studio(2025.1.2)Gemini Agent 使用指南1. 什么是 Gemini Agent?2. 如何启用和配置 Gemini Agent2.1 获取 API Key2.2 在 Android Studio 中配置3. 实…

计算机视觉--opencv(代码详细教程)

在计算机视觉的广袤领域中,OpenCV 是一座极为关键的里程碑。无论是在前沿的学术研究,还是在蓬勃发展的工业界,OpenCV 凭借其强大的功能与高效的性能,为开发者提供了丰富的图像处理和计算机视觉算法,助力无数项目落地。…

Centos6停止服务后yum改用阿里云

环境: OS:Centos 6.9 1.进入到yum配置目录 cd /etc/yum.repos.d 2.备份 cp CentOS-Base.repo CentOS-Base.repo.bk 3.下载 wget -O CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-6.repo 问题1: 因为Centos-6早就停止了更新维护,阿里云镜像网站将其仓库…

putty+Xming(XLaunch) 远程登录VirtualBox中的Ubuntu24.04,显示图形化(GUI)界面

测试环境:VirtualBox 7,Ubuntu24.04 desktop,Ubuntu24.04 Server(no desktop),均测试成功。 一、先测试putty远程登录VirtualBox中的Ubuntu,可以使用ssh、Telnet 等协议。参见拙文《ssh连接VirtualBox中的Ubuntu24.04(win11、put…

SpringBoot微头条实战项目

一、项目概述 微头条是一个基于现代技术栈构建的新闻发布和浏览平台,旨在为用户提供便捷的新闻阅读体验和高效的新闻管理功能。该项目通过前后端分离的架构设计,实现了用户注册、登录、新闻浏览、搜索、发布、修改和删除等功能,同时通过JWT技…

如何给电脑换个ip地址?电脑换ip几种方法

更换电脑的IP地址的方法取决于你的具体需求和网络环境(是换本地局域网IP还是换对外公网IP)。以下是几种常见的方法: 一、更换本地局域网IP地址(在同一个网络内) 这个IP地址通常由你的路由器(或公司的网络管…

Pytest项目_day04(Python做接口请求)

Requests包 在python中,可以使用requests包,用于做接口请求和接口测试request支持http和https简单的get函数调用如下:r.jsonr.status_coder.textget函数的带params用法post函数的带params用法 post也可以和get一样在url中传入参数在requests包…

Flink与Kafka核心源码详解-目录

Flink是Apache软件基金会下开源的分布式流批一体计算框架,具备实时流计算和高吞吐批处理计算的大数据计算能力。本专栏内容为Flink源码解析的记录与分享。 本文解析的Flink源码版本为:flink-1.19.0 以下为Flink-1.19.0-完整源码详解的目录导航。 Flink-…