编写一个简单的鼠标打飞碟(Hit UFO)游戏
游戏内容要求:
- 游戏有 n 个 round,每个 round 都包括10 次 trial;
- 每个 trial 的飞碟的色彩、大小、发射位置、速度、角度、同时出现的个数都可能不同。它们由该 round 的 ruler 控制;
- 每个 trial 的飞碟有随机性,总体难度随 round 上升;
- 鼠标点中得分,得分规则按色彩、大小、速度不同计算,规则可自由设定。
游戏的要求:
- 使用带缓存的工厂模式管理不同飞碟的生产与回收,该工厂必须是场景单实例的!具体实现见参考资源 Singleton 模板类
- 尽可能使用前面 MVC 结构实现人机交互与游戏模型分离
游戏实现
这次游戏的实现依然采用MVC架构,在此基础上增加一个带缓存的UFO工厂(UFOFactory),用于管理UFO的生产与回收。有了UFO工厂,可以有效减少对象的创建和销毁所带来的开销。
UFO工厂
定义了如何产生和回收一个游戏对象UFO。利用List集合,将buf作为缓存。
用随机数使得每个UFO产生的颜色、位置、角度等都有所不同。
public class UFOFactory : MonoBehaviour {
public List<GameObject> used = new List<GameObject>();
public List<GameObject> buf = new List<GameObject>();
// 产生UFO
public void produceUFO() {
GameObject ufo;
if (buf.Count == 0) {
ufo = Instantiate<GameObject>(Resources.Load<GameObject>("Prefabs/UFO"), Vector3.zero, Quaternion.identity);
}
else {
ufo = buf[0];
buf.RemoveAt(0);
}
float x = Random.Range(-10.0f, 10.0f);
// 随机产生位置
ufo.transform.position = new Vector3(x, 0, 0);
// 随机角度
ufo.transform.Rotate(new Vector3(x < 0? -x*9 : x*9, 0, 0));
float r = Random.Range(0f, 1f);
float g = Random.Range(0f, 1f);
float b = Random.Range(0f, 1f);
Color color = new Color(r, g, b);
// 随机产生颜色
ufo.transform.GetComponent<Renderer>().material.color = color;
used.Add(ufo);
}
// 回收UFO
public void recycleUFO(GameObject obj) {
obj.transform.position = Vector3.zero;
buf.Add(obj);
}
}
模板类Singleton
保证工厂是场景单实例的。详细参照模板类Singleton。
public class Singleton<T> : MonoBehaviour where T : MonoBehaviour {
protected static T instance;
public static T Instance {
get {
if (instance == null) {
instance = (T)FindObjectOfType (typeof(T));
if (instance == null) {
Debug.LogError ("An instance of " + typeof(T) +
" is needed in the scene, but there is none.");
}
}
return instance;
}
}
}
场景控制器FirstSceneController
最高层的控制器,主要包含UFO工厂、动作控制器。
在场景控制器中控制UFO的产生(每次随机产生1~3个);同时记录分数(score)、关数(round)等。
public interface MyUserAction {
void Restart();
void Pause();
}
public interface MySceneController {
void GenGameObjects();
}
public class FirstSceneController : MonoBehaviour, MyUserAction, MySceneController {
public ActionController actionCtrl;
public GameObject disk;
protected UFOFactory factory;
public int flag =