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

unity3d——基础篇2刷(Mathf)

目录

知识点一:Mathf和Math

知识点二:Mathf和Math的区别

知识点三:Mathf中的常用方法

知识点四:Mathf中的常用方法——一般不停计算

代码示例1

代码示例2

插值运算用法一:每帧改变 start 的值

插值运算用法二:每帧改变 t 的值


知识点一:Mathf和Math
  • Math 是C#中封装好的用于数学计算的工具类,位于System命名空间中。
  • Mathf 是Unity中封装好的用于数学计算的工具结构体,位于UnityEngine命名空间中。
  • 两者都提供数学相关计算方法。
知识点二:Mathf和Math的区别
  • Mathf 和 Math 中的相关方法几乎一样。
  • Math 是C#自带的工具类,主要提供数学相关计算方法。
  • Mathf 是Unity专门封装的,不仅包含Math中的方法,还多了一些适用于游戏开发的方法。
  • 在Unity游戏开发中,推荐使用 Mathf 中的方法进行数学计算。
知识点三:Mathf中的常用方法
  1. π - PI
  2. 取绝对值 - Abs
  3. 向上取整 - CeilToInt
  4. 向下取整 - FloorToInt
  5. 钳制函数 - Clamp
  6. 获取最大值 - Max
  7. 获取最小值 - Min
  8. 一个数的n次幂 - Pow
  9. 四舍五入 - RoundToInt
  10. 返回一个数的平方根 - Sqrt
  11. 判断一个数是否是2的n次方 - IsPowerOfTwo
  12. 判断正负数 - Sign
知识点四:Mathf中的常用方法——一般不停计算
  • 插值运算 - Lerp
    • Lerp函数公式:result = Mathf.Lerp(start, end, t);
    • t为插值系数,取值范围为0~1。
    • result = start + (end - start)*t
    • 插值运算用法一:每帧改变start的值,变化速度先快后慢,位置无限接近,但不会得到end位置。
    • 插值运算用法二:每帧改变t的值,变化速度匀速,位置每帧接近,当t>=1时,得到结果。

代码示例1

void Start()
{
    print(Mathf.PI);
    print(Mathf.Abs(-10));
    print(Mathf.Abs(-20));
    print(Mathf.Abs(1));
    float f = 1.3f;
    int i = (int)f;
    print(i);
    print(Mathf.CeilToInt(f));
    print(Mathf.CeilToInt(1.00001f));
    print(Mathf.FloorToInt(9.6f));
    print(Mathf.Clamp(10, 11, 20));
    print(Mathf.Clamp(21, 11, 20));
    print(Mathf.Clamp(15, 11, 20));
    print(Mathf.Max(1, 2, 3, 4, 5, 6, 7, 8));
    print(Mathf.Max(1, 2));
    print(Mathf.Min(1, 2, 3, 4, 545, 6, 1123, 123));
    print(Mathf.Min(1.1f, 0.4f));
    print("一个数的n次方" + Mathf.Pow(4, 2));
    print("一个数的n次方" + Mathf.Pow(2, 3));
    print("四舍五入" + Mathf.RoundToInt(1.3f));
    print("四舍五入" + Mathf.RoundToInt(1.5f));
    print("返回一个数的平方根" + Mathf.Sqrt(4));
    print("返回一个数的平方根" + Mathf.Sqrt(16));
    print("返回一个数的平方根" + Mathf.Sqrt(64));
    print("判断一个数是否是2的n次方" + Mathf.IsPowerOfTwo(4));
    print("判断一个数是否是2的n次方" + Mathf.IsPowerOfTwo(8));
    print("判断一个数是否是2的n次方" + Mathf.IsPowerOfTwo(3));
    print("判断一个数是否是2的n次方" + Mathf.IsPowerOfTwo(1));
    print("判断正负数" + Mathf.Sign(0));
    print("判断正负数" + Mathf.Sign(10));
    print("判断正负数" + Mathf.Sign(-10));
    print("判断正负数" + Mathf.Sign(3));
    print("判断正负数" + Mathf.Sign(-2));
}

代码示例2

插值运算用法一:每帧改变 start 的值

// 开始值
float start = 0;

void Update()
{
    // 插值运算用法一
    // 每帧改变start的值——变化速度先快后慢,位置无限接近,但是不会得到end位置
    start = Mathf.Lerp(start, 10, Time.deltaTime * 5);
}
  • 在这个例子中,start 变量从 0 开始,每帧通过 Mathf.Lerp 函数逐渐增加,目标值是 10
  • Time.deltaTime 是自上一帧以来的时间增量,乘以 5 可以加快插值的速度。
  • 插值系数 t 是 Time.deltaTime * 5,这意味着 start 会随着时间的推移逐渐接近 10,但由于 Time.deltaTime 的存在,变化速度会先快后慢,即使 t 的值可能超过 1Mathf.Lerp 会确保结果不会超过 10

插值运算用法二:每帧改变 t 的值

// 开始值
float start = 0;
float result = 0;
float time = 0;

void Update()
{
    // 插值运算用法二
    // 每帧改变t的值——变化速度匀速,位置每帧接近,当t>=1时,得到结果
    time += Time.deltaTime;
    result = Mathf.Lerp(start, 10, time);
}
  • 在这个例子中,time 变量用于存储插值系数,初始值为 0
  • 每帧 time 增加 Time.deltaTime,这意味着 time 会随着时间的推移而线性增加。
  • 当 time 达到或超过 1 时,Mathf.Lerp 函数将返回 end 值,即 10
  • result 会以匀速逐渐接近 10,直到达到 10。在这个过程中,time 作为插值系数,确保了插值过程的匀速性。

这两种用法展示了 Mathf.Lerp 在Unity中的不同应用场景,第一种适用于需要平滑加速和减速的过渡效果,第二种适用于需要匀速过渡的效果。


http://www.kler.cn/a/406194.html

相关文章:

  • Java项目实战II基于微信小程序的校运会管理系统(开发文档+数据库+源码)
  • ROS之什么是Node节点和Package包?
  • C++ 中的移动语义
  • centos安装jenkins
  • Win11下载和配置VSCode(详细讲解)
  • Android ROM开发 编译阶段设置预置文件或者文件夹的权限
  • PyCharm的类型警告: Expected type ‘SupportsWrite[bytes]‘, got ‘BinaryIO‘ instead
  • 通过IIC访问模块寄存器[ESP--1]
  • springboot图书馆预约与占座小程序
  • RT-DETR融合[TIP2023]DehazeFormer中的SKFusion模块及相关改进思路
  • C++算法练习-day42——98.验证二叉搜索树
  • 31、js中日期操作
  • vulfocus在线靶场:CVE_2019_16662 速通手册
  • 耿恭坚守城池的方法
  • c++11的动态类型
  • 【AIGC】ChatGPT提示词Prompt解析:拒绝的艺术:如何优雅地说“不“
  • 如何为PDF文件创建口令密码
  • 如何在MATLAB中实现图像自动分割
  • C语言基础学习:抽象数据类型(ADT)
  • 远程服务器Docker使用本地代理加速访问外部资源
  • gitlab:使用脚本批量下载项目,实现全项目检索
  • 关于Linux中线程优先级的问题探讨
  • 【Linux】-学习笔记04
  • [ruby on rails] 安装docker
  • 量化交易系统开发-实时行情自动化交易-4.3.1.跨市场套利策略实现
  • JAVA中的Lamda表达式