找回密码
 注册帐号

扫一扫,访问微社区

薛飞 Unity极简网络游戏之简单的UI框架

30
回复
4034
查看
打印 上一主题 下一主题
[ 复制链接 ]
排名
418
昨日变化

20

主题

202

帖子

3947

积分

Rank: 9Rank: 9Rank: 9

UID
686
好友
18
蛮牛币
5299
威望
0
注册时间
2013-7-4
在线时间
1619 小时
最后登录
2019-3-26

专栏作家社区QQ达人

QQ

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
本帖最后由 AWNUXCVBN 于 2018-6-8 19:03 编辑

项目托管在码云上https://gitee.com/awnuxcvbn/Ganghood,如有未涉及到的代码,请下载或直接浏览
这里贴一下项目中简单的UI框架相关代码
[mw_shl_code=csharp,true]using UnityEngine;

/// <summary>
/// 面板基类
/// </summary>
public class PanelBase : MonoBehaviour
{
    //皮肤路径
    //public string skinPath;
    /// <summary>
    /// 面板对象
    /// </summary>
    public GameObject panelObj;
    //层级
    public PanelLayer layer;
    //面板参数
    public object[] args;

    #region 生命周期
    //初始化
    public virtual void Init(params object[] args)
    {
        this.args = args;
    }
    //开始面板前
    public virtual void OnShowing() { }
    //显示面板后
    public virtual void OnShowed() { }
    //帧更新
    public virtual void Update() { }
    //关闭前
    public virtual void OnClosing() { }
    //关闭后
    public virtual void OnClosed() { }
    #endregion

    #region 操作
    /// <summary>
    /// 激活面板
    /// </summary>
    protected virtual void Active()
    {
        string name = this.GetType().ToString();
        PanelMgr.Instance.ActivePanel(name);
    }
    /// <summary>
    /// 隐藏面板
    /// </summary>
    protected virtual void Disable()
    {
        string name = this.GetType().ToString();
        PanelMgr.Instance.DisablePanel(name);
    }
    /// <summary>
    /// 关闭面板
    /// </summary>
    protected virtual void Close()
    {
        string name = this.GetType().ToString();
        PanelMgr.Instance.ClosePanel(name);
    }

    void Close(string name)
    {
        PanelMgr.Instance.ClosePanel(name);
    }

    public virtual void Close(float t)
    {
        Invoke("Close", t);
    }

    #endregion
}

/// <summary>
/// 面板层
/// </summary>
public enum PanelLayer
{
    /// <summary>
    /// 面板
    /// </summary>
    Panel,
    /// <summary>
    /// 提示
    /// </summary>
    Tips,
}
[/mw_shl_code]



[mw_shl_code=csharp,true]using System;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 面板管理器
/// </summary>
public class PanelMgr : MonoBehaviour
{
    public static PanelMgr Instance;

    private string resourcesPath = "UIPrefabs";
    private GameObject canvas;

    public Dictionary<string, PanelBase> dict;

    private Dictionary<PanelLayer, Transform> layerDict;

    public void Awake()
    {
        Instance = this;
        InitLayer();
        dict = new Dictionary<string, PanelBase>();
    }

    private void InitLayer()
    {
        //画布
        canvas = GameObject.Find("Canvas");
        if (canvas == null)
        {
            Debug.LogError("panelMgr.InitLayer fail, canvas is null");
        }
        //各个层级
        layerDict = new Dictionary<PanelLayer, Transform>();

        foreach (PanelLayer pl in Enum.GetValues(typeof(PanelLayer)))
        {
            string name = pl.ToString();
            Transform transform = canvas.transform.Find(name);
            layerDict.Add(pl, transform);
        }
    }

