第十九章 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知识系统分享》专栏,笔者用重金(时间和精力)打造,基础知识一网打尽,…...

Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...

React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...

CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...

新版NANO下载烧录过程
一、序言 搭建 Jetson 系列产品烧录系统的环境需要在电脑主机上安装 Ubuntu 系统。此处使用 18.04 LTS。 二、环境搭建 1、安装库 $ sudo apt-get install qemu-user-static$ sudo apt-get install python 搭建环境的过程需要这个应用库来将某些 NVIDIA 软件组件安装到 Je…...

react-pdf(pdfjs-dist)如何兼容老浏览器(chrome 49)
之前都是使用react-pdf来渲染pdf文件,这次有个需求是要兼容xp环境,xp上chrome最高支持到49,虽然说iframe或者embed都可以实现预览pdf,但为了后续的定制化需求,还是需要使用js库来渲染。 chrome 49测试环境 能用的测试…...

【Zephyr 系列 16】构建 BLE + LoRa 协同通信系统:网关转发与混合调度实战
🧠关键词:Zephyr、BLE、LoRa、混合通信、事件驱动、网关中继、低功耗调度 📌面向读者:希望将 BLE 和 LoRa 结合应用于资产追踪、环境监测、远程数据采集等场景的开发者 📊篇幅预计:5300+ 字 🧭 背景与需求 在许多 IoT 项目中,单一通信方式往往难以兼顾近场数据采集…...