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

扫一扫,访问微社区

开发者专栏

关注:2261

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

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

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

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

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

17

主题

178

帖子

2949

积分

Rank: 9Rank: 9Rank: 9

UID
686
好友
12
蛮牛币
3851
威望
0
注册时间
2013-7-4
在线时间
1156 小时
最后登录
2018-7-23

专栏作家社区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





回复

使用道具 举报

7日久生情
1642/5000
排名
1567
昨日变化
1

14

主题

233

帖子

1642

积分

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

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

回复

使用道具 举报

排名
14472
昨日变化

0

主题

13

帖子

83

积分

Rank: 2Rank: 2

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

回复 支持 反对

使用道具 举报

排名
60174
昨日变化
13

5

主题

30

帖子

38

积分

Rank: 1

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

感谢分享!!!

回复

使用道具 举报

5熟悉之中
703/1000
排名
3614
昨日变化
17

1

主题

157

帖子

703

积分

Rank: 5Rank: 5

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

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1089/1500
排名
2093
昨日变化
1

0

主题

289

帖子

1089

积分

Rank: 6Rank: 6Rank: 6

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

回复 支持 反对

使用道具 举报

5熟悉之中
636/1000
排名
6415
昨日变化
4

0

主题

268

帖子

636

积分

Rank: 5Rank: 5

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

回复 支持 反对

使用道具 举报

4四处流浪
348/500
排名
9169
昨日变化
2

0

主题

188

帖子

348

积分

Rank: 4

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

回复 支持 反对

使用道具 举报

4四处流浪
403/500
排名
5693
昨日变化
1

1

主题

55

帖子

403

积分

Rank: 4

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

回复 支持 反对

使用道具 举报

5熟悉之中
660/1000
排名
2759
昨日变化

0

主题

34

帖子

660

积分

Rank: 5Rank: 5

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

回复

使用道具 举报

3偶尔光临
248/300
排名
10190
昨日变化
3

0

主题

70

帖子

248

积分

Rank: 3Rank: 3Rank: 3

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

回复

使用道具 举报

3偶尔光临
245/300
排名
8978
昨日变化
2

0

主题

62

帖子

245

积分

Rank: 3Rank: 3Rank: 3

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

回复 支持 反对

使用道具 举报

7日久生情
2286/5000
排名
1324
昨日变化
1

4

主题

585

帖子

2286

积分

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

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

回复 支持 反对

使用道具 举报

5熟悉之中
535/1000
排名
11006
昨日变化

2

主题

191

帖子

535

积分

Rank: 5Rank: 5

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

回复 支持 反对

使用道具 举报

排名
975
昨日变化
1

15

主题

1095

帖子

2959

积分

Rank: 9Rank: 9Rank: 9

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

回复 支持 反对

使用道具 举报

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

本版积分规则

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