    /// <summary>
    /// 打开面板
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="skinPath"></param>
    /// <param name="args"></param>
    public PanelBase OpenPanel<T>(string skinPath, params object[] args) where T : PanelBase
    {
        //已经打开
        string panelName = typeof(T).ToString();
        Debug.LogWarning("panelName:" + panelName);
        if (dict.ContainsKey(panelName))
        {
            PanelBase p = (PanelBase)dict[panelName];
            if (!p.panelObj.activeSelf)
            {
                p.panelObj.SetActive(true);
                //面板脚本
                p = canvas.GetComponent<T>();
                p.Init(args);
            }
            return p;
        }
        //面板脚本
        PanelBase panel = canvas.AddComponent<T>();
        panel.Init(args);
        dict.Add(panelName, panel);

        panel.panelObj = (GameObject)Instantiate(ResMgr.Instance.Load(panelName));
        ResMgr.Instance.Unload(panelName, false);

        panel.panelObj.name = panelName;
        //坐标
        Transform skinTrans = panel.panelObj.transform;
        PanelLayer layer = panel.layer;
        Transform parent = layerDict[layer];
        skinTrans.SetParent(parent, false);
        //panel的生命周期
        panel.OnShowing();
        //anm
        panel.OnShowed();

        return panel;
    }

    //关闭面板
    public void ClosePanel(string name)
    {
        if (!dict.ContainsKey(name))
        {
            return;
        }
        PanelBase panel = (PanelBase)dict[name];
        if (panel == null)
        {
            return;
        }
        panel.OnClosing();
        dict.Remove(name);
        panel.OnClosed();
        GameObject.Destroy(panel.panelObj);
        Component.Destroy(panel);
    }

    /// <summary>
    /// 激活面板
    /// </summary>
    /// <param name="name"></param>
    public void ActivePanel(string name)
    {
        PanelBase panel = (PanelBase)dict[name];
        if (panel == null)
        {
            return;
        }
        panel.panelObj.SetActive(true);
    }

    /// <summary>
    /// 隐藏面板
    /// </summary>
    /// <param name="name"></param>
    public void DisablePanel(string name)
    {
        PanelBase panel = (PanelBase)dict[name];
        if (panel == null)
        {
            return;
        }
        panel.panelObj.SetActive(false);
    }
}[/mw_shl_code]

创建角色面板的代码[mw_shl_code=csharp,true]using Message;
using UnityEngine;
using UnityEngine.UI;

public class RolePanel : PanelBase
{
    private Transform creatPanel;
    private InputField nameField;
    private Button creatBtn;
    private Button backBtn;  
    private Button creatRoleBtn;
    private Dropdown dropdown;

    private Button chooseRoleBtn;
    private Button startRoleBtn;

    private Button enterBtn;
     
    public override void Init(params object[] args)
    {
        base.Init(args);
        layer = PanelLayer.Panel;
    }

    public override void OnShowing()
    {
        base.OnShowing();
        Transform skinTrans = panelObj.transform;
        creatPanel = skinTrans.Find("CreatPanel");
        nameField = creatPanel.Find("name").GetComponent<InputField>();
        dropdown = creatPanel.Find("Dropdown").GetComponent<Dropdown>();
        creatBtn = creatPanel.Find("CreatBtn").GetComponent<Button>();
        creatBtn.onClick.AddListener(OnCreatRole);
        backBtn = creatPanel.Find("BackBtn").GetComponent<Button>();
        backBtn.onClick.AddListener(OnExitCreatRole);   
        creatPanel.gameObject.SetActive(false);

        chooseRoleBtn = skinTrans.Find("chooseRoleBtn").GetComponent<Button>();
        chooseRoleBtn.onClick.AddListener(OnChoseRole);
        startRoleBtn = skinTrans.Find("startRoleBtn").GetComponent<Button>();
        startRoleBtn.onClick.AddListener(OnStartRole);

        enterBtn = skinTrans.Find("enterBtn").GetComponent<Button>();
        enterBtn.onClick.AddListener(OnEnter);
    }
   
