FixedUpdate 固定物理针
FixedUpdate 固定物理针
碰撞检测:
1.两个身上都要有碰撞器
2.其中一个(最好是运动的一方)要有刚体
刚体经常不动会休眠
碰撞体分为两大类
2D,3D
添加box collider 2D(碰撞器)
为player及Map里的添加刚体
刚体组件里控制重力 Gravity scale
*解决坦克碰撞时旋转:
坦克的刚体-constraints点击z轴
private void FixedUpdate()//固定物理帧
可以保证时间时匀称的
transform.Translate(Vector3.right * x * Time.deltaTime * speed, Space.World);
transform.Translate(Vector3.up * y * Time.deltaTime * speed, Space.World);
触发碰撞检测的条件:
1.双方都要有碰撞器
2.一方要有钢体,最好是运动的一方(为什么要是运动的一方:如果经常性不运动,钢体会发生休眠,就不会触发碰撞检测)
发生碰撞检测的两个必要条件:
两方都要有刚体
其中一方要有刚体,最好是运动的一方(因为刚体如果经常不运动就会发生休眠,这就不会发生碰撞检测了)
2D和3D游戏请使用对应不同的碰撞器(刚体也是)
update方法每一帧占用的时间是不同的,因为会受到系统、电脑性能的影响,所以方法调用的时机间隔就会不均匀.
但是fixedUpdate则是每隔一定周期执行一次
产生抖动的原因:
因为坦克加上了刚体,所以有了受力,再加上在update方法调用的时机不均匀,所以这样受力也就不均匀,从而产生了抖动。
首先说结论:物理模拟放在FixedUpdate中。
原因首先得说FixedUpdate和Update的区别,FixedUpdate是每隔一定的周期执行一次,比如每隔1秒执行30次;Update是每帧之前执行一次,比如一般的FPS为30,也就是1秒有30帧,那么也是1秒执行30次。但是每隔一定的周期执行与系统性能无关,无论系统怎么样,都会1秒执行30次。而帧与系统性能有关,通常受到渲染的影响。比如同样一款游戏,性能好的电脑的FPS是30,差一点的可能只有10。这样Update就不是固定的1秒30次了。
那么为什么物理模拟要放在FixedUpdate中呢?举个例子,A和B相距30米,一个人从A移动到B,在Unity中可能是这样实现的,在Update/FixedUpdate中写个位移函数,每次移动1米。那么对于在FixedUpdate中写,不论电脑怎么样,1秒内执行了30次,这个人从A移动到了B。但是对于写在Update中的情况,如果电脑好,FPS为30,1秒内执行了30次,这个人同样从A移动到了B,但是电脑性能差,FPS为10,1秒执行了10次,这个人只移动了10米。
当然上面只是个例子,说的专业一点就是Update会因为系统性能产生抖动的现象
坦克朝着两个物体之间仍会发生抖动,可以解决吗
解决,钢体抖动
检测两方发生碰撞,两方都必须要有碰撞器(box collider),一方必须有钢体,钢体最好是运动的一方。
加上钢体之后每一帧都会有个力的影响。所以会出现抖动的效果,因为他受到的这种情况就要用到void FixedUpdate里面,他就会保证每一帧都是受力均匀的。
发生碰撞的两个物体必须都要持有碰撞器
其中之一(运动者最好持有刚体)
经常不运动的情况下,刚体插件容易休眠,休眠之后就不会进行碰撞检测,所以一般放在运动物体之上。
碰撞器分为2D和3D的两种碰撞器
使用Input.GetAxisRaw/GetAxis 来获取在水平和垂直轴上的输入状态(有输入为1没有则为-1)
使用sprite组建来控制目标显示的图形
通过添加Spirte数组来控制图形的改变和显示
不要忘记锁上刚体组件的Z轴(2D游戏)
fixedUpdate (固定物理帧):
电脑与电脑之间每一帧运行的时间不一致,如果在FIXEDUPDATE里执行,每一帧所占用的时间是固定的,FixedUpdate固定在Update之后执行。
当有刚体影响时,最好在FixedUpdate里执行更新,这可以保证每帧的受力均匀
考试重点
碰撞检测:发生碰撞的两方都要有碰撞体,其中一方要有刚体,还有最好是运动的一方(因为刚体长期不用就会休眠)
碰撞检测有2D和3D的区别 应该对应起来
没有加Boxcllide2D就可以让玩家穿过
遇到的问题是
1玩家会斜着走,玩家体验不理想(改进的方法是player的rigid body上的constriaints的z 轴选上)
2还有碰到别的物体时会有抖动(是因为加上刚体之后在Update中每一帧的受力不同,但是在fixUpdate中就可以每一帧都相同)(改进方法是Player脚本用一个生命周期函数改进FixUpdate也叫固定物理针,然后将所有的方法放到固定物理针中就可以了,就不会发生都懂的情况了,但是也只是解决了大部分问题而已,有些小的问题还要用其他方法解决
玩家按键盘的时候可能会同时按下几个键导致游戏人物斜着z
碰撞添加,两个关键组件
boxcollider2d 碰撞检测
rigidbody2d 二维刚体
固定物理桢(防抖,按照每帧运行,)
private void FixedUpdate()
1. 发生碰撞的条件:两者身上都有碰撞器,且至少一者身上有刚体
2. 刚体一般添加给运动的一方,因为物体物体长时间不运动时,其刚体组件会休眠,导致无法发生碰撞检测
3. 生命周期函数 FixedUpdate(),再Update()之后执行
4. FixedUpdate()和Update()说明:
①FixedUpdate():固定物理帧,每帧大小一致;物体受力不变,碰撞时不会发生抖动
②Update()每帧大小不一致,且因设备而异;物体受力发生改变,碰撞时会发生抖动
刚体挂在移动的物体上
另一个挂碰撞器
碰撞检测条件,两个物体中必须有collider+其一RigidBody
FixedUpdate{}固定侦,解决碰撞
重点课时
碰撞器添加
发生碰撞检测的条件
1.两个身上都要有碰撞器
2.运动的一方身上要有刚体(不然会休眠)
碰撞器分两大类
1.3D碰撞器
2.2D碰撞器
小知识;在菜单上面做操作是不会影响预制体的,要在预制体上做操作,这样就会自动复制在克隆体上面,或者菜单里面按Apply
2D游戏应该调整重力 不然会往下掉Gravity Scale
Consraints 应该锁上Z轴,不然会发生碰撞旋转
private void FixedUpdate() //固定物理帧 这样子每一秒的帧数都是固定的,匀称的
(防止鬼畜!解决抖动效果)
两方都有碰撞器,运动的一方要有刚体。
碰撞体分两类为2D和3D
1. 发生碰撞,2个碰撞物品都要有碰撞器
2. 其中一方要有刚体
3. 刚体最好是运动的一方
FixedUpade():固定物理睁,每睁占用的时间是相同的;
运动的一方一定要刚体
碰撞的两方,都要有碰撞器