Manager
GlobaManager
GlobaManager属于一个单例,我们要知道当前场景中模型的数量以及当前场景中模型的面数。
加上一个FPS的参数,就可以大摇大摆的装逼了。
public class GlobalManager : UnityAllSceneSingleton<GlobalManager>
{
public float f_UpdateInterval = 0.5F;
private float f_LastInterval;
private int i_Frames = 0;
private float f_Fps;
public static int verts;
public static int tris;
// Use this for initialization
void Awake()
{
Application.targetFrameRate = 300;
}
void Start ()
{
//loadlevel
//GameManager.Instance.CurStatus = GameManager.Status.LOAD_RESOUCE;
// DataManager dataIns = DataManager.Instance;
//InputListener inputIns = InputListener.Instance;//after that we use event to active
//LayerManager layer = LayerManager.Instance;
f_LastInterval = Time.realtimeSinceStartup;
i_Frames = 0;
//water.SetActive(true);
}
void GetObjectStats() {
verts = 0;
tris = 0;
GameObject[] ob = FindObjectsOfType(typeof(GameObject)) as GameObject[];
foreach (GameObject obj in ob) {
GetObjectStats(obj);
}
}
void GetObjectStats(GameObject obj) {
Component[] filters;
filters = obj.GetComponentsInChildren<MeshFilter>();
foreach( MeshFilter f in filters )
{
tris += f.sharedMesh.triangles.Length/3;
verts += f.sharedMesh.vertexCount;
}
}
void OnGUI()
{
GUI.skin.label.normal.textColor =new Color( 255,255, 255, 1.0f );
GUI.Label(new Rect(0, 10, 200, 200), "FPS:" + (f_Fps).ToString("f2"));
string vertsdisplay = verts.ToString ("#,##0 verts");
GUILayout.Label(vertsdisplay);
string trisdisplay = tris.ToString ("#,##0 tris");
GUILayout.Label(trisdisplay);
}
// Update is called once per frame
void Update ()
{
++i_Frames;
if (Time.realtimeSinceStartup > f_LastInterval + f_UpdateInterval)
{
f_Fps = i_Frames / (Time.realtimeSinceStartup - f_LastInterval);
i_Frames = 0;
f_LastInterval = Time.realtimeSinceStartup;
GetObjectStats();
}
}
}
GameManager
每一个程序中都需要有一个GameManager。用来控制整体的程序流程
写一个枚举类,保存当前程序状态
public enum Status
{
/// <summary>
/// 初始状态
/// </summary>
_NONE =1,
/// <summary>
/// 程序读取状态
/// </summary>
_LOAD_SCENE,
/// <summary>
/// 主程序运行状态
/// </summary>
_START_GAME,
/// <summary>
/// 程序结束状态
/// </summary>
_END_GAME,
}
工具模型的枚举类
这边代码就不贴出来了,关于自己模型的分类。
在GameManager中写出程序初始化是所要加载的场景模型,以及主角模型。
在前文中提到过,因为模型面数比较大,所有模型在场景中的话,会造成场景非常的卡。所以,我在场景初始化的时候,只是加载了场景模型,和第一人称控制器的模型。
public enum Tool
{
_NONE = 1,
。。。
}
public Status CurStatus = Status._NONE;
public Tool CurTool = Tool._NONE;
public GameObject Factory;
public List<GameObject> ToolList;
public GameObject Player;
public Vector3 PlaySetPos;
public GameObject CurToolGameObject;
public bool CurAnimIsPlaying = false;
public override void Awake()
{
base.Awake();
}
void Start()
{
GameObject.Instantiate<GameObject>(Factory);
//foreach (GameObject item in ToolList)
//{
// GameObject.Instantiate<GameObject>(item);
//}
CurTool = Tool._NONE;
GameObject.Instantiate<GameObject>(Player);
Player.transform.localPosition = new Vector3(0, 0, 0);
CurToolGameObject = null;
}
private void Init()
{
//现在的初始化是在GameManager类中,程序完成时应该在AppManager中完成初始化(就是现在Start中的那些)
}
UIManager
因为程序中有一个简单的UI,所以还是写了一个UIManager来管理自己的UI。
本次这个初级的demo使用的UI是NGUI。
(再次说明,所有的Manager都是继承AllSenceSingleton的。都是单例~)
NGUI有什么好处呢,我也不知道,现在没有一个很好的习惯去用哪个,就是觉得这个现在顺手就用了,看客你们想用什么就用什么。
本次的UI根据模型要实现的功能总分为3个界面,
进度条—–这个就不解释了。
开始界面:在开始界面的时候,会有讲解啊什么的,在开始界面的时候,选择场景之后,去异步加载模型,中加入一个进度条场景,尽量的将场景的加载做到平滑。
功能界面。
一共是6个按钮。
自动播放,播放下一步,自动拆解,自动组装,讲解,重新播放。
每次到进入的模型的房间里边,加载模型,并加载功能界面的UI。然后绑定各个按钮的事件。
public class UIManager : UnityAllSceneSingleton<UIManager>, IMessageObject
{
public UIRoot UIRoot;
public List<GameObject> UIButtonList;
public ToolSetButton ToolSetButton;
private static UIManager ins;
public static void Init()
{
ins = UIManager.Instances;
}
void Start()
{
ToolSetButton = new ToolSetButton() { Tool = GameManager.Tool._NONE };
foreach (var item in UIButtonList)
{
item.AddComponent<UIEventListener>();
}
}
void Update()
{
//SetButton();
}
public void GetTest(GameObject a)
{
Debug.Log("Click!");
}
public void GetCurStatus()
{
Debug.Log(GameManager.Instances.CurStatus);
}
public void SetButtonListener()
{
}
public void GetCurTool()
{
Debug.Log(GameManager.Instances.CurTool);
}
public void SetButton()
{
if (ToolSetButton.Tool == GameManager.Tool._NONE)
{
Debug.Log("ToolSetButton is Closed");
foreach (var item in UIButtonList)
{
item.SetActive(false);
}
}
else
{
GameManager.Instances.CurToolGameObject.AddComponent<AnimtionManager>();
foreach (var item in UIButtonList)
{
item.SetActive(true);
UIEventListener.Get(item).onClick = AnimtionManager.Instance.ClickTest;
}
//UIButtonList[0].SetActive(ToolSetButton.SetAssemble);
//UIEventListener.Get(UIButtonList[0]).onClick = AnimtionManager.Instance.ClickTest;
//UIButtonList[1].SetActive(ToolSetButton.SetAutoPlay);
//UIEventListener.Get(UIButtonList[1]).onClick = AnimtionManager.Instance.ClickTest;
//UIButtonList[2].SetActive(ToolSetButton.SetDecompose);
//UIEventListener.Get(UIButtonList[2]).onClick = AnimtionManager.Instance.ClickTest;
//UIButtonList[3].SetActive(ToolSetButton.SetPlayNext);
//UIEventListener.Get(UIButtonList[3]).onClick = AnimtionManager.Instance.ClickTest;
//UIButtonList[4].SetActive(ToolSetButton.SetRestart);
//UIEventListener.Get(UIButtonList[4]).onClick = AnimtionManager.Instance.ClickTest;
//UIButtonList[5].SetActive(ToolSetButton.SetStop);
//UIEventListener.Get(UIButtonList[5]).onClick = AnimtionManager.Instance.ClickTest;
Debug.Log("ToolSetButton is SETED");
}
}
}
未完待续。。。这个其中有很多要去优化的地方,还有代码篇①,单例模型的管理类也没有加上,如果之后有时间,也有人感兴趣的话,我会加上单例的管理类。(进行所有单例的销毁,初始化,单例创建以及销毁的时候通知所有对象)
PS:关于单例的管理类有什么好的想法~可以一起讨论一下啊~(づ ̄ 3 ̄)づ