    /// <summary>
    /// 创建角色
    /// </summary>
    private void OnCreatRole()
    {
        if(nameField.text=="")
        {
            PanelMgr.Instance.OpenPanel<TipPanel>("TipPanel", "角色名不能为空!").Close(1.5f);
            return;
        }
        //注册创建角色返回结果回调
        MsgMgr.Instance.AddListener(typeof(SToCCreatRoleRet).ToString(), OnCreatRoleBack);
        //发送
        CToSCreatRole protocol = new CToSCreatRole();
        protocol.uid = GlobeData.uid;
        protocol.name = nameField.text;
        protocol.type = dropdown.value;
        NetMgr.Instance.Send(protocol);
    }

    private void OnCreatRoleBack(object[] args)
    {
        Loom.QueueOnMainThread(() =>
        {
            //移除登录返回结果回调
            MsgMgr.Instance.RemoveListener(typeof(SToCCreatRoleRet).ToString(), OnCreatRoleBack);

            SToCCreatRoleRet stcl = args[0] as SToCCreatRoleRet;
            if (stcl.code == 0)
            {
                PanelMgr.Instance.OpenPanel<TipPanel>("TipPanel", "创建成功!").Close(1.5f);
            }
            else
            {
                PanelMgr.Instance.OpenPanel<TipPanel>("TipPanel", "创建失败!").Close(1.5f);
            }
        });
    }

    private void OnExitCreatRole()
    {
        creatPanel.gameObject.SetActive(false);
    }

    private void OnChoseRole()
    {
        //打开选择角色面板
    }

    private void OnStartRole()
    {
        creatPanel.gameObject.SetActive(true);
    }

    private void OnEnter()
    {
        PanelMgr.Instance.OpenPanel<MainPanel>("MainPanel");
        Close();
    }  

}
[/mw_shl_code]







参与人数 1鲜花 +5 收起 理由
nianhua2008 + 5 很给力!

查看全部评分总评分 : 鲜花 +5

回复

使用道具 举报

7日久生情
2119/5000
排名
1142
昨日变化

14

主题

257

帖子

2119

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
158398
好友
3
蛮牛币
2347
威望
0
注册时间
2016-8-30
在线时间
844 小时
最后登录
2019-3-26
沙发
2018-6-9 09:29:19 只看该作者
感谢分享!!!
[发帖际遇]: 一个袋子砸在了 河边大蚯蚓 头上,河边大蚯蚓 赚了 1 蛮牛币. 幸运榜 / 衰神榜
回复

使用道具 举报

排名
15584
昨日变化

0

主题

13

帖子

85

积分

Rank: 2Rank: 2

UID
284153
好友
0
蛮牛币
167
威望
0
注册时间
2018-6-4
在线时间
24 小时
最后登录
2018-7-6
板凳
2018-6-9 10:39:14 只看该作者
回复 支持 反对

使用道具 举报

排名
64918
昨日变化
1

5

主题

39

帖子

48

积分

Rank: 1

UID
276076
好友
0
蛮牛币
0
威望
0
注册时间
2018-4-8
在线时间
2 小时
最后登录
2018-7-31
地板
2018-6-10 13:48:46 只看该作者

感谢分享!!!
回复

使用道具 举报

7日久生情
1527/5000
排名
2091
昨日变化

1

主题

504

帖子

1527

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
56245
好友
1
蛮牛币
4094
威望
0
注册时间
2014-11-18
在线时间
360 小时
最后登录
2019-3-26
5#
2018-6-11 06:51:17 只看该作者
正在研究UI,谢谢提供资源~
回复 支持 反对

使用道具 举报

7日久生情
1807/5000
排名
1192
昨日变化

0

主题

519

帖子

1807

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
87577
好友
0
蛮牛币
6274
威望
0
注册时间
2015-3-31
在线时间
310 小时
最后登录
2019-3-26
6#
2018-6-11 08:23:51 只看该作者
too good too strong!
[发帖际遇]: 一个袋子砸在了 blastblade 头上,blastblade 赚了 1 蛮牛币. 幸运榜 / 衰神榜
回复 支持 反对

使用道具 举报

