一、遇到的问题
昨天把代码大致清理了一遍之后,发现代码中存在很大的一个问题是数据和表现耦合在一起了,如下:
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;
}
}
初步的想法是抽离出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
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相同,但用于自写。
注: 其实应该不需要这么写的,但目前先这样解决。