当前位置: 首页 > news >正文

第十九章 Unity 其他 API

本节介绍一些其他经常使用的Unity类。首先,我们回顾一下Vector3向量类,它既可以表示方向,也可以表示大小。它在游戏中可以用来表示角色的位置,物体的移动/旋转,设置两个游戏对象之间的距离。在我们之前的课程中,我们讲过向量的一些运算。例如向量的加法可以表示两个方向的最终移动效果,向量的减法可以获取一个游戏对象到另一个游戏对象的方向和距离(注意减数和被减数的位置不同将导致向量的方向不同)。在制作游戏过程中,有时候只需要知道向量的方向而不需要知道向量的大小,这时候常常使用单位向量来表示方向。我们把一个向量转换为单位向量的过程叫做单位化或者标准化,或者归一化。

关于旋转,在Unity中虽然可以使用Vector3向量实现,但是更多的是使用Quaternion四元数类,它用来描述从一个方向到另一个方向的相对旋转。下面介绍四元数的一些常用方法:

Quaternion.LookRotation        使用指定的 forward 和 upwards 方向创建旋转四元数。
Quaternion.Angle                     返回两个旋转 a 和 b 之间的角度(以度为单位)。
Quaternion.AngleAxis             创建一个围绕 axis 旋转 angle 度的旋转四元数。
Quaternion.FromToRotation   创建一个从 fromDirection 到 toDirection 的旋转四元数。
Quaternion.RotateTowards     将旋转 from 向 to 旋转。
Quaternion.Slerp             在四元数 a 与 b 之间按比率 t 进行球形插值。参数 t 限制在范围 [0, 1] 内。这可用于创建一个旋转,以基于参数的值 a,在第一个四元数 a 到第二个四元数 b 之间平滑进行插值。如果参数t的值接近于 0,则输出会接近于 a,如果参数的值接近于 1,则输出会接近于 b。
Quaternion.Lerp                在 a 和 b 之间插入 t,然后对结果进行标准化处理。参数 t 被限制在 [0, 1] 范围内。该方法与上面的 Slerp 方法很类似。两者区别在于前者是球形插值(或者称之为弧形插值),后者则是线性插值。球形差值得到的数值更加的均匀,旋转效果会更加的平滑,但是计算量比线性大一些。

 

另外还有两个变量经常使用,如下所示:

identity                 单位旋转(只读)。
eulerAngles        返回或设置旋转的欧拉角表示。

 

接下来,我们使用Quaternion.LookRotation方法进行旋转。首先我们需要创建一个新的场景“SampleScene9”,然后创建一个Cube和两个Sphere,他们的位置如下所示

Cube的位置参数如下

Sphere1的位置参数如下

Sphere2的位置信息如下

接下来,我们稍微调整一下相机的位置,让我们能够清晰的看到三个游戏对象。

接下来,我们保持相机选中状态,我们点击菜单栏“GameObject”->“Align View to Selected”

接下来,我们新建“CubeQuaternion.cs”脚本文件,并附加到Cube上面。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class CubeQuaternion : MonoBehaviour
{// 两个Sphere游戏对象private GameObject sphere1, sphere2;// Start is called before the first frame updatevoid Start(){sphere1 = GameObject.Find("Sphere1");sphere2 = GameObject.Find("Sphere2");}// Update is called once per framevoid Update(){// 按下数字1键,朝向 Sphere1 旋转if (Input.GetKey(KeyCode.Alpha1)){//Debug.Log("按下数字1键,朝向 Sphere1 旋转");Vector3 dir = sphere1.transform.position - transform.position;transform.rotation = Quaternion.LookRotation(dir, Vector3.up);}// 按下数字2键,朝向 Sphere2 旋转if (Input.GetKey(KeyCode.Alpha2)){//Debug.Log("按下数字2键,朝向 Sphere2 旋转");Vector3 dir = sphere2.transform.position - transform.position;transform.rotation = Quaternion.LookRotation(dir, Vector3.up);}}
}

上面的代码,我们就不过多解释了。我们直接Play运行工程查看效果。

我们首先按“1”键查看效果

我们发现Cube确实旋转了45度,从Inspector检视面板中的Y旋转值也可以看到-45度。

接下来,我们继续按下“2”键查看效果

