第十九章 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知识系统分享》专栏,笔者用重金(时间和精力)打造,基础知识一网打尽,…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...
ubuntu22.04 安装docker 和docker-compose
首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...
Qt Quick Controls模块功能及架构
Qt Quick Controls是Qt Quick的一个附加模块,提供了一套用于构建完整用户界面的UI控件。在Qt 6.0中,这个模块经历了重大重构和改进。 一、主要功能和特点 1. 架构重构 完全重写了底层架构,与Qt Quick更紧密集成 移除了对Qt Widgets的依赖&…...