改进飞碟(Hit UFO)游戏:
游戏内容要求:
1.按 adapter模式 设计图修改飞碟游戏
2.使它同时支持物理运动与运动学(变换)运动
主要代码实现思路
1.这里用了两个工厂类来管理飞碟和控制飞碟运动的脚本的生成和回收,它们的实现的代码类似,以下是飞碟工厂的代码片段:
private Dictionary<int, SSAction> used = new Dictionary<int, SSAction>();
private List<SSAction> free = new List<SSAction>();
private List<int> wait = new List<int>();
所有正在使用的飞碟都保存在used
未被激活的飞碟保存在free
wait是用来保存等待释放的飞碟
private void Update()
{
foreach (var tmp in used.Values)
{
if (!tmp.gameObject.activeSelf)
{
wait.Add(tmp.GetInstanceID());
}
}
foreach (int tmp in wait)
{
FreeDisk(used[tmp].gameObject); //释放一个飞碟
}
wait.Clear();
}
以上代码用来实现飞碟的自动回收,通过飞碟是否活跃,来判断是否回收
2.这里还实现了两个管理动作的类,一个是管理运动学的动作CCActionManager,另外一个是动力学的动作PhysicActionManager,它们实现的代码也基本相似,下面是
CCActionManager的一些代码片段
private Dictionary<int, SSAction> actions = new Dictionary<int, SSAction>(); //保存所以已经注册的动作
private List<SSAction> waitingAdd = new List<SSAction>(); //动作的等待队列,在这个对象保存的动作会稍后注册到动作管理器里
private List<int> waitingDelete = new List<int>(); //动作的删除队列,在这个对象保存的动作会稍后删除
protected void Update()
{
foreach (SSAction ac in waitingAdd) actions[ac.GetInstanceID()] = ac;
waitingAdd.Clear();
//管理所有的动作,如果动作被标志为删除,则把它加入删除队列,被标志为激活,则调用其对应的Update函数
foreach (KeyValuePair<int, SSAction> kv in actions)
{
SSAction ac = kv.Value;
if (ac.destroy)
{
waitingDelete.Add(ac.GetInstanceID());
}
else if (ac.enable)
{
ac.Update();
}
}
//把删除队列里所有的动作删除
foreach (int key in waitingDelete)
{
SSAction ac = actions[key];
actions.Remove(key);
DestroyObject(ac);
}
waitingDelete.Clear();
}
CCActionManager动作管理器通过以下代码把一个动作和一个对象给关联起来
public void RunAction(GameObject gameobject, SSAction action, ISSActionCallback manager)
{
action.gameobject = gameobject;
action.transform = gameobject.transform;
action.callback = manager;
waitingAdd.Add(action);
action.Start();
}
实现结果图
总结
这次主要是用上次代码加以改进,加入物理引擎,总体代码量减少不少,但是学到的东西却是挺多的。