我们发现Cube并没有旋转,但是Inspector检视面板中的Y旋转值确实改变成了45度。为了能够看到旋转的过程,我们使用Quaternion.Lerp方法来进行缓慢的旋转,代码修改

        // 按下数字1键,朝向 Sphere1 旋转if (Input.GetKey(KeyCode.Alpha1)){//Debug.Log("按下数字1键,朝向 Sphere1 旋转");Vector3 dir = sphere1.transform.position - transform.position;//transform.rotation = Quaternion.LookRotation(dir, Vector3.up);Quaternion lookDir = Quaternion.LookRotation(dir, Vector3.up);transform.rotation = Quaternion.Lerp(transform.rotation, lookDir, 1.0f * Time.deltaTime);}// 按下数字2键,朝向 Sphere2 旋转if (Input.GetKey(KeyCode.Alpha2)){//Debug.Log("按下数字2键,朝向 Sphere2 旋转");Vector3 dir = sphere2.transform.position - transform.position;//transform.rotation = Quaternion.LookRotation(dir, Vector3.up);Quaternion lookDir = Quaternion.LookRotation(dir, Vector3.up);transform.rotation = Quaternion.Lerp(transform.rotation, lookDir, 1.0f * Time.deltaTime);}

接下来,我们Play工程,查看运行效果,测试的时候要长按数字键哦。

现在的效果就非常明显了吧。

接下来我们介绍Time类,它提供了几个静态变量供我们使用。

deltaTime                        完成上一帧所用的时间(以秒为单位)(只读)。
fixedTime                        最近一次 FixedUpdate 已启动的时间(只读)。
frameCount                     已经过的总帧数(只读)。
realtimeSinceStartup    游戏开始以来的实际时间(只读)。不受 Time.timeScale 的影响。
timeScale                        时间流逝的标度。可用于慢动作效果。
time                                  此为自游戏启动以来的时间(以秒为单位)。

当 timeScale 为 1.0 时,时间流逝的速度与实时一样快。 当 timeScale 为 0.5 时,时间流逝的速度比实时慢 2x。当 timeScale 设置为 0 时,如果您的所有函数都是独立于帧率的, 则游戏基本上处于暂停状态(我们经常使用这个方式来暂定游戏)。timeScale 影响 Time 类的所有时间和增量时间测量变量(但 realtimeSinceStartup 和 fixedDeltaTime 除外)。如果您减小了timeScale,建议也将 Time.fixedDeltaTime 减小相同的量。当timeScale设置为0时,不会调用 FixedUpdate 函数。

接下来,我们在介绍Mathf类,里面包括了一些数学函数。

Abs       求绝对值
Ceil       向上取整
Floor     向下取整
Round  四舍五入
Cos       求余弦
Sin        求正弦
Tan        求正切
Lerp      在 a 与 b 之间按 t 进行线性插值。
Max      取最大值
Min       取最小值
Sqrt       开平方

 

接下来,我们在介绍Random类,提供简便的方法来生成各种常用类型的随机值。

Random.value 返回一个随机浮点数,范围在 0.0 和 1.0 之间。一种常见的用法是将返回结果乘以所选范围,从而将其转换为介于 0 和该范围之间的数。
Random.Range 返回一个介于所提供的最小值和最大值之间的数。它返回整数或浮点数,具体取决于提供的最小值和最大值是整数还是浮点数。
Random.insideUnitCircle 返回一个半径为 1 的圆内随机选择的圆内点。
Random.insideUnitSphere 返回一个半径为 1 的球内随机选择的球内点。
Random.onUnitSphere 返回一个半径为 1 的球上随机选择的球体的球面点。

接下来在介绍Application类的常用属性和方法

dataPath                          游戏数据文件夹路径
persistentDataPath        持久化游戏数据文件夹路径
streamingAssetsPath    StreamAssets文件夹路径
temporaryCachePath    临时文件夹路径
runInBackground           控制在后台时是否运行
OpenURL                        打开一个URL
Quit                                   退出

接下来介绍Scene常用属性:

buildIndex                     返回场景在Build Settings中的索引
isLoaded                       返回场景是否已经加载
name                               返回场景名称
path                                 场景的相对路径
GetRootGameObject    返回场景中所有根游戏对象

还有Scene常用方法:

