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

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 ̄)づ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值