关于Unity的物理模拟(多场景物理/轨迹线预测/抛物线预测)
午名_fgter
2024年12月09日 10:23

一:核心代码(两句)

1.physicsScene.Simulate(float step);

2.Physics.Simulate(float step);

参数为模拟的时间。注意两个方法并不是对单一物体进行模拟,而是对一个场景进行模拟

二:两者区别

1.第一个是PhysicsScene的实例方法,针对指定物理场景的模拟

2.第一个是Physics的静态方法,只针对默认的物理场景的物理模拟


三:物理场景的指定

1.手动在Assets下创建的场景会使用默认的物理场景,id为0,默认启用自动物理模拟(autoSimulation)

2.对于在代码中使用CreateScene创建的场景:

①在不指定CreateSceneParameters的下创建的场景会使用默认的物理场景。id为0,默认启用自动物理模拟

②在指定CreateSceneParameters的情况下:

I:参数为LocalPhysicsMode.None创建的场景会使用默认的物理场景,id为0,默认启用自动物理模拟

II:参数为LocalPhysicsMode.Physics3D创建的场景会创建一个自己的本地3D物理场景,id为>0的随机数,不会启用自动物理模拟,必须手动进行物理模拟。而2D物理场景依然是默认2D物理场景,id为0,启用自动物理模拟

III:参数为LocalPhysicsMode.Physics2D则与II相反

总结来说就是指定对应的LocalPhysicsMode就会创建对应的物理场景,不指定就用默认的物理场景,而新创建的物理场景不会启用自动物理模拟,是Unity专门用来预测游戏对象的碰撞和轨迹的物理场景。

注:各个物理场景间的物体相互独立,互不影响。但同一物理场景间的物体会相互影响


四:使用

1:PhysicsScene.Simulate的使用可以参考(使用起来像平行世界,优点是不会影响主场景,缺点是需要创建新场景)

网页链接​

①定义变量

②想要使用PhysicsScene,必须先创建一个带有本地物理场景(LocalPhysicsScene)的场景,然后获得这个场景的物理场景

③得到物理场景后把要模拟的物体以及障碍物都从主场景复制一份或者直接挪到创建的场景里并对要模拟的物体施加力

④最后手动进行物理模拟,如有需要可记录轨迹等信息并绘制(注意:本次模拟是在一帧下完成的)

⑤上面已经完成了对物体的模拟,如果不再需要这个物体可对其进行销毁

完整函数:

结果:


2.Physics.Simulate(使用起来像探测器,优点是不用创建新场景,缺点是会影响主场景)

①使用前提

Physics只在默认物理场景并且Physics.autoSimulation=false的情况下才会执行

②定义变量

③关闭自动物理模拟

④创建需要模拟的物体并施加力

⑤进行物理模拟,如有需要可记录轨迹等信息

⑥销毁用来模拟的物体

⑦创建真正的物体并施加力

⑧开启自动物理模拟

完整函数:

结果:

第一次写文章不会排版,见谅。

参考:

多场景物理 - Unity 手册

Unity - Scripting API: Physics.autoSimulation

LocalPhysicsMode - Unity 脚本 API