UML_20_07_2016.png

Unity游戏程序的架构其实很蒙糊、很多设计模式都用不上、因为Unity已经封装好很多方法。

 

游戏物件

游戏里主要有5个物件。

1. _managerController.cs 游戏管理器。负责控制响应式UI、取得用户的手机长宽比、控制游戏去哪一个场景等。

2. _GameController.cs 游戏进程控制器。负责控制游戏的得分、生成敌人、生成食物、如果玩家死亡停止游戏、重新开始游戏等。

3. _CharacterController.cs 玩家角色。 角责控制玩家移动、角色生命值等。

4. _Enemy.cs 敌人角色。 角责控制敌人移动、是否击中玩家等。

5. _food.cs 食物。 角责控制食物出现位置、是否被玩家吃掉等。

 

设计模式

这里用了单例模式和工厂模式。

_GameController.cs 和 _GameControllerDAO.cs

_Enemy.cs 和 _EnemyState.cs 和 _EnemyDAO.cs

_CharacterController.cs 和 _CharacterData.cs

_managerController.cs

_food.cs

 

一些特别学习的东西

_managerController里要做到响应式UI、要自己计算、用GUILayout太辣鸡。
p_stBtnStyle.fontSize  = Mathf.FloorToInt((( p_flScreenWidth / p_flScreenHeight ) * p_flStartBtnFontSize) / (p_flScreenWidthTest/ p_flScreenHeightTest));
这个就是响应式字体大小的公或。

在4.15要获得一个GameObject里的Component是这样。
p_textMark = GameObject.FindWithTag("score").GetComponent<GUIText>() as GUIText;

在_CharacterController里、要设置一个GameObject的位置。
g_goCharacter.transform.position = new Vector3(p_douMainPosX, p_douMainPosY, p_douMainPosZ);

在_food里、从阵列中随机抽取一个元素。
private float[] p_arrflPos = new float[] {-25, 0.01f, 25};
p_flFoodPosX = p_arrflPos[Random.Range(0,p_arrflPos.Length)];

在_Enemy里、用Instantiate生成一个敌人。
// 空物件
private GameObject p_goEnemyClone;
// Prefabs Object 的 Transform 
private static Transform p_trEnemy;
// 连接GameObject 
p_trEnemy = p_goEnemy.transform;
// 生成敌人
p_goEnemyClone = (GameObject)Instantiate(p_goEnemy, new Vector3(p_flEnemyPosX, p_flEnemyPosY, p_flEnemyPosZ), p_trEnemy.transform.rotation);
// 每个敌人勾上新的程序来移动
p_goEnemyClone.AddComponent("_EnemyState");

在_EnemyState里、在Update里加上移动、那敌人就会自己动
transform.Translate (0.0f, p_flTransfromPosZ, 0.0f);

在DAO类里。
public int intMark {
    get {return p_intMark; }
    set {p_intMark = value; }
}

 

关於架构

这里用的工厂模式不太正统、应该是有DAO类和Insert()、Change()这些类、来解耦程序!

可我把这2个用一个DAO来做、属於Model 1的做法、这样另一个Class、如_managerController需要_GameController.cs 的data、就要直接访问_GameControllerDAO.cs的getter()和setter()方法、这样只能用於小游戏。

单例模式用於_GameController.cs 、_managerController.cs、_CharacterController.cs和_food.cs、因为场景只有1个、别浪费资源。而_Enemy.cs 有多个、则不适用。

 

总结

Unity很方便地封装了所有方法、也用Component方法来架构、这令开发方便、架构困难。特别是用MVC或者设计模式、令所有东西的味道都奇怪。

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 kk匡 的頭像
    kk匡

    kk匡的日記&學習筆記

    kk匡 發表在 痞客邦 留言(0) 人氣()