6蛮牛粉丝
1070/1500
排名
3543
昨日变化

0

主题

307

帖子

1070

积分

Rank: 6Rank: 6Rank: 6

UID
180321
好友
8
蛮牛币
816
威望
0
注册时间
2016-11-21
在线时间
341 小时
最后登录
2019-3-26
7#
2018-6-11 10:30:01 只看该作者
好喜欢你写的文章啊
回复 支持 反对

使用道具 举报

4四处流浪
438/500
排名
8243
昨日变化

0

主题

225

帖子

438

积分

Rank: 4

UID
281167
好友
1
蛮牛币
883
威望
0
注册时间
2018-5-14
在线时间
65 小时
最后登录
2018-12-10
8#
2018-6-11 13:15:14 只看该作者
真的是好帖啊,顶一个
回复 支持 反对

使用道具 举报

4四处流浪
426/500
排名
5981
昨日变化

1

主题

55

帖子

426

积分

Rank: 4

UID
216191
好友
0
蛮牛币
674
威望
0
注册时间
2017-4-4
在线时间
138 小时
最后登录
2019-2-28
9#
2018-6-11 21:58:16 只看该作者
支持,支持,期待继续更新啊
回复 支持 反对

使用道具 举报

6蛮牛粉丝
1064/1500
排名
1677
昨日变化

0

主题

49

帖子

1064

积分

Rank: 6Rank: 6Rank: 6

UID
165111
好友
0
蛮牛币
2219
威望
0
注册时间
2016-8-31
在线时间
239 小时
最后登录
2019-3-26
10#
2018-6-12 08:34:16 只看该作者
感谢分享!!!
回复

使用道具 举报

4四处流浪
332/500
排名
8566
昨日变化

0

主题

78

帖子

332

积分

Rank: 4

UID
236975
好友
0
蛮牛币
592
威望
0
注册时间
2017-8-11
在线时间
114 小时
最后登录
2019-3-26
11#
2018-6-12 09:26:27 只看该作者
[发帖际遇]: 怅然若失 发帖时在路边捡到 2 蛮牛币,偷偷放进了口袋. 幸运榜 / 衰神榜
回复

使用道具 举报

5熟悉之中
716/1000
排名
3601
昨日变化

0

主题

94

帖子

716

积分

Rank: 5Rank: 5

UID
71644
好友
0
蛮牛币
1179
威望
0
注册时间
2015-1-28
在线时间
206 小时
最后登录
2019-3-26
12#
2018-6-12 09:27:27 只看该作者
感谢分享6666666666666666666
回复 支持 反对

使用道具 举报

7日久生情
2846/5000
排名
908
昨日变化

6

主题

674

帖子

2846

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
112674
好友
4
蛮牛币
1861
威望
0
注册时间
2015-7-8
在线时间
1038 小时
最后登录
2019-3-26
QQ
13#
2018-6-12 09:56:40 只看该作者
Unity极简网络游戏之简单的UI框架
回复 支持 反对

使用道具 举报

5熟悉之中
552/1000
排名
11656
昨日变化

2

主题

191

帖子

552

积分

Rank: 5Rank: 5

UID
37772
好友
0
蛮牛币
303
威望
0
注册时间
2014-8-3
在线时间
269 小时
最后登录
2019-2-27
14#
2018-6-12 15:43:22 只看该作者
为何不用组合代替继承
[发帖际遇]: 王大鹏 乐于助人,奖励 1 蛮牛币. 幸运榜 / 衰神榜
回复 支持 反对

使用道具 举报

排名
673
昨日变化

18

主题

1163

帖子

3514

积分

Rank: 9Rank: 9Rank: 9

UID
68430
好友
13
蛮牛币
18233
威望
0
注册时间
2015-1-14
在线时间
955 小时
最后登录
2019-3-26
15#
2018-6-13 14:10:26 只看该作者
楼主 在 Base  脚本加 打开,关闭,动画就完美了~~嘎嘎~~~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则