sceneCount                    当前已加载场景的数量
CreateScene                  创建一个场景
GetActiveScene             获取当前激活场景
GetSceneByName        根据名称返回已加载的场景
LoadScene                     加载场景
LoadSceneAsync          异步加载场景
SetActiveScene             激活场景
UnloadSceneAsync      移除并销毁场景

Debug 类用于可视化编辑器中的信息,这些信息可以帮助您了解或调查项目运行时发生的情况。使用该类在控制台窗口中打印消息,在 Scene 视图和 Game 视图中绘制可视化线条,以及在编辑器中从脚本暂停运行模式。Unity 本身有时会将错误、警告和消息记录到控制台窗口。Debug 类使您能够从您自己的代码中执行完全相同的操作,如下所示:

Debug.Log("白色字体");
Debug.LogWarning("黄色字体");
Debug.LogError("红色字体");
三种类型(错误、警告和消息)在控制台窗口中都有自己的图标类型。
Debug 类还提供了两种在 Scene 视图和 Game 视图中绘制线条的方法。
Debug可以画线段和射线:DrawLine 和 DrawRay。
Debug.DrawLine(开始点,结束点,颜色);
Debug.DrawLine(new Vector3(0,0,0), new Vector3(0,10,0), Color.red);
Debug.DrawRay(开始点,方向向量,颜色);
Debyg.DrayRay(new Vector(0,0,0), new Vector3(10,0,0), Color.blue);

相关文章:

第十九章 Unity 其他 API

本节介绍一些其他经常使用的Unity类。首先,我们回顾一下Vector3向量类,它既可以表示方向,也可以表示大小。它在游戏中可以用来表示角色的位置,物体的移动/旋转,设置两个游戏对象之间的距离。在我们之前的课程中&#x…...

sha256算法详解,用C语言模拟sha256算法

SHA-256是一种加密算法,它可以将任意长度的数据块计算出一个固定长度的输出值,通常是256位。SHA-256具有以下特点: 1. 固定输出长度:SHA-256的输出长度为256位,不受输入数据的长度限制。 2. 不可逆性:SHA-256采用单向哈希函数,即无法从输出值反向推出输入数据。 3. 抗…...

前端技术未来发展展望

前端技术在未来的发展中将继续保持快速、变化多样和创新性强的趋势。以下是我认为前端技术未来发展的几个方向: 框架和库的演进:框架和库的更新换代将继续加速。React、Vue、Angular等主流框架的更新周期将会缩短,同时各自的生态系统也将更加…...

第四十六天|dp

今天的题还是完全背包的题 139. Word Break 这道题其实用deque也能做,但是需要cache去记录之前尝试过的值,.相对简单的办法就是用完全背包了 这道题worddict就是物品.我们的dp[i]代表到i为止是不是能满足题意分成segmentation 处置化全为false,但是dp[0]True.这是因为为0时…...

汇编语言-复习自用

本文用于自我复习汇编语言,参考b站一位老师的讲解整理而成,感谢老师的无私付出视频链接链接 文章目录 1.第一章1.1计算机组成1.2读取1.3 寄存器及数据存储1.4 mov和and指令1.5 确定物理地址1.6 内存分段表示法1.7debug使用1.8CS:IP1.9jmp指令改变csip1.1…...

Android moneky自动点击应用设想

近期又有人发错私密消息到群聊天里,造成巨大反应的事件,可谓是一失手成大恨,名利受损。 而如果手机里安装一个monkey自动点击程序,没事的时候,跑跑monkey,倒一杯茶,静静的看手机屏幕在那里点击&…...

16.基于主从博弈理论的共享储能与综合能源微网优化运行研究

说明书 MATLAB代码:基于主从博弈理论的共享储能与综合能源微网优化运行研究 关键词:主从博弈 共享储能 综合能源微网 优化调度 参考文档:《基于主从博弈理论的共享储能与综合能源微网优化运行研究》完全复现 仿真平台:MATLAB …...

使用 ESP32 设计智能手表第 2 部分 - 环境光和心率传感器

我们研究了如何为我们的智能手表项目制作一些有趣的表盘。在这一部分中,我们将研究如何将一些传感器连接到我们的智能手表,并将连接 BH1750 环境光传感器和 MAX30102 心率传感器。我们将分别研究这些模块中的每一个的接口。 先决条件——安装必要的库 本文下方提供的 GitHub …...

