游戏蛮牛学习群(纯技术交流,不闲聊):159852603
游戏蛮牛 手机端
开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:2315

当前位置:游戏蛮牛 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 2209|回复: 27

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

[复制链接]  [移动端链接]
排名
591
昨日变化

17

主题

189

帖子

3274

积分

Rank: 9Rank: 9Rank: 9

UID
686
好友
12
蛮牛币
4337
威望
0
注册时间
2013-7-4
在线时间
1298 小时
最后登录
2018-9-25

专栏作家社区QQ达人

QQ
发表于 2018-6-8 19:02:12 | 显示全部楼层 |阅读模式

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

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

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

项目托管在码云上https://gitee.com/awnuxcvbn/Ganghood,如有未涉及到的代码,请下载或直接浏览
这里贴一下项目中简单的UI框架相关代码
[C#] 纯文本查看 复制代码
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,
}




[C#] 纯文本查看 复制代码
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);
    }
}


创建角色面板的代码
[C#] 纯文本查看 复制代码
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();
    }  

}



1.png 2.png 3.png 4.png 5.png 6.png




评分

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

查看全部评分


回复

使用道具 举报

7日久生情
1842/5000
排名
1399
昨日变化

14

主题

251

帖子

1842

积分

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

UID
158398
好友
3
蛮牛币
1787
威望
0
注册时间
2016-8-30
在线时间
741 小时
最后登录
2018-9-25
发表于 2018-6-9 09:29:19 | 显示全部楼层
感谢分享!!!
[发帖际遇]: 一个袋子砸在了 河边大蚯蚓 头上,河边大蚯蚓 赚了 1 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

排名
14791
昨日变化
3

0

主题

13

帖子

85

积分

Rank: 2Rank: 2

UID
284153
好友
0
蛮牛币
167
威望
0
注册时间
2018-6-4
在线时间
24 小时
最后登录
2018-7-6
发表于 2018-6-9 10:39:14 | 显示全部楼层

回复 支持 反对

使用道具 举报

排名
61596
昨日变化
145

5

主题

39

帖子

48

积分

Rank: 1

UID
276076
好友
0
蛮牛币
0
威望
0
注册时间
2018-4-8
在线时间
2 小时
最后登录
2018-7-31
发表于 2018-6-10 13:48:46 | 显示全部楼层

感谢分享!!!

回复

使用道具 举报

6蛮牛粉丝
1062/1500
排名
2878
昨日变化
1

1

主题

334

帖子

1062

积分

Rank: 6Rank: 6Rank: 6

UID
56245
好友
1
蛮牛币
2723
威望
0
注册时间
2014-11-18
在线时间
253 小时
最后登录
2018-9-23
发表于 2018-6-11 06:51:17 | 显示全部楼层
正在研究UI,谢谢提供资源~

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1320/1500
排名
1756
昨日变化

0

主题

383

帖子

1320

积分

Rank: 6Rank: 6Rank: 6

UID
87577
好友
0
蛮牛币
4313
威望
0
注册时间
2015-3-31
在线时间
227 小时
最后登录
2018-9-25
发表于 2018-6-11 08:23:51 | 显示全部楼层
too good too strong!
[发帖际遇]: 一个袋子砸在了 blastblade 头上,blastblade 赚了 1 蛮牛币. 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

5熟悉之中
757/1000
排名
5245
昨日变化
3

0

主题

281

帖子

757

积分

Rank: 5Rank: 5

UID
180321
好友
4
蛮牛币
613
威望
0
注册时间
2016-11-21
在线时间
222 小时
最后登录
2018-9-25
发表于 2018-6-11 10:30:01 | 显示全部楼层
好喜欢你写的文章啊

回复 支持 反对

使用道具 举报

4四处流浪
429/500
排名
8052
昨日变化

0

主题

223

帖子

429

积分

Rank: 4

UID
281167
好友
1
蛮牛币
848
威望
0
注册时间
2018-5-14
在线时间
64 小时
最后登录
2018-8-21
发表于 2018-6-11 13:15:14 | 显示全部楼层
真的是好帖啊,顶一个

回复 支持 反对

使用道具 举报

4四处流浪
408/500
排名
5806
昨日变化

1

主题

55

帖子

408

积分

Rank: 4

UID
216191
好友
0
蛮牛币
641
威望
0
注册时间
2017-4-4
在线时间
130 小时
最后登录
2018-9-13
发表于 2018-6-11 21:58:16 | 显示全部楼层
支持,支持,期待继续更新啊

回复 支持 反对

使用道具 举报

5熟悉之中
804/1000
排名
2237
昨日变化
1

0

主题

39

帖子

804

积分

Rank: 5Rank: 5

UID
165111
好友
0
蛮牛币
1720
威望
0
注册时间
2016-8-31
在线时间
179 小时
最后登录
2018-9-25
发表于 2018-6-12 08:34:16 | 显示全部楼层
感谢分享!!!

回复

使用道具 举报

3偶尔光临
278/300
排名
9588
昨日变化
1

0

主题

77

帖子

278

积分

Rank: 3Rank: 3Rank: 3

UID
236975
好友
0
蛮牛币
487
威望
0
注册时间
2017-8-11
在线时间
94 小时
最后登录
2018-9-19
发表于 2018-6-12 09:26:27 | 显示全部楼层
[发帖际遇]: 怅然若失 发帖时在路边捡到 2 蛮牛币,偷偷放进了口袋. 幸运榜 / 衰神榜

回复

使用道具 举报

4四处流浪
379/500
排名
6244
昨日变化

0

主题

69

帖子

379

积分

Rank: 4

UID
71644
好友
0
蛮牛币
589
威望
0
注册时间
2015-1-28
在线时间
108 小时
最后登录
2018-9-25
发表于 2018-6-12 09:27:27 | 显示全部楼层
感谢分享6666666666666666666

回复 支持 反对

使用道具 举报

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

4

主题

611

帖子

2454

积分

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

UID
112674
好友
4
蛮牛币
1438
威望
0
注册时间
2015-7-8
在线时间
911 小时
最后登录
2018-9-25
QQ
发表于 2018-6-12 09:56:40 | 显示全部楼层
Unity极简网络游戏之简单的UI框架

回复 支持 反对

使用道具 举报

5熟悉之中
536/1000
排名
11232
昨日变化
1

2

主题

191

帖子

536

积分

Rank: 5Rank: 5

UID
37772
好友
0
蛮牛币
396
威望
0
注册时间
2014-8-3
在线时间
257 小时
最后登录
2018-9-21
发表于 2018-6-12 15:43:22 | 显示全部楼层
为何不用组合代替继承
[发帖际遇]: 王大鹏 乐于助人,奖励 1 蛮牛币. 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

排名
866
昨日变化

16

主题

1126

帖子

3144

积分

Rank: 9Rank: 9Rank: 9

UID
68430
好友
13
蛮牛币
11272
威望
0
注册时间
2015-1-14
在线时间
842 小时
最后登录
2018-9-22
发表于 2018-6-13 14:10:26 | 显示全部楼层
楼主 在 Base  脚本加 打开,关闭,动画就完美了~~嘎嘎~~~

回复 支持 反对

使用道具 举报

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

本版积分规则

快速回复 返回顶部 返回列表