Unity物理系统脚本编程(下)

简介: Unity物理系统脚本编程(下)

一、修改物理材质

Unity对物体表面材料的性质做了件化处理,仅有5种常用属性:

  • Dynamic Friction(动态摩擦系数)
  • Static Friction(静态摩擦系数)
  • Bounciness(弹性系数)
  • Friction Combine(摩擦力系数算法)
  • Bounce Combine(弹性系数算法)

物理材质是配合碰撞体使用的。碰撞体有一个Material属性,将创建好的物理材质拖拽到该属性上即可指定该属性。

不指定任何物理材质时,碰撞体具有默认的物理材质。

二、FixedUpdate

物理更新,保证稳定的时间间隔(默认0.02s,可以通过Edit->Project Settings->Time来修改)。

物理系统对于时间是非常敏感的。举一个例子:发射子弹,0.1秒后几种物体。假如更新频率不稳定,子弹接触物体时没有及时检测,再晚0.02秒,子弹已经穿过了物体。这样子弹就错过了碰撞的时机,导致后续结果完全不同。

按理说刷新频率应该是越高越好,但综合考虑机器负担和性能后,决定50帧是最合理的选择。

所有的物理系统处理都会在引擎循环中的一个专门环节上完成,从而保证更新频率的稳定。

特殊机制:

如果说设备卡了一下,物理更新还能保证更新频率吗?

答案是有办法间接保证这一点。简单来说,游戏世界的时间是一个虚拟的概念,一定程度上可以人为控制。如果在T时刻,卡了0.06秒,正好错过了三个周期,那么在下一次不卡的时候,FixedUpdate函数会补上之前错过的三次,连续执行4次,而且还会"假装"这4次的调用时间点分别是T+0.02,T+0.04,T+0.06T+0.08.通过这样的机制,就能保证无论硬件运行是否稳定,游戏都能保证"稳定"的物理更新,避免出现奇怪的结果。作为对比,Update就没有这个特性。

三、修改角速度

与修改刚体速度类似,代码如下

Rigid.angularVelocity=new Vector3(0,60,0);

刚体的angularVelocity属性的数据类型为Vector3,代表x、y、z轴的旋转速度,单位时弧度/s,也就是说3.14代表每秒半圈。

由于具有角阻尼(Angular Drag),因此即便没有接触其他物体,旋转也会慢慢停下来。

四、质心

拼接一个简单的模型,使用物理系统调整其重心就可以只做一个不倒翁。代码如下

Rigidbody rigid;

rigid=GetComponent<Rigidbody>();

//设置centerOfMass就可以指定重心了

rigid.centerOfMass=new Vector3(0,-1,0);

游戏物体的重心不受真实世界的限制,不但可以设置在物体的任意位置,而且还可以超出物体本身的范围。

对物体施加力时,力的位置不同,效果也就不同。严格来说,对一个不受任何力的物体(在Unity里就是去掉了重力,也不与其他物体接触的刚体),如果手里的方向通过了该物体的质心,物体就不会获得角速度。如果力的方向错过了质心,那么物体就会有旋转的趋势。质心到受力线的距离越远,旋转的趋势就越强

五、更多施加力的方式

力的位置很重要,但前文提到的AddForce却没有位置参数。可以猜想,AddForce函数施加力时,就是从物体的质心位置施加的。

如果要模拟更复杂的情况,可以使用以下函数:

void AddForceAtPosition(Vector3 force,Vector3 position);

void AddForceAtPosition(Vector3 force,Vector3 position,ForceMode mode);

第二个参数为施加力的位置,以世界坐标表示,因此使用时可能需要转换坐标。

第三个参数为力的模式,是一个枚举类型,定义如下:

