在本次实验中,我们尝试用unity开发小游戏牧师与魔鬼,并对其进行改进。
游戏介绍
牧师与魔鬼》是一款经典的过河游戏。在河的一边有三个魔鬼、三个牧师以及一条船。船最多可以承载两个角色(牧师或魔鬼)且必须承载一个角色。游戏的目标是帮助3个牧师和3个魔鬼渡河,但要注意魔鬼数量不能多于牧师数量,否则游戏失败。
视频链接:https://www.bilibili.com/video/BV1PMS8Y9Ef1/?spm_id_from=333.999.0.0
动作分离
本次作业提出了动作分离的要求。动作分离即把每个需要移动的游戏对象的移动方法提取出来,建立一个动作管理器来管理不同的移动方法。这样的做法可以提高代码的可维护性和重用性。对代码进行改进后的UML图如下:

游戏实现
首先我们需要定义一些接口:
using UnityEngine;
using ControllerApplication;
namespace InterfaceApplication
{
//场景接口
public interface ISceneController
{
void LoadResoureces();
}
//用户动作接口
public interface IUserAction
{
void moveBoat();
void moveRole(RoleModel role);
void reStart();
int check();
}
}
游戏中,我们实现牧师、魔鬼和船的运动,都是靠MoveController来完成的。代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Move : MonoBehaviour
{
float moveSpeed = 150f;
int moveSign = 0;
Vector3 endPos, midPos;
void Update()
{
if (moveSign == 1)
{
transform.position = Vector3.MoveTowards(transform.position, midPos, moveSpeed * Time.deltaTime);
if (transform.position == midPos)
{
moveSign = 2;
}
}
else if (moveSign == 2)
{
transform.position = Vector3.MoveTowards(transform.position, endPos, moveSpeed * Time.deltaTime);
if (transform.position == endPos)
{
moveSign = 0;
}
}
}
public void MovePosition(Vector3 position)
{
endPos = position;
if (position.y == transform.position.y)
{
moveSign = 2;
return;
}
else if (position.y < transform.position.y)
{
midPos = new Vector3(position.x, transform.position.y, position.z);
}
else
{
midPos = new Vector3(transform.position.x, position.y, position.z);
}
moveSign = 1;
}
}
实现点击角色时角色的移动:
using UnityEngine;
using ControllerApplication;
using InterfaceApplication;
public class Click : MonoBehaviour
{
IUserAction action;
RoleModel role = null;
BoatModel boat = null;
public void setRole(RoleModel role)
{
this.role = role;
}
public void setBoat(BoatModel boat)
{
this.boat = boat;
}
void Start()
{
action = SSDirect.getInstance().CurrentSceneController as IUserAction;
}
void OnMouseDown()
{
if (boat == null && role == null) return;
if (role != null) action.moveRole(role);
else if (boat != null) action.moveBoat();
}
}
至此可以实现游戏的基本功能。
1579

被折叠的 条评论
为什么被折叠?



