【unity】学习制作2D横板冒险游戏-4-

敌人的基本逻辑和动画

创建文件如图所示

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的初始值,问题一解决

添加如下代码,动画问题解决

posted @ 2025-03-29 15:38  plusu  阅读(72)  评论(0)    收藏  举报