敌人的基本逻辑和动画
创建文件如图所示
c#文件继承父类Enemy
给boar挂载代码
在敌人脚本中定义基本的变量并实例化
面朝方向
在游戏中我们可以看到野猪的默认方向为左边
此时的transform.localscale的值为1
我们希望当野猪面向右边时facedir的值为1,以此来判断敌人的面朝方向
野猪的的移动代码
野猪的移动代码就是让他向面朝的方向移动,y的速度就是刚体的速度
放到fix update中执行
执行频率:FixedUpdate()以固定频率执行,而Update()的执行频率则取决于帧率。
适用场景:FixedUpdate()更适合用于物理模拟等需要稳定时间步长的场景;而Update()则更适合用于处理与帧率相关的逻辑和更新游戏状态。
给野猪适合的参数
野猪的动画
创建一个新的文件夹来保存动画
给野猪创建一个控制器Animator并安装给野猪
创建动画,分别为Idle Run Walk
状态树和条件如下
继承
在父类中重写函数方法为
public virtual void ****
在子类中通过override调用
public override void ****
在重写的base.Move();相当于执行其父类中的Move()
还可以在后面编写只属于子类的代码
组件(变量)的继承
在C#中,public、protected 和 private 是三个关键的访问修饰符,它们用于定义类成员(如字段、属性、方法等)的可访问性。
public:
当一个成员被声明为 public 时,它可以从任何地方被访问。
protected:
protected 成员只能在同一个类、派生类(子类)或同一个程序集中的其他类中被访问。
private:
private 成员只能被其所在的类访问。
我希望在野猪的脚本中获得敌人脚本中的组件(变量)且不会被其他的非子类脚本获得
野猪移动时动画转换
野猪的地面检查和墙面检查
在之前的脚本中编写了关于地面检测的代码,将代码挂载到野猪身上
地面检测完成,编写关于墙面检测的代码
返回unity我们需要手动去调整插值使碰撞器位于模型的左和右方向上
如何可以自动去匹配呢?
思路如下
我们希望碰撞检测器在我们人物模型碰撞体的左边和右边,因此先获得碰撞体组件
通过uinty面板可以得知碰撞体的坐标如下(🐖的)
我们希望检测器位于碰撞器的左边和右边
因此右边的坐标(人物中心点为0.0)应该为(1.8/2-0.02,1.3/2)
左边坐标x值相反,y值相等
代码如下
运行代码后可以看到,检测器处在了正确的x位置上
但是Y轴的位置与预期不同,y的坐标应该就是0+偏移量
修改代码如下
成功修改后检测器位于正确的位置上、
修改墙体的碰撞
Outlines轮廓,即仅触碰到轮廓检测
Polygons多边形,即触碰到轮廓组成的多边形检测(范围更大)
成功,现在猪猪可以检测到墙面了
编辑碰撞墙面返回的代码
现在可以成功反转了,但是反转后可能导致抽搐,原因是检测球一直和墙体重合导致多次反转
修改思路为加一个计时器,检测完成反转后一定时间内无法再进行检测
(思路二为只有面朝的检测器才可以检测)
代码如下
成功解决了野猪的抽搐问题✌
为了游戏的真实性,我希望野猪在碰到墙时可以站立一段时间再转身
代码如下先定义变量
修改撞墙的代码
运行,第一次撞墙没有等待,且野猪等待时动画并没有进行切换
修改waitTimeCounter的初始值,问题一解决
添加如下代码,动画问题解决