打飞碟游戏改进版----动作与物理分离版
本次作业主要是要添加一个管理物理动作的动作管理器CCPhysicsActionManager,并且通过添加按钮来决定选择哪一种创造飞碟的方式。因此在游戏的初始阶段有2中选择,一种是飞碟的运动将以运动的方式形成,另外一种是飞碟会以物理的方式形成,采用适配器模式,因此需要新建一个公共接口IActionManager,用来确定游戏开始的时候选择哪一种动作管理器。
游戏的初始接口效果图如下所示:
适配器模式的UML图的设计如下所示:
接下来是各个相关类修改后的方法,及其代码,因为代码和之前的设计有很多相似的地方,所以这里只分析修改过和新添加的代码,不做重复,相关可以参考上一次的作业:Unity3D课程学习笔记(四)
下面是一个公共的接口IActionManager,是CCActionManager和CCPhysicsActionManager需要实现的,在场景控制器中通过定义IActionManager和选择相应的按钮,可以选择使用运动学方式还是物理学方式:
public interface IActionManager
{
int getDiskNumber();
void setDiskNumber(int _diskNumber);
void StartThrow(Queue<GameObject> diskQueue);
}
然后是CCActionManager的代码,基本上跟上次的没有什么改变,但是在这个类的代码里面添加了一个延迟执行Start的方法,因为我需要在开始的时候通过按钮来选择相应的模式,但是又不能在Update中时刻检测这个状态码的改变,所以只好采用这种方式,具体的代码如下所示:
public class CCActionManager : SSActionManager, ISSActionCallback, IActionManager
{
public FirstSceneController sceneController;
public List<CCFlyAction> Fly;
private int DiskNumber = 0;
//private bool isFirstEnter = true;
private List<SSAction> Used = new List<SSAction>();
private List<SSAction> Free = new List<SSAction>();
public void setDiskNumber(int _diskNumber)
{
DiskNumber = _diskNumber;
}
public int getDiskNumber()
{
return DiskNumber;
}
//GetSSAction,首先从工厂里面找,如果没有的话就创造
SSAction GetSSAction()
{
SSAction action = null;
if (Free.Count > 0)
{
action = Free[0];
Free.Remove(Free[0]);
}
else
{
action = ScriptableObject.Instantiate<CCFlyAction>(Fly[0]);
}
Used.Add(action);
return action;
}
//FreeSSAction
public void FreeSSAction(SSAction action)
{
SSAction temp = null;
foreach (SSAction disk in Used)
{
if (action.GetInstanceID() == disk.GetInstanceID())
{
temp = disk;
}
}
if (temp != null)
{