26821人加入学习
(150人评价)
Unity2D 初级案例 - 坦克大战(Unity2017.1)

制作于2017年12月23日

价格 免费

碰撞检测:

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():固定物理睁,每睁占用的时间是相同的;

[展开全文]

授课教师

SiKi学院老师

课程特色

图文(2)
视频(31)
下载资料(1)