初级UnityDemo全纪录(二):代码篇②

来源:互联网 发布:9377端口烈焰手游官网 编辑:程序博客网 时间:2024/06/05 07:09

Manager

GlobaManager

GlobaManager属于一个单例,我们要知道当前场景中模型的数量以及当前场景中模型的面数。
加上一个FPS的参数,就可以大摇大摆的装逼了。

using UnityEngine;using System.Collections;using UnityEngine.UI;public class GlobaManager : UnityAllSceneSingleton<GlobaManager>{    public Text _Text;    //刷新频率    public float f_Updateinteral = 0.5f;    //上一帧的刷新频率    private float f_LastInterval;    //总帧数    private int i_Frames = 0;    //平均帧数    private float f_FPS;    //当前定点数+    public static int verts;    //当前面数    public static int tris;    void Awake()    {        Application.targetFrameRate = 45;    }    void Start()    {        UIManager.Init();        f_LastInterval = Time.realtimeSinceStartup;        i_Frames = 0;        //Debug.Log(ResourceManager.Instances.LoadModelObj("Cube"));        //GameObject.Instantiate(ResourceManager.Instances.LoadModelObj("Cube"));        //_Text.text = ResourceManager.Instances.LoadTxt ("Air compressor").text;        }    void GetObegectStates()    {        verts = 0;        tris = 0;        GameObject[] ob = FindObjectsOfType(typeof(GameObject)) as GameObject[];        foreach (GameObject obj in ob)        {            GetObjectStates(obj);        }    }    void GetObjectStates(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 vertsisplay = verts.ToString("#,##0 verts");        GUILayout.Label(vertsisplay);        string trisDisPlay = tris.ToString("#,##0 tris");        GUILayout.Label(trisDisPlay);    }    void Update()    {        ++i_Frames;        if (Time.realtimeSinceStartup > f_LastInterval + f_Updateinteral)        {            f_FPS = i_Frames / (Time.realtimeSinceStartup - f_LastInterval);            i_Frames = 0;            f_LastInterval = Time.realtimeSinceStartup;            GetObegectStates();        }    }}

GameManager

using UnityEngine;using System.Collections;using System.Collections.Generic;public class GameManager : UnityAllSceneSingleton<GameManager>,IMessageObject{    public enum Status    {        _NONE =1,        _LOAD_SCENE,        _START_GAME,        _END_GAME,    }    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 LoadScene()    {    }}

每一个程序中都需要有一个GameManager。用来控制整体的程序流程

写一个枚举类,保存当前程序状态

UIManager

因为程序中有一个简单的UI,所以还是写了一个UIManager来管理自己的UI。

本次这个初级的demo使用的UI是NGUI。
(再次说明,所有的Manager都是继承AllSenceSingleton的。都是单例~)

NGUI有什么好处呢,我也不知道,现在没有一个很好的习惯去用哪个,就是觉得这个现在顺手就用了,看客你们想用什么就用什么。

本次的UI根据模型要实现的功能总分为3个界面,

进度条—–这个就不解释了。
开始界面:在开始界面的时候,会有讲解啊什么的,在开始界面的时候,选择场景之后,去异步加载模型,中加入一个进度条场景,尽量的将场景的加载做到平滑。

功能界面。
一共是6个按钮。
自动播放,播放下一步,自动拆解,自动组装,讲解,重新播放。

每次到进入的模型的房间里边,加载模型,并加载功能界面的UI。然后绑定各个按钮的事件。

using UnityEngine;using System.Collections;using System.Collections.Generic;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 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)            {                UIEventListener.Get(item).onClick = AnimtionManager.Instance.ClickTest;                item.SetActive(true);            }            //UIButtonList[0].SetActive(ToolSetButton.SetAssemble);            //UIButtonList[1].SetActive(ToolSetButton.SetAutoPlay);            //UIButtonList[2].SetActive(ToolSetButton.SetDecompose);            //UIButtonList[3].SetActive(ToolSetButton.SetPlayNext);            //UIButtonList[4].SetActive(ToolSetButton.SetRestart);            //UIButtonList[5].SetActive(ToolSetButton.SetStop);            Debug.Log("ToolSetButton is SETED");        }    }}

未完待续。。。这个其中有很多要去优化的地方,还有代码篇①,单例模型的管理类也没有加上,如果之后有时间,也有人感兴趣的话,我会加上单例的管理类。(进行所有单例的销毁,初始化,单例创建以及销毁的时候通知所有对象)
PS:关于单例的管理类有什么好的想法~可以一起讨论一下啊~(づ ̄ 3 ̄)づ

0 0