public enum ForceMode
{
//默认方式为持续施加力
Force=0,
//设置为瞬间博发力,适合表现快速猛烈的力,如爆炸
//力的持续时间有区别
Impulse=1,
//瞬时改变刚体速度,不考虑质量
VelocityChange=2,
//直接改变加速度,不考虑质量
Acceleration=5

也就是说,施加力的时候,可以通过改变参数mode来让施加力的含义发生变化。前两种比较常用,第三种完全可以用直接修改刚体速度的velocity属性代替

六、刚体约束

在Rigidbody中,有一个Constraints,可以锁定xyz轴的移动与旋转。根据需要锁定一些自由度,可以让刚体的行为更加可控。

也可以用脚本控制冻结:

rigid.constraints=RigidbodyConstraints.FreezeAll;//冻结所有移动和旋转

rigid.constraints=RigidbodyConstraints.FreezePositionX;//冻结x轴的位移,取消所有其它约束

rigid.constraints=RigidbodyConstraints.FreezeRotation;//冻结所有旋转,取消位移约束

rigid.constraints=RigidbodyConstraints.FreezeRotationX|RigidbodyConstraints.FreezeRotationZ|RigidbodyConstraints.FreezePositionY;//冻结x和z轴旋转,冻结y轴位移

 


相关文章
|
9月前
|
图形学 开发者
Unity编辑器脚本(添加/删除)碰撞盒
这段代码提供了两个Unity编辑器工具,用于批量处理模型的碰撞盒。一是“一键添加所有碰撞盒”,通过选择模型的父物体,自动为其子物体添加`MeshCollider`。二是“一键清理所有Collider碰撞盒”,同样选择父物体后,递归删除子物体上的`BoxCollider`组件。两者均通过Unity的菜单项实现便捷操作,方便开发者快速调整场景中的物理属性。
|
12月前
|
设计模式 C# 图形学
Unity 游戏引擎 C# 编程:一分钟浅谈
本文介绍了在 Unity 游戏开发中使用 C# 的基础知识和常见问题。从 `MonoBehavior` 类的基础用法,到变量和属性的管理,再到空引用异常、资源管理和性能优化等常见问题的解决方法。文章还探讨了单例模式、事件系统和数据持久化等高级话题,旨在帮助开发者避免常见错误,提升游戏开发效率。
459 4
|
设计模式 存储 人工智能
深度解析Unity游戏开发:从零构建可扩展与可维护的游戏架构,让你的游戏项目在模块化设计、脚本对象运用及状态模式处理中焕发新生,实现高效迭代与团队协作的完美平衡之路
【9月更文挑战第1天】游戏开发中的架构设计是项目成功的关键。良好的架构能提升开发效率并确保项目的长期可维护性和可扩展性。在使用Unity引擎时,合理的架构尤为重要。本文探讨了如何在Unity中实现可扩展且易维护的游戏架构,包括模块化设计、使用脚本对象管理数据、应用设计模式(如状态模式)及采用MVC/MVVM架构模式。通过这些方法,可以显著提高开发效率和游戏质量。例如,模块化设计将游戏拆分为独立模块。
824 3
|
开发者 图形学 Java
Unity物理引擎深度揭秘:从刚体碰撞到软体模拟,全面解析实现复杂物理交互的技巧与秘诀,助你打造超真实游戏体验
【8月更文挑战第31天】物理模拟在游戏开发中至关重要,可让虚拟世界更真实。Unity作为强大的跨平台游戏引擎,内置物理系统,支持从刚体碰撞到布料模拟的多种功能。通过添加Rigidbody组件,可实现物体受力和碰撞;使用AddForce()施加力;通过关节(如Fixed Joint)连接刚体以模拟复杂结构。Unity还支持软体物理,如布料和绳索模拟,进一步增强场景丰富度。掌握这些技术,可大幅提升游戏的真实感和玩家体验。
791 1
|
开发者 图形学 Java
揭秘Unity物理引擎核心技术:从刚体动力学到关节连接,全方位教你如何在虚拟世界中重现真实物理现象——含实战代码示例与详细解析
【8月更文挑战第31天】Unity物理引擎对于游戏开发至关重要,它能够模拟真实的物理效果,如刚体运动、碰撞检测及关节连接等。通过Rigidbody和Collider组件,开发者可以轻松实现物体间的互动与碰撞。本文通过具体代码示例介绍了如何使用Unity物理引擎实现物体运动、施加力、使用关节连接以及模拟弹簧效果等功能,帮助开发者提升游戏的真实感与沉浸感。
742 1
|
图形学 开发者 UED
Unity游戏开发必备技巧:深度解析事件系统运用之道,从生命周期回调到自定义事件,打造高效逻辑与流畅交互的全方位指南
【8月更文挑战第31天】在游戏开发中,事件系统是连接游戏逻辑与用户交互的关键。Unity提供了多种机制处理事件,如MonoBehaviour生命周期回调、事件系统组件及自定义事件。本文介绍如何有效利用这些机制,包括创建自定义事件和使用Unity内置事件系统提升游戏体验。通过合理安排代码执行时机,如在Awake、Start等方法中初始化组件,以及使用委托和事件处理复杂逻辑,可以使游戏更加高效且逻辑清晰。掌握这些技巧有助于开发者更好地应对游戏开发挑战。
656 0
|
图形学 C# 开发者
Unity粒子系统全解析:从基础设置到高级编程技巧,教你轻松玩转绚丽多彩的视觉特效,打造震撼游戏画面的终极指南
【8月更文挑战第31天】粒子系统是Unity引擎的强大功能,可创建动态视觉效果,如火焰、爆炸等。本文介绍如何在Unity中使用粒子系统,并提供示例代码。首先创建粒子系统,然后调整Emission、Shape、Color over Lifetime等模块参数,实现所需效果。此外,还可通过C#脚本实现更复杂的粒子效果,增强游戏视觉冲击力和沉浸感。
1077 0
|
图形学 C# 开发者
全面掌握Unity游戏开发核心技术:C#脚本编程从入门到精通——详解生命周期方法、事件处理与面向对象设计,助你打造高效稳定的互动娱乐体验
【8月更文挑战第31天】Unity 是一款强大的游戏开发平台,支持多种编程语言,其中 C# 最为常用。本文介绍 C# 在 Unity 中的应用,涵盖脚本生命周期、常用函数、事件处理及面向对象编程等核心概念。通过具体示例,展示如何编写有效的 C# 脚本,包括 Start、Update 和 LateUpdate 等生命周期方法,以及碰撞检测和类继承等高级技巧,帮助开发者掌握 Unity 脚本编程基础,提升游戏开发效率。
634 0
|
开发者 图形学 前端开发
绝招放送:彻底解锁Unity UI系统奥秘,五大步骤教你如何缔造令人惊叹的沉浸式游戏体验,从Canvas到动画,一步一个脚印走向大师级UI设计
【8月更文挑战第31天】随着游戏开发技术的进步,UI成为提升游戏体验的关键。本文探讨如何利用Unity的UI系统创建美观且功能丰富的界面,包括Canvas、UI元素及Event System的使用,并通过具体示例代码展示按钮点击事件及淡入淡出动画的实现过程,助力开发者打造沉浸式的游戏体验。
660 0

热门文章

最新文章