U3D动作游戏开发读书笔记--3.1 物理系统详解(上)

news/2025/9/18 23:23:42/文章来源:https://www.cnblogs.com/TonyCode/p/19099918

第三章 物理系统详解

3.1 物理系统的基本梳理

3.1.1 系统参数设置

了解物理配置:

image-20250917215542991

打开Project Settings设置

image-20250917215927633

image-20250917215932154

  • Gravity:重力,常用范围是60~80
  • Queries Hit Backfaces :进行背面查询,如果需要查询MeshCollider背面的情况,可开启
  • Layer Collision Matrix :物理相交矩阵,确定多个Layer层级之间的相交关系,不勾选则表示二者Layer层的物体不产生碰撞关系。

3.1.2 Fixed Update 更新频率

与Update每帧执行一次的轮询周期函数不同,Fixed Update函数的更新频率是固定的,按照设置好的时间间隔来执行。

image-20250917220705519

3.1.3 Rigidbody 参数简介

image-20250917221238485

image-20250917222033000

  • Mass :刚体的质量,作用类似真实物理世界中的质量
  • Drag:阻尼 (不建议设置为0)
  • Angular Drag:角阻尼 旋转类型的阻尼
  • Use Gravity:是否使用重力
  • Is Kinematic :(是否为运动的物体)开启后物体将不受到物理特性的影响
  • Interpolate:插值方式
    • Interpolate内插值会落后后边一些,但比外插值平滑。
    • Extrapolate外插值会基于速度预测刚体位置,但可能会导致某一帧出现错误预测。
    • 对于需要物理表现的物体,建议选择内插值。
  • Collision Detection:碰撞检测方式,
    • Discrete 关闭连续碰撞检测
    • Continues 连续的碰撞检测,对于游戏中快速移动的物体,设置后可以防止穿墙
    • 对于次重要的物体,比如一些特效生成物,建议设置为ContinuousDynamic或者Continuous Speculative,以提升性能。
    • Constraints:刚体约束,勾选后会冻结某个轴上的移动或者旋转;
    • image-20250917222526004

3.1.4 物理材质:

新建一个材质,一般只需要配置两种物理材质最大摩擦力和最小摩擦力类型即可

image-20250917224137776

3.2 常见的问题

书中介绍了几个常见的问题,这里我们一起来跟随作者介绍来了解下。

3.2.1 物理步的理解

Unity3D中的物理更新时序是按照时间来进行的,每一个物理更新称之为物理步,依赖此的触发事件有OnTrigger、OnCollision系列和FixedUpdate等

image-20250917225526122

主要理解物理刷新是固定的步进时序,和每帧更新调用的Update函数不同。

因此,若将输入监测逻辑或者需要每帧监测的逻辑放入物理步进相关函数中判断则会出错。

3.2.2 重叠与挤出问题

来看一个挤出问题:

当一个刚体对象A在另一个碰撞器B中时候,会发生挤出现象。

如果B对象也有刚体组件并且质量与A相当,那么会有相互的斥力;

如果B对象没有刚体组件或者刚体组件质量比A对象大很多,那么A对象便会被挤出。

如果被挤出的对象A在弹出的过程中遇到了其他非刚体碰撞体或者质量较大的刚体碰撞体,会骤停,卡在原地。

挤出

问题分析解决思路:

重叠造成的挤出位移不是一帧内就执行完成的,而是分多步完成,首先挤出持续发生,直到完全不发生重叠为止。由于挤出的方向并不能由用户自定义,所以课程产生朝外挤出的情况,也就是游戏中的穿墙问题。

穿墙问题一般都是由于一些特殊脚本控制瞬移操作造成的,所以要首先保证角色的碰撞检测为连续的,这样可以让刚体驱动的物体位移在高速移动下不会产生穿墙现象。

其次我们可以将一个比较大的场景碰撞拆分成多份,并将一些MeshCollider碰撞勾选Convex转换为凸包,以保证碰撞检测的结果正确性。

3.2.3 地面检测优化

地面检测(Ground Detection)是 Unity 游戏开发中一项非常基础且关键的技术,尤其在动作、平台跳跃或角色控制类游戏中。它主要用于判断游戏对象(尤其是角色)是否与地面接触,以及获取接触面的相关信息。

U3D自带的角色控制器(CharacterController)组件可以通过isGrounded字段来进行判断,但不够灵活。

也可以通过胶囊体碰撞体和地面之间的碰撞体之间的物理碰撞来检测,但可能受物理引擎更新频率影响,且在复杂逻辑中处理起来可能不如射线检测灵活。

另一种方法是在角色的底部发射一身射线去检测并保证每帧的执行。但是对于较为复杂的地面碰撞,一根摄像并不能很好的完成对地面的检测。可以使用多根射线投射分方式来进行检测。

