• Steam项目推进(二)—— 在项目中使用FairyGUI


    一、遇到的问题

    昨天把代码大致清理了一遍之后,发现代码中存在很大的一个问题是数据表现耦合在一起了,如下:

    using UnityEngine;
    using UnityEngine.UI;
    
    public enum CardStateType
    {
        InDeck, InHand, InBattle, InSave, InAbandon
    }
    
    
    //卡牌的战斗形态
    public class CardOperate : MonoBehaviour
    {
        [Header("隶属的卡牌")]
        public Card ownCard;
    
        public int thisId;
    
    
        //展示属性:属性会挂钩到其他text 用于显示
        public int id;
    
        [Header("展示属性(界面赋值)")]
        public Text nameText;
        public Text costText;
        public Text descriptionText;
        public Image cardImage;
        public Image colorFrame;
    
        [Header("手牌区")]
        public GameObject hand;	 //表现
        [Header("出牌区")]
        public GameObject battle;
        [Header("弃牌区")]
        public GameObject abandon;
    
        [Header("留牌区")]
        public GameObject savePanel;
    
        private CardStateType currentState;     //数据
    
        public static bool UcanReturn;
    
        public CardStateType CurrentState()
        {
            return this.currentState;
        }  
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    初步的想法是抽离出Model层和View层,Model层保存数据,View做表现。需要搭建一个事件系统来隔离两者的耦合。

    然后因为做UI以及UI管理是我的弱项,所以这边打算引入之前公司使用的FairyGUI来处理UI。 (与UGUI本身资源和代码的耦合度较高也有一定关系吧

    二、搭建过程

    1、下载方法可看这篇博客:fairygui简单使用(unity)

    2、在untiy的资源商店中下载FairyGUI插件,不然导出的代码会报错。

    2、新建一个按钮组件,可看官网:创建按钮组件的方式

    把FairyGUI编辑器的打开添加到自定义菜单栏,这样就省不少功夫。
    新建一个C#文件,并输入如下代码

    using UnityEngine;
    using UnityEditor;
    using System.Diagnostics;
    
    public class UnityEdite
    {
        [MenuItem("FairyGUI/Open")] // MenuItem在编辑器中创建相对应的菜单栏
        static void OpenFairyGUI()
        {
            string exePath = @"D:\FairyGUI\FairyGUI-Editor" + "/FairyGUI-Editor.exe"; //FairyGUI编辑器路径
            Process.Start(exePath);
        }
    }
    //如果没有效果,那么你需要检查下:
    //1. 项目中的所有代码没有报错,能够正常编译
    //2. 如果1没问题,就重启下unity
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在这里插入图片描述

    FairyGUI的学习

    在这里插入图片描述
    导入FairyGUI后,会有UIPanel和UICAmera两个基础组件。
    1、UIPanel:创建它,并配置属性,可以生成所有你在FairyGUI里编辑的组件。
    2、UICamrea:FairyGUI自带的一个相机,可以替换掉主相机。

    三、遇到的问题

    1、根据文档中进行发布时,一直没办法生成代码,设置了,但FUIExport文件夹为空。如下

    在这里插入图片描述
    解决方案:因为只是勾选了全局设置的“发布代码”,没有勾选包设置的发布代码。
    在这里插入图片描述
    在这里插入图片描述
    勾选后成功解决。

    2、导出代码后,尝试创建一个界面却一直报错。提示强转类型失败。
    在这里插入图片描述
    解决方案:根据官网提示,需要先Binder.BindAll(),加上后问题解决。
    在这里插入图片描述
    3、对于导出的代码class,有partial关键字修饰,可以做拓展,但是我现在需要在该类初始化时做一些事情,就像样例中的 OnInit函数一样,但因为这个导出的代码没办法继承其他类,导致无法重写,把我难住了。
    目前想到的办法:
    (1)重写GComponent类,让它支持OnInit
    (2)根据官方文档,重写ConstructFromXML(XML xml),但FairyGUI代码自动生成把ConstructFromXML占用了,不能重复重写。
    在这里插入图片描述
    解决方案:最终是在GComponent类中写了一个ReadyForRun函数,效果与ConstructFromXML相同,但用于自写。
    在这里插入图片描述
    注: 其实应该不需要这么写的,但目前先这样解决。

    四、参考文章

    fairygui简单使用(unity)

  • 相关阅读:
    安装Android Studio并创建一个Android Demo
    [Spring Boot 6]企业级开发
    输入回车换行,div标签可编写
    博士期间可读的工具书目(含英文原版网盘资源)
    Linux | C语言中volatile关键字的理解
    【QT】qss控件样式设置大全
    Java入门第一步---配置环境、安装工具(超级详细)
    使springAOP生效不一定要加@EnableAspectJAutoProxy注解
    作为面试官,关于线程池的问题我一般这样套路...
    java计算机毕业设计旅游信息分享网站源码+mysql数据库+系统+lw文档+部署
  • 原文地址:https://blog.csdn.net/Mou_Yang/article/details/128048953