您的位置:首页 > 其它

U3d之物理引擎(下)

2018-01-27 15:11 218 查看
如果对你有帮助,请做一棵蒲公英,让知识随风飘荡留在人的心里。

1. 触发事件

要想判断一个角色是否在某个空间区域,除了直接计算Transform组件的position值外,还可以怎么做呢?

我们可以把对象身上的XXX Collider触发器上勾选Is Trigger选项!

触发器事件执行的条件:两个物体上都要带碰撞器,至少带有一个刚体,并且两物体至少有一个把触发器打开。

触发器有哪些回调方法呢?

OnTriggerEnter(Collision other)代表进入触发器的时候调用一次

OnTriggerStay(Collision other)代表停留在触发器的时候持续调用

OnTriggerExit(Collision other)代表离开触发器的时候调用一次



作为回调方法的参数 other对象则是进入碰撞体的一方。

2. 物理材质

在Project窗口中点击右键Create->Physic Material创建物理材质

Dynamic Friction为动态摩擦力系数,范围0-1之间。

Static Friction为静态摩擦力系数,范围同上。

Bounciness反弹系数,范围同样是0-1.(这里有个有趣的现象,估计牛顿老人家的棺材板要压不住了呢,如果你在场景中创建一个物体,把它的反弹系数最大化,然后添加刚体使用重力,提起一个高度让它自然下落到一个同样有反弹系数最大的平面上,你会发现它不仅会像永动机一样跳动,还会越来越高,直至突破天际,大家想想这是为什么呢?)

当我们设置好了物理材质后,我们可以把做好的物理材质拖到Collider上的Material上使用,是不是很简单很方便呢?

3. 射线

我们再来思考一个问题,如何实现物体的移动到鼠标点击的位置呢?

这里我们来说说Unity提供的射线机制:通过虚拟射线检测所碰撞的物体(这个射线是看不到的,但是可以调试出结果)

Ray作为射线类,可以直接创建一条射线Ran ran = new Ray();

我们来看看他的两个属性,origin与direction,前者是发射的原点,后者则是发射的方向。

使用物理类Physics的Raycast方法可以实现射线碰撞检测功能

Physics.Raycast(Ray ray,out RaycastHit hit);其中的一种重载形式

返回值是bool值,所以我们可以判断是否射到了某些物体或图层

这里要来讲解一些物理引擎上篇的一个小问题

我们鼠标点击的点在U3D的世界里是三维的,那么我们的电脑屏幕是二维的,如何告诉电脑我们所点击坐标的Z轴呢?这里我们可以先手动实现一下,再看引擎给我们提供的方法。

Vector3 pos = input.MousePosition;

pos = new Vector3(pos.x,pos.y,Camera.main.transform.position.z);

pos = Camear.main.ScreenToWorldPoint(pos);

但是我们如果每次都这样写岂不是很麻烦?那我们来看看系统的方法

Ray ray = Camera.main.ScreenPointToRay(input.mousePosition);一句话搞定,但是效果是一样的,大家可以理解下原理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息