牧师与魔鬼动作分离版

本次工作对上次的《牧师与魔鬼》进行了部分代码重构,作出了以下完善:
1、用CCMove来封装角色和船只的移动,不需要在模型类中设置复杂的动作逻辑,也不需要再场景控制器中显式地调用移动函数。

2、使用CCActionManager来管理所有模型的移动,场景管理器只需要实例化一个CCActionManager对象即可,然后它会自动生成和销毁CCMove对象,管理各个物体的移动。

3、定义了回调函数,CCMove可以通过回调函数提醒CCActionManager自己完成了移动,后者收到消息后打印相应信息并销毁对应的CCMove对象。

github仓库:GitHub - MCbrandon2003/SSAction: 魔鬼与牧师动作分离版

以下是相关代码的摘要:

代码文件1:IUserAction.cs

该代码文件定义了一个接口 `IUserAction`,包含了两个方法 `GameOver()` 和 `RestartGame()`。这个接口可能用于游戏开发中的用户操作相关的逻辑。`GameOver()` 方法用于处理游戏结束的逻辑,`RestartGame()` 方法用于处理重新开始游戏的逻辑。

代码文件2:SSAction.cs

该代码文件定义了一个名为 `SSAction` 的类,继承自 `ScriptableObject`。该类包含了一些属性和方法,用于管理游戏中的动作。

属性包括:
- `enable`:标识动作是否启用的布尔值。
- `destroy`:标识动作是否需要销毁的布尔值。
- `gameobject`:动作所属的游戏对象。
- `transform`:动作所属的变换组件。
- `callback`:动作完成后的回调接口。
- `model`:管理该动作的脚本组件。

方法包括:
- `Start()`:启动动作的方法,通常在动作开始时调用。
- `Update()`:更新动作的方法,通常在每一帧调用。

该类是一个基础类,`Start()` 和 `Update()` 方法均抛出了 `System.NotImplementedException` 异常,意味着这两个方法需要在子类中进行具体实现。这样的设计允许在子类中根据具体的游戏需求重写这两个方法,实现不同的动作行为。

代码文件3:SSActionManager.cs

该代码文件定义了一个名为 `SSActionManager` 的类,继承自 `MonoBehaviour`。该类用于管理游戏中的动作。

类中包含以下字段:
- `actions`:一个字典,用于存储动作的唯一标识和对应的 `SSAction` 对象。
- `waitingAdd`:一个列表,用于存储等待添加的动作。
- `waitingDelete`:一个列表,用于存储等待删除的动作的标识。

方法包括:
- `RunAction()`:运行动作的方法。接收一个 `MonoBehaviour` 实例、一个 `SSAction` 实例和一个 `ISSActionCallback` 实例作为参数。根据传入的实例类型,设置动作的相关属性,并调用动作的 `Start()` 方法。
- `Update()`:空方法,每帧调用。

代码文件4:CCMove.cs

该代码文件定义了一个名为 `CCMove` 的类,继承自 `SSAction`。该类用于实现角色和船的移动动作。

类中包含以下字段:
- `target`:目标位置的坐标。
- `speed`:移动的速度。
- `over`:标识移动动作是否完成的布尔值。

方法包括:
- `GetSSAction()`:静态方法,用于创建一个 `CCMove` 实例。接收目标位置和速度作为参数,并设置对应的属性值,然后返回该实例。
- `move_boat()`:移动船的方法。接收一个 `BoatModel` 实例作为参数。检查船是否正在移动或者船上是否有角色,如果是则返回,否则设置船的状态为移动,并通知船上的角色开始移动。
- `move_role()`:移动角色的方法。接收一个 `RoleModel` 实例作为参数。根据角色的状态进行上船或下船的操作。
- `Update()`:重写基类的 `Update()` 方法,实现具体的移动逻辑。根据当前的角色类型,根据速度和方向计算新的位置,并更新角色的位置。如果移动完成,则设置动作状态为完成,并触发回调事件。
- `Start()`:重写基类的 `Start()` 方法,初始化动作状态。

代码文件5:CCActionManager.cs

该代码文件定义了一个名为 `CCActionManager` 的类,继承自 `SSActionManager` 并实现了 `ISSActionCallback` 接口。该类用于管理角色和船的移动动作。

类中包含以下字段:
- `sceneController`:一个 `FirstController` 类型的变量,用于获取场景控制器实例。
- `ccmoves`:一个 `CCMove` 类型的列表,用于存储正在进行的移动动作。

方法包括:
- `Start()`:重写基类的 `Start()` 方法。在该方法中获取当前场景的控制器实例,并将当前的 `CCActionManager` 实例赋值给场景控制器的 `actionManager` 字段。然后初始化 `ccmoves` 列表。
- `Update()`:重写基类的 `Update()` 方法。在该方法中遍历 `ccmoves` 列表,调用每个移动动作的 `Update()` 方法进行更新。
- `Move()`:移动角色或船的方法。接收一个 `MonoBehaviour` 实例作为参数,用于表示要移动的角色或船。在该方法中,遍历 `ccmoves` 列表,检查是否有与传入的实例对应的移动动作,如果有则执行相应的移动操作。如果没有对应的移动动作,则创建一个新的 `CCMove` 实例,并将其添加到 `ccmoves` 列表中。根据传入实例的类型,调用相应的移动方法,并使用 `RunAction()` 方法运行该移动动作。
- `SSActionEvent()`:实现接口的方法,用于处理移动动作完成时的回调事件。在该方法中,移除完成的移动动作,并销毁对应的实例。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值