void IsOnGroundUpdate(Transform[] groundPoints,LayerMask laterMask,float length,out bool isOnFround,out RaycastHit cacheRaycastHit){isOnFround = false;cacheRaycastHit = new RaycastHit(); foreach (Transform groundPoint in groundPoints){if (Physics.Raycast(groundPoint.position, Vector3.down, out RaycastHit hit, length, laterMask)){isOnFround = true;cacheRaycastHit = hit;break;}}}

image-20250918212733858

一般设置使用三个检测点即可。

3.2.4 Dash与瞬移问题的处理

进行瞬移或者重逢类技能时候,需要严谨地考虑会产生的物理问题,所以不能随意地改变坐标来实现需求。

在冲锋或者瞬移之前可以使用SweepTest函数来对瞬移的目标点做测试,提前预判是否可以冲锋:

/// <summary>
/// 实现物体的瞬间移动(闪烁)功能,同时避免碰撞穿透
/// </summary>
/// <param name="trans">需要进行瞬移的目标物体的Transform组件</param>
/// <param name="targetPoint">期望瞬移到的目标位置坐标</param>
/// <param name="testTrans">用于碰撞检测计算的参考Transform,通常是自身或相关物体</param>
void BlinkTo(Transform trans, Vector3 targetPoint, Transform testTrans)
{// 计算从当前位置到目标位置的向量var diff = (targetPoint - transform.position);// 计算移动距离var length = diff.magnitude;// 计算标准化的移动方向var dir = diff.normalized;// 碰撞信息存储变量var hit = default(RaycastHit);// 获取需要移动物体的Rigidbody组件var selfRigidbody = trans.GetComponent<Rigidbody>();// 使用SweepTest模拟物体沿着移动路径移动,检测是否会与其他碰撞体发生碰撞if (selfRigidbody.SweepTest(dir, out hit, length)){// 如果检测到碰撞,计算碰撞体上距离参考点最近的边界点var targetClosestPoint = hit.collider.ClosestPointOnBounds(testTrans.position);// 计算自身碰撞体上距离目标最近点的最近边界点var selfClosestPoint = selfRigidbody.ClosestPointOnBounds(targetClosestPoint);// 计算从当前位置到自身最近点的偏移量var offset = selfClosestPoint - transform.position;// 将物体放置在刚好不发生碰撞穿透的位置trans.position = targetClosestPoint - offset;}else{// 没有碰到目标点 说明可以瞬移 进行瞬移trans.position = targetPoint;}
}

对于冲击这种非一次性闪现的多帧操作,需要考虑是否存在空中的因素,这里以空中冲击到Dash为例:

IEnumerator DashTo(Transform trans, Vector3 targetPosition)
{//准备瞬移的对象var startPos = trans.position;//此处可以对目标点进行在地面位置的修正targetPosition = GetGroundPosition(targetPosition);var waitForFixedUpdate = new WaitForFixedUpdate();var beginTime = Time.fixedTime;//按照物理更新时序 for (var duration = 0.15f; Time.fixedTime - beginTime <= duration;){var t = (Time.fixedTime - beginTime) / duration;t = t * t;trans.position = Vector3.Lerp(startPos,targetPosition,t);yield return waitForFixedUpdate;}
}

要点:image-20250918222859713

image-20250918222943968

image-20250918223225569

【有了AI助手,分析起代码很容易,如果不好好思考和使用,真实说不过去!嘿嘿】

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

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

相关文章

一个联名款电子产品的技术实现和诞生

@目录项目核心亮点(“老年人”非得在地上穿梭也行,恐高嘛)核心技术(技术实现,欢迎各抒己见)市场分析基础核心创新点 项目核心亮点(“老年人”非得在地上穿梭也行,恐高嘛) 欢迎各位青少年小伙伴参与评论互动,…

US$198 Auxiliary Heater Diagnostic Unit for Eberspacher 12V/24V Systems

Auxiliary Heater Diagnostic Unit for Eberspacher 12V/24V SystemsAuxiliary Heater Diagnostic Unit Function:Read out errors from the control boxPerform diagnosis on installed heaterSwitch on heater direc…

JOISC

JOISC开坑。

20250918 之所思 - 人生如梦

20250918 之所思为了改善专注力,到网上找了不少方法,按照教程学习了冥想,但可能是境界不够,效果一直不太好,容易分心,注意力拉不回来,挺沮丧;昨天试验了番茄钟,开始一个任务,接着开始倒计时,发现注意力非常…

初赛知识点复盘

