Unity2D学习笔记 | 《勇士传说》教程 | (三)

(一)敌人基本动画与物理判定

        敌人的控制脚本包括相同和不同的部分,所以可以以各个敌人脚本继承同一个基类的结构编写控制逻辑。墙面等物体的碰撞体绘制默认按照像素进行,因此会有不规则的地方,可以在对应Sprite Editor中对物理形状进行修改,将其改为规则的物理形状。

        野猪行动应当检测是否撞到墙体,因此可以在之前物理检测的基础上添加对碰撞体左右两侧的检测,如果希望检测偏移量根据碰撞体大小自动变化,可以使用碰撞体的bounds参数计算。如果出现野猪撞墙却没有检测到左(右)侧碰撞,说明Physics2D.OverlapCircle的检测范围越过了墙壁碰撞体,由于野猪的碰撞位置取决于其下部的矩形碰撞体,所以将检测圆心调整为与矩形两边同轴即可。也可在障碍物的Composite collider 2d中设置geometry type为polygons,使其判定更改为整个碰撞体而非只有边缘

(如果unity报错:Object reference not set to an instance of an object UnityEditor.Graphs.Edge.WakeUp (),重启就好了)

        向受伤和死亡之类的所有敌人都通用的动画逻辑就可以写在父类中,效果和玩家受伤一样,死亡则会自动销毁。

        在进行受伤击退的效果实现时,需要在敌人完成位移后再将其受伤状态解开,其中的时间差可以采用协程来实现。协程的yield return中可以选择对某些程序行为进行等待,包括条件、时间、帧等。使用协程等待一定时间后再取消受伤状态即可。

        对于死亡动画结束后的物体销毁,比起这一状态结束后执行销毁,更直观的方式是在动画中添加事件帧来调用方法,这样当动画播放到对应位置时会自动激活事件执行方法。死亡动画期间野猪的碰撞体仍然能够造成伤害,可以通过在设置的Physics 2D中的player与ignore raycast的碰撞取消,并将死亡敌人的物理图层gameObject.layer修改为ignore raycast,这样死亡期间野猪碰撞体就不会对玩家进行检测。

(二)使用有限状态机和抽象类多态

        有限状态机采用抽象类来构造.方法可以用abstract或virtual修饰,前者需要被其他类的方法所实现,而后者则表示该方法可以被子类override。

        基本的状态机结构由Enter,Update和Exit三部分组成,其中Update承载该状态需要重复执行的部分,使用时则通过其他脚本中实例化的状态机进行调用,不改变代码功能,而是根据情况切换状态从而切换功能。

        不知为何开始游戏时,一定有一帧野猪在地面的物理检测为false,导致一开始就触发了悬崖掉头的功能,暂时先通过在awake中赋初值来解决。

(三)转换到追击状态

        野猪追击前需要先检测前方一定距离内是否有玩家存在,可通过射线或区域检测的方式进行。教程中采用Physics2D.BoxCast进行检测,这是一种检测前方方形射线区域内物体的方法。Physics2D.BoxCast的检测相当于发射一个倾斜的矩形来进行碰撞,其参数包括中心、尺寸、倾斜角度、发射方向、飞行距离和检测图层,返回一个RaycastHit2D的类型,其中包括了碰撞的相关信息,也可直接判断是否存在碰撞。

        状态机的整体思路,是作为一个依附于控制脚本的类,在状态机中不进行具体的计算,而是根据控制脚本等提供的参数进行数值、动画等的控制。

        为了方便管理,所有的枚举类型可以放到同一个脚本文件中,通过其名称进行调用,状态的切换控制也要借助枚举来进行。用枚举变量指引如何进行转换,并依次调用状态的退出和进入。

        为了让玩家逃跑后,野猪能够返回到巡逻状态,需要为其设置一个新的计数器,拉脱后开始计时,令野猪在计时结束后切换回巡逻模式。

(四)其他敌人的制作

        害怕某些必要组件忘记添加,可以在脚本中使用[RequireComponent]标注来自动补全所需组件。此标注位于类名前,对子类一样有效。

        当希望制作根据动画播放情况进行对应行为的控制逻辑时,可以以动画逻辑分割成数个动画片段,并形成数个状态,由代码控制尽在某些状态执行某些操作,比如检查当前动画控制器状态属性。

        inspector中的layer常常被用作各种物理组件的检测图层,当需要限制条件时很好用。

        当移动、攻击等实现方式与之前的敌人不同时,应对对应方法override来重新设计逻辑。    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值