编写一个简单的鼠标打飞碟(Hit UFO)游戏
游戏内容要求
- 游戏有 n 个 round,每个 round 都包括10 次 trial
- 每个 trial 的飞碟的色彩、大小、发射位置、速度、角度、同时出现的个数都可能不同。它们由该 round 的 ruler 控制
- 每个 trial 的飞碟有随机性,总体难度随 round 上升
鼠标点中得分,得分规则按色彩、大小、速度不同计算,规则可自由设定
游戏的要求
使用带缓存的工厂模式管理不同飞碟的生产与回收,该工厂必须是场景单实例的!
- 尽可能使用前面 MVC 结构实现人机交互与游戏模型分离
游戏实现
总的来说,这次代码写的比较随意,冗余部分过多,而且没有很好的组织结构,函数的布置相对来说有点混乱,所以为了弥补这方面的不足,尽量做了好看的效果,加了一点粒子系统,当然也是参考了往届的博客。
文件结构
文本结构
资源结构
预制结构
c#文件
DiskFactory
单例模式,得到飞碟id,得到飞碟对象,释放飞碟对象,为了避免开销大的问题,没有用destory,而是设置为diskList[id].SetActive(false);
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class DiskFactory : System.Object
{
private static DiskFactory _instance;
private static List<GameObject> diskList;
public GameObject disk;
public static DiskFactory getInstance()
{
if (_instance == null)
{
_instance = new DiskFactory();
diskList = new List<GameObject>();
}
return _instance;
}
public int getDiskId()
{
for (int i = 0; i < diskList.Count; ++i)
{
if (!diskList[i].activeInHierarchy)
{
return i;
}
}
diskList.Add(GameObject.Instantiate(disk) as GameObject);
return diskList.Count - 1;
}
public GameObject getDiskObject(int id)
{
if (id > -1 && id < diskList.Count)
{
return diskList[id];
}
return null;
}
public void free(int id)
{
if (id > -1 && id < diskList.Count)
{
diskList[id].GetComponent<Rigidbody>().velocity = Vector3.zero;
//diskList[id].rigidbody.velocity = Vector3.zero;
diskList[id].transform.localScale = disk.transform.localScale;
diskList[id].SetActive(false);
}
}
}
DiskFactoryController
初始化disk,这次程序中的所有初始化,都是在类中声明为public,然后将预制拖到文件当中,而没有用Instantiate
函数,感觉这样比较符合我的编程习惯。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DiskFactoryController : MonoBehaviour
{
public GameObject disk;
void Awake()
{
DiskFactory.getInstance().disk = disk;
}
}
FirstController
包括场景的设置,发射飞碟的提示,发射飞碟,释放飞碟,得分。
- 发射飞碟,大小,颜色,位置,方向都是随机的,但是没有与分数挂钩,都是打中一个得十分,每回合打完第十次进入下一回合,打完三回合,结束游戏。
FixedUpdate
中用timeToNextEmission -= Time.deltaTime
实现倒计时。
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class FirstController : MonoBehaviour
{
public Color[] TotalColor = {Color.black,Color.blue,Color.cyan,Color.green,Color.grey,Color.red,Color.yellow };
public float EmissionDelay = 1f;
public float timeToNextEmission;
private bool isCounting;
private bool isShooting;
public bool getIsCounting() { return isCounting; }
public bool getIsShooting() { return isShooting; }
private List<GameObject> disks = new List<GameObject>();
private List<