前言 作者觉得自己太菜了,就开始复盘初赛知识点了 接下来是CSP-S/J,虽然在HN很容易进复赛但是还是稳健一点 正文 1.计算机内部结构1.冯诺依曼计算机结构,分为 输入设备,存储器,输出设备,运算器,控制器,其中1.运…

WPF使用Cef加载Vue3页面问题

在WPF中使用CefSharp时遇到两个问题:1.Vue3中使用Ant Design Vue时,table不显示数据 由于之前的老项目用的Vue2框架,数据接口是一样的,页面的功能是差不多的,就把table的columns复制了过来,结果显示不出字段; 数…

curl与wget

wget 和 curl 不是替代关系,而是互补工具。wget 更“傻瓜式”,curl 更“灵活”。 但是curl 支持 40+ 协议,是 API 调试、RESTful 接口测试 的首选工具。HTTP 方法与 API 调用(curl 强项) curl 无法原生实现递归下载…

用 Go 语言与 Tesseract OCR 实现英文数字验证码识别

Go 语言本身不直接支持图像识别,但可以通过调用 Tesseract OCR 引擎来进行图像识别。我们可以使用 Go 的 tesseract 包来实现这一功能。 一、安装与配置 安装 Tesseract OCR 首先,你需要在系统中安装 Tesseract OCR。…

lc1031-两个非重叠子数组的最大和

难度:中等(中期)题目描述给定一个数组和两个长度,找到两个符合长度的不重合的连续子数组,使其和最大示例 输入:nums = [0,6,5,2,2,5,1,9,4], firstLen = 1, secondLen = 2 输出:20 解释:[6, 5] + [9]输入:num…

Segment Analytics-iOS SDK - 专业用户行为追踪解决方案

Segment Analytics-iOS SDK 是一个专业的iOS用户行为分析库,提供完整的事件追踪、用户识别、屏幕浏览统计等功能,支持多种数据集成方式,帮助开发者高效收集和分析用户行为数据。Segment Analytics-iOS SDK Analytic…

我对 WPF 动摇时的选择:.NET Framework 4.6.2+WPF+Islands+UWP+CompostionApi - 行人-

我使用佳能相机,以60FPS高帧率录制视频,来比对 WPF 和 UWP 的动画流畅度,结果: WPF表现吃力和卡顿,UWP表现丝滑和高级。文章是我对.NET Framework 4.6.2框架下的动画方案的选型进行的一些探索和记录。NET Framewo…

US$1198 Xhorse VVDI2 BMW Version With Basic+BMW OBD+BMW CAS4+BMW FEM/BDC

100% Original Xhorse BMW Version With Basic+BMW OBD+BMW CAS4+BMW FEM/BDCThis VVDI2 with Activated Software List:VB-01 BMW OBDVB-02 BMW CAS4VB-03 FEM/BDC FunctionVP-01 Porsche immo data toolVJ-01 Passth…

使用 Rust 与 Tesseract OCR 识别英文数字验证码

一、安装与配置 安装 Tesseract OCR Ubuntu: 更多内容访问ttocr.com或联系1436423940 sudo apt-get update sudo apt-get install tesseract-ocr macOS: brew install tesseract Windows: 从 Tesseract 官方 GitHub…

API安全解决方案选型指南:2025年五大关键维度与厂商推荐

API安全解决方案选型指南:2025年五大关键维度与厂商推荐在数字化转型浪潮中,API已成为连接业务与数据的核心枢纽。随着API数量的爆发式增长,安全威胁也日益复杂:影子API无处不在、敏感数据暴露风险加剧、自动化攻击…

别迷茫了!计算机大一新生这样做,四年后远超同龄人 - 编程实战派

本文是一份专为计算机专业大一新生打造的终极学习指南。文章打破迷茫,从心态重置、学习攻略、实践真知、视野规划四大维度,提供切实可行的建议。强调从“被动学习”转向“主动探索”的思维模式,死磕数学、英语、C语…

解决ifconfig命令没有显示ens33 finalshell连接不上虚拟机

停止并关闭NetworkManager systemctl stop NetworkManagersystemctl disable NetworkManager重启网络服务 systemctl start network

CRM管理专业的系统:从数据收集到价值挖掘

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

什么情况下需要用到xargs

它是 find、grep、ls 等输出类命令的“桥梁”,连接“查找”和“执行”​ xargs 核心作用是:将标准输入(stdin)中的数据转换为命令行参数,并传递给其他命令执行。 总结:当你需要把“文本流”变成“命令参数”时,…

Office 2024安装包专业增强版超详细下载安装教程

在数字化办公浪潮中,Office 2024 专业增强版成为提升办公效率的得力助手。这款功能强大的办公套件,集成了 Word、Excel、PowerPoint、Access、Outlook、OneNote 等多个组件,能够全方位满足日常办公中的文本处理、表…