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

制作于2017年12月23日

价格 免费

发生碰撞检测的两个必要条件:

两方都要有刚体

其中一方要有刚体,最好是运动的一方(因为刚体如果经常不运动就会发生休眠,这就不会发生碰撞检测了)

 

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会因为系统性能产生抖动的现象

[展开全文]

1. 发生碰撞的条件:两者身上都有碰撞器,且至少一者身上有刚体

 

2. 刚体一般添加给运动的一方,因为物体物体长时间不运动时,其刚体组件会休眠,导致无法发生碰撞检测

 

3.  生命周期函数 FixedUpdate(),再Update()之后执行

 

4.  FixedUpdate()和Update()说明:

     ①FixedUpdate():固定物理帧,每帧大小一致;物体受力不变,碰撞时不会发生抖动

     ②Update()每帧大小不一致,且因设备而异;物体受力发生改变,碰撞时会发生抖动 

[展开全文]

考试重点

碰撞检测:发生碰撞的两方都要有碰撞体,其中一方要有刚体,还有最好是运动的一方(因为刚体长期不用就会休眠)

碰撞检测有2D和3D的区别 应该对应起来

没有加Boxcllide2D就可以让玩家穿过

 

遇到的问题是

1玩家会斜着走,玩家体验不理想(改进的方法是player的rigid body上的constriaints的z 轴选上)

2还有碰到别的物体时会有抖动(是因为加上刚体之后在Update中每一帧的受力不同,但是在fixUpdate中就可以每一帧都相同)(改进方法是Player脚本用一个生命周期函数改进FixUpdate也叫固定物理针,然后将所有的方法放到固定物理针中就可以了,就不会发生都懂的情况了,但是也只是解决了大部分问题而已,有些小的问题还要用其他方法解决

玩家按键盘的时候可能会同时按下几个键导致游戏人物斜着z

[展开全文]

FixedUpdate():固定物理帧;每帧都是执行固定的;

[展开全文]

固定物理帧

private void FixedUpdate(){添加刚体物体的所有指令}

[展开全文]

碰撞

box  

刚体

ridibody

对于刚体碰撞抖动的问题,因为Time.deltaTime 所应用的每一帧的运行和电脑性能有关,导致时间不同所受的力也不同 要用FixedUpdate固定 物理帧的更新函数解决问题。和Time.fixedTime

 

[展开全文]

碰撞添加,两个关键组件

boxcollider2d 碰撞检测

rigidbody2d  二维刚体

 

 

固定物理桢(防抖,按照每帧运行,)

 private void FixedUpdate()

 

[展开全文]

发生碰撞的两个物体必须都要持有碰撞器
其中之一(运动者最好持有刚体)

经常不运动的情况下,刚体插件容易休眠,休眠之后就不会进行碰撞检测,所以一般放在运动物体之上。

碰撞器分为2D和3D的两种碰撞器

使用Input.GetAxisRaw/GetAxis 来获取在水平和垂直轴上的输入状态(有输入为1没有则为-1)
使用sprite组建来控制目标显示的图形
通过添加Spirte数组来控制图形的改变和显示

 

不要忘记锁上刚体组件的Z轴(2D游戏)

 

fixedUpdate (固定物理帧):

电脑与电脑之间每一帧运行的时间不一致,如果在FIXEDUPDATE里执行,每一帧所占用的时间是固定的,FixedUpdate固定在Update之后执行。

 

当有刚体影响时,最好在FixedUpdate里执行更新,这可以保证每帧的受力均匀

[展开全文]

碰撞事件,需要有碰撞器,至少有一方是有刚体的,最好是运动的一方

防止抖动方法,FixedUpdate

[展开全文]

两方都有碰撞器,运动的一方要有刚体。

碰撞体分两类为2D和3D

 

[展开全文]

碰撞器的条件:要有刚体,一方是运动的(有时会休眠)

抖要放入fixupdat里

[展开全文]

碰撞检测:双方都有碰撞器(box collider 2D)

运动的一方设为刚体(rigidbody 2D)

[展开全文]

碰撞器的生成

二者都要有碰撞器

其中一方(运动的一方)要有缸体

fixedupdate 物理针

是每一秒受力固定

缸体碰撞受力使物体发生抖动,添加物理针处理

未加物理针

void Update ()
    {
        float h = Input.GetAxisRaw("Horizontal");
        transform.Translate(Vector3.right * h * movespeed * Time.deltaTime, Space.World);
        if (h < 0)
        {
            sr.sprite = tanksprite[3];
        }
        else if (h > 0)
        {
            sr.sprite = tanksprite[1];
        }
        float v = Input.GetAxisRaw("Vertical");
        transform.Translate(Vector3.up * v * movespeed * Time.deltaTime, Space.World);
        if (v < 0)
        {
            sr.sprite = tanksprite[2];
        }
        else if (v > 0)
        {
            sr.sprite = tanksprite[0];
        }

    }

添加物理针

  private void FixedUpdate()
    {
        float h = Input.GetAxisRaw("Horizontal");
        transform.Translate(Vector3.right * h * movespeed * Time.fixedDeltaTime, Space.World);
        if (h < 0)
        {
            sr.sprite = tanksprite[3];
        }
        else if (h > 0)
        {
            sr.sprite = tanksprite[1];
        }
        float v = Input.GetAxisRaw("Vertical");
        transform.Translate(Vector3.up * v * movespeed * Time.fixedDeltaTime, Space.World);
        if (v < 0)
        {
            sr.sprite = tanksprite[2];
        }
        else if (v > 0)
        {
            sr.sprite = tanksprite[0];
        }
    }

[展开全文]

碰撞检测

1 添加碰撞器,运动的一方最好有刚体(必须有一方有)   经常性不运动时刚体会休眠

2. 2D与3D 碰撞器不一样 

3。最好直接在预制体上操作

4 添加刚体 2D给玩家,记得把重力调为0

把所有map预制体都加上碰撞器(草不用)  小技巧 全选后一起加

穿模问题 碰到map时方向乱套(受到旋转力)  将player刚体中的constraints  勾选Z轴

沿墙走时抖动(帧时间不同问题)  在玩家代码中 添加FixedUpdate(固定物理帧) 把所有有关移动的方法移到里面

并将Tima.deltaTime 改为Tima.fixedDeltaTime注意D大写

[展开全文]

都要有碰撞器,一方要有刚体,最好是运动的

[展开全文]

授课教师

SiKi学院老师

课程特色

图文(1)
视频(32)
下载资料(1)