Unity基础-Mathf相关

news2025/6/10 2:20:06

Unity基础-Mathf相关

一、Mathf数学工具

概述

Mathf是Unity中封装好用于数学计算的工具结构体,提供了丰富的数学计算方法,特别适用于游戏开发场景。它是Unity开发中最常用的数学工具之一,能够帮助我们处理各种数学计算和插值运算。

Mathf与Math的区别

  • Math是C#中封装好用于数学计算的工具类——位于System命名空间下
  • Mathf是Unity中封装好用于数学计算的工具结构体
  • 二者相关方法几乎一样
  • Math是C#自带的工具类,主要提供有关数学的方法
  • Mathf是Unity专门封装的,包含Math的相关方法,还有适用游戏开发的相关方法

Mathf常用方法

1. 计算一次的方法
// 1. 圆周率PI
print(Mathf.PI); // 输出3.141593

// 2. 绝对值Abs
print(Mathf.Abs(-10)); // 输出10

// 3. 向上取整CeilToInt
print(Mathf.CeilToInt(1.1f)); // 输出2

// 4. 向下取整FloorToInt
print(Mathf.FloorToInt(1.9f)); // 输出1

// 5. 钳制函数Clamp
print(Mathf.Clamp(10, 0, 5)); // 输出5
print(Mathf.Clamp(20, 0, 25)); // 输出25
print(Mathf.Clamp(-1, 0, 25)); // 输出0

// 6. 最大值Max
print(Mathf.Max(1, 2)); // 输出2

// 7. 最小值Min
print(Mathf.Min(1, 2)); // 输出1

// 8. 幂运算Pow
print(Mathf.Pow(2, 3)); // 输出8

// 9. 四舍五入RoundToInt
print(Mathf.RoundToInt(1.5f)); // 输出2

// 10. 平方根Sqrt
print(Mathf.Sqrt(4)); // 输出2

// 11. 是否为2的幂IsPowerOfTwo
print(Mathf.IsPowerOfTwo(4)); // 输出true

// 12. 判断正负Sign
print(Mathf.Sign(1)); // 输出1

总结:这些基础数学方法在游戏开发中经常使用,特别是在处理数值计算、位置计算和游戏逻辑时。它们提供了精确的数学运算,帮助我们实现各种游戏功能。

2. 计算多次的方法
线性插值Lerp

线性插值是游戏开发中最常用的数学工具之一,它能够实现平滑的过渡效果,使游戏画面更加自然流畅。

// 用于两个值之间的差值过渡Mathf.Lerp(初始值,目标值,插值系数)
// 差值系数取值范围[0,1]
// 计算公式:result = start + (end - start) * t
print(Mathf.Lerp(1, 10, 0.5f)); // 输出5.5

// 差值运算用法一
// 每帧更新start的值 变化速度先快后慢,位置无限接近end,但是不会得到end
start = Mathf.Lerp(start, end, Time.deltaTime);

// 差值运算用法二
// 每帧更新time的值,变化速度匀速,位置每帧接近,当time=1时,result=end
float time = 0;
time += Time.deltaTime;
result = Mathf.Lerp(start, end, time);

扩展知识

  1. Lerp不仅可以用于位置插值,还可以用于:
    • 颜色渐变
    • 旋转角度
    • 缩放大小
    • 透明度变化
  2. 除了线性插值,Unity还提供了其他插值方法:
    • Vector3.Lerp:向量插值
    • Quaternion.Lerp:四元数插值
    • Color.Lerp:颜色插值
Lerp实际应用示例

下面通过一个具体的示例来展示Lerp在游戏开发中的实际应用,这个示例展示了两种不同的移动实现方式。

public class MathfTest : MonoBehaviour
{
    public Transform cube;
    private Vector3 start;
    private float speed=1;
    private float time=0;
    private Vector3 startPos;
    private Vector3 bPos;
    
    // Start is called before the first frame update
    void Start()
    {
        start=this.transform.position;
    }

    // Update is called once per frame
    void Update()
    {
        // Move1();
        // Move2();
    }
    private void Move1()
    {
        //方法1 先快后慢
        start.x=Mathf.Lerp(start.x,cube.position.x,speed*Time.deltaTime);
        start.y=Mathf.Lerp(start.y,cube.position.y,speed*Time.deltaTime);
        start.z=Mathf.Lerp(start.z,cube.position.z,speed*Time.deltaTime);
        
        this.transform.position=start;
        //使用Vector3.Lerp方法
        // transform.position=Vector3.Lerp(transform.position,cube.position,speed*Time.deltaTime);
    }
    private void Move2()
    {
        //方法2 匀速
        time+=Time.deltaTime;
        if(bPos!=cube.position)
        {
            time=0;
            bPos=cube.position;
            startPos=transform.position;
        }
        start.x=Mathf.Lerp(startPos.x,bPos.x,time);
        start.y=Mathf.Lerp(startPos.y,bPos.y,time);
        start.z=Mathf.Lerp(startPos.z,bPos.z,time);
        transform.position=start;
    }
}