分布式事务 --- 理论基础、Seata架构、部署

一、分布式事务问题 1.1、本地事务 本地事务,也就是传统的单机事务。在传统数据库事务中,必须要满足四个原则: 1.2、分布式事务 分布式事务,就是指不是在单个服务或单个数据库架构下,产生的事务,例如&am…...

低代码开发重要工具:JVS列表页字段样式配置说明

列表页中,通常存在各种各样的样式控制,例如字段宽度需要可调、字段的颜色根据内容变化等,那么我们接下来介绍下字段的样式控制的内容以及对应的效果。 1、字段样式控制配置位置 进入列表页的 数据配置界面,每个字段可以有独立的配…...

explain结果字段分析

select_type simple:表示不需要union操作或者不包含子查询的简单select语句。有连接查询时,外层的查询为simple且只有一个。 primary:一个需要union操作或者含有子查询的select,位于最外层的单位查询的select_type即为primary且只…...

MySQL连接查询

MySQL连接查询 在多表联合查询时,为了减少查询的次数,使用连接查询可以一次查询多个相关联表的数据。 MySQL连接查询:分为内连接查询和外连接查询。 其中外连接查询又分成 left连接查询 和 right连接查询。 下午为两张数据库表,表…...

7. Docker——Dockerfile

本章讲解知识点 DockerfileDockerfile 常用命令Dockerfile 综合示例Docker Compose当我们理解了镜像的基本原理后,我们就可以开始 Dockerfile 的学习了。 1. Dockerfile Dockerfile 是用于构建 Docker 镜像的脚本。它包含一组指令,按顺序执行以创建 Docker 镜像,从而使其可…...

Input事件在应用中的传递(一)

Input事件在应用中的传递(一) hongxi.zhu 2023-4-25 前面我们已经梳理了input事件在native层的传递,这一篇我们接着探索input事件在应用中的传递与处理,我们将按键事件和触摸事件分开梳理,这一篇就只涉及按键事件。 一、事件的接收 从前面的…...

我在VScode学Java(Java一维数组)

我的个人博客主页:如果\真能转义1️⃣说1️⃣的博客主页 关于Java基本语法学习---->可以参考我的这篇博客:(我在Vscode学Java) 我在VScode学Java(Java一维数组) Java 一维数组 声明数组:先声明,后使用 动态分配内…...

不能使用chatGPT?这3个平替甚至比chatGPT更强

不能使用chatGPT?这3个平替甚至比chatGPT更强 chatGPT,一款由OpenAI开发的新型AI聊天机器人,正在势如破竹地改变着许多人的工作和生活方式。作为一款基于大语言模型的聊天机器人,chatGPT能够理解自然语言并进行人机对话。与传统的…...

基于SLM调制器,MIT研发高效率全息显示方案

此前,青亭网曾报道过NVIDIA、三星、剑桥大学等对空间光调制器(SLM)全息方案的探索。空间光调制器可调节光波的空间分布,在电驱动信号控制下,可改变光在空间中传播的振幅、强度、相位、偏振态等特性,从而形成…...

【Docker】镜像与docker数据卷

文章目录 一、镜像1、镜像2、镜像原理之联合文件系统3、镜像原理之分层4、commit镜像 二、数据卷1、数据卷2、-v使用数据卷3、实战:MySQL 同步数据4、docker volume相关指令5、匿名和具名挂载6、数据卷之Dockerfile7、数据卷容器 一、镜像 1、镜像 镜像是一种轻量级…...

机器学习小结之KNN算法

文章目录 前言一、概念1.1 机器学习基本概念1.2 k 值1.3 距离度量1.4 加权方式 二、实现2.1 手写实现2.2 调库 Scikit-learn2.3 测试自己的数据 三、总结3.1 分析3.2 KNN 优缺点 参考 前言 ​ KNN (K-Nearest Neighbor)算法是一种最简单,也是一个很实用的机器学习的…...

函函函函函函函函函函函数——two

🤩本文作者:大家好,我是paperjie,感谢你阅读本文,欢迎一建三连哦。 🥰内容专栏:这里是《C知识系统分享》专栏,笔者用重金(时间和精力)打造,基础知识一网打尽,…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...

【kafka】Golang实现分布式Masscan任务调度系统

要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制

使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...

iview框架主题色的应用

1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...