【Unity3D】与游戏世界交互

编写一个简单的鼠标打飞碟(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 = 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值