两种移动方式的区别

  1. 方法1(先快后慢)

    • 使用Time.deltaTime作为插值系数
    • 移动速度随着距离目标越近而越慢
    • 永远不会完全到达目标位置
    • 适合相机跟随等场景
  2. 方法2(匀速移动)

    • 使用time变量作为插值系数
    • 移动速度保持恒定
    • 可以完全到达目标位置
    • 适合需要精确控制的场景

使用建议

  1. 选择移动方式时需要考虑:
    • 是否需要精确控制移动时间
    • 是否需要完全到达目标位置
    • 移动效果的自然程度要求
  2. 可以结合两种方法的特点:
    • 使用方法1实现平滑的相机跟随
    • 使用方法2实现精确的物体移动

应用场景

Mathf在游戏开发中的应用非常广泛,主要包括:

  1. 游戏对象移动和旋转

    • 角色移动
    • 相机跟随
    • 物体旋转
  2. 平滑动画过渡

    • UI动画
    • 场景切换
    • 特效渐变
  3. 物理计算和碰撞检测

    • 碰撞检测
    • 物理模拟
    • 力的计算
  4. 游戏逻辑中的数学运算

    • 伤害计算
    • 属性计算
    • 随机数生成

扩展应用

  1. 游戏AI

    • 寻路算法
    • 行为决策
    • 状态转换
  2. 特效系统

    • 粒子效果
    • 光照变化
    • 材质过渡
  3. UI系统

    • 界面动画
    • 进度条
    • 数值显示

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

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

相关文章

STM32CubeMX-H7-19-ESP8266通信(中)--单片机控制ESP8266实现TCP地址通信

前言 上篇文章我们已经能够使用串口助手实现esp8266的几种通信,接下来我们使用单片机控制实现。这篇文章会附带教程,增加.c和,.h,把串口和定时器放到对应的编号,然后调用初始化就可以使用了。 先讲解,然后末尾再放源码…

【汇编逆向系列】四、函数调用包含单个参数之Double类型-mmword,movsd,mulsd,addsd指令,总结汇编的数据类型

一、汇编代码 上一节开始,讲到了很多debug编译独有的汇编方式,为了更好的区分release的编译器优化和debug的区别,从本章节开始将会提供debug和release的汇编用作对比 Debugb编译 single_double_param:00000000000000A0: F2 0F 11 44 24 08…

【AI学习】wirelessGPT多任务无线基础模型摘要

收看了关于WirelessGPT多任务无线基础模型的演讲视频,边做一个记录。 应该说,在无线通信大模型的探索方面,有一个非常有益的尝试。 在沈学明院士带领下开展 https://www.chaspark.com/#/live/1125484184592834560

docker 部署redis集群 配置

docker的网络模式 网桥模式每次重启容器都有可能导致容器ip地址变化,需要固定ip的自己自定义网络,这里介绍的是默认网络模式 docker创建容器 docker run --name redis6379 -p 6379:6379 -p 16379:16379 -v /etc/redis/redis6379:/etc/redis -d --r…

Ansys Maxwell:线圈和磁体的静磁 3D 分析

本博客展示了如何在 Ansys Maxwell 中执行静磁 3D 分析,以计算载流线圈和永磁体之间相互作用产生的扭矩。在这个例子中,线圈中的电流产生一个沿 Y 轴指向的磁场,而永磁体沿 X 轴被磁化。这种配置导致围绕 Z 轴的扭矩。分步工作流程包括构建几…

【计算机网络】SDN

SDN这种新型网络体系结构的核心思想:把网络的控制层面与数据层面分离,而让控制层面利用软件来控制数据层面中的许多设备。 OpenFlow协议可以被看成是SDN体系结构中控制层面与数据层面之间的通信接口。 在SDN中取代传统路由器中转发表的是“流表”&…

成工fpga(知识星球号)——精品来袭

(如需要相关的工程文件请关注知识星球:成工fpga,https://t.zsxq.com/DMeqH,关注即送200GB学习资料,链接已置顶!) 《孩子都能学会的FPGA》系列是成工完成的第一个系列,也有一年多的时…

spring中的@KafkaListener 注解详解

KafkaListener 是 Spring Kafka 提供的一个核心注解,用于标记一个方法作为 Kafka 消息的消费者。下面是对该注解的详细解析: 基本用法 KafkaListener(topics "myTopic", groupId "myGroup") public void listen(String message)…

NoSQL——Redis配置与优化

目录 关系型&非关系型数据库 一、核心原理对比‌ ‌二、核心特性对比‌ ‌三、关键区别剖析‌ ‌四、典型产品示例‌ ‌总结‌ Redis Redis核心原理 核心特性 技术意义 配置文件解析 1. 基础配置 2. 持久化配置 3. 内存管理 4. 高可用配置 5. 性能调优 6.…

CKA考试知识点分享(2)---ingress

CKA 版本:1.32 第二题是涉及ingress相关。本文不是题目,只是为了学习相关知识点做的实验。 1. 环境准备 需要准备一套K8S集群。 1.1 安装ingress-nginx 下载deploy文件: wget -O controller-v1.12.2.yaml https://raw.githubusercontent…

动态生成element-plus的scss变量;SCSS中实现动态颜色变体生成

文章目录 一、动态css变量1.生成内容2.动态生成css变量2.1新增_color-utils.scss(不推荐)2.2新增_color-utils.scss(推荐)2.3theme.scss引入使用 一、动态css变量 1.生成内容 在我们修改element-plus主题色时候,会自…

Linux 内核内存管理子系统全面解析与体系构建

一、前言: 为什么内存管理是核心知识 内存管理是 Linux 内核最核心也最复杂的子系统之一,其作用包括: 为软件提供独立的虚拟内存空间,实现安全隔离分配/回收物理内存资源,维持系统稳定支持不同类型的内存分配器,最优…

Tableau for mac 驱动

Tableau 驱动程序安装指南 对于希望在 Mac OS 上使用 Tableau 进行数据分析的用户来说,确保正确安装相应的驱动程序至关重要。Tableau 支持多种数据库连接方式,并提供官方文档指导如何设置这些连接。 安装适用于 Mac 的 JDBC 或 ODBC 驱动程序 为了使…

fast-reid部署

配置设置: 官方库链接: https://github.com/JDAI-CV/fast-reid# git clone https://github.com/JDAI-CV/fast-reid.git 安装依赖: pip install -r docs/requirements.txt 编译:切换到fastreid/evaluation/rank_cylib目录下&a…

大陆4D毫米波雷达ARS548调试

本文介绍了大陆ARS548毫米波雷达的调试与测试流程,主要包括以下内容: 设备参数:最大检测距离301m(可调93-1514m),支持gPTP时间同步。 接线调试: Windows需使用USB-RJ45转换器 Linux可直接连接网…

大语言模型解析

1. Input Embedding embedding:将自然语言翻译成index 每个index对应一个embedding,embedding需要训练,embedding是一个数组

Java在word中指定位置插入图片。

Java使用(Poi-tl) 在word(docx)中指定位置插入图片 Poi-tl 简介Maven 依赖配置Poi-tl 实现原理与步骤1. 模板标签规范2.完整实现代码3.效果展示 Poi-tl 简介 Poi-tl 是基于 Apache POI 的 Java 开源文档处理库,专注于…

可视化图解算法48:有效括号序列

牛客网 面试笔试 TOP101 | LeetCode 20. 有效的括号 1. 题目 描述 给出一个仅包含字符(,),{,},[和],的字符串,判断给出的字符串是否是合法的括号序列 括号必须以正确的顺序关闭,"()"和"()[]{}"都是合法的括号序列&…

Continue 开源 AI 编程助手框架深度分析

Continue 开源 AI 编程助手框架深度分析 一、项目简介 Continue 是一个模块化、可配置、跨平台的开源 AI 编程助手框架,目标是让开发者能在本地或云端环境中,快速集成和使用自定义的 LLM 编程辅助工具。它通过支持 VS Code 与 JetBrains 等主流 IDE 插件…

MySQL技术内幕1:内容介绍+MySQL编译使用介绍

文章目录 1.整体内容介绍2.下载编译流程2.1 安装编译工具和依赖库2.2 下载编译 3.配置MySQL3.1 数据库初始化3.2 编辑配置文件3.3 启动停止MySQL3.4 登录并修改密码 1.整体内容介绍 MySQL技术系列文章将从MySQL下载编译,使用到MySQL各组件使用原理源码分析&#xf…