U3D里UI相关逻辑和文件的组织关系的各种形式的比较

代码和资源的组织关系
 
我觉得,做UI逻辑的时候,
在IDE里将脚本挂载到对象是个错误的方式。
因为不利于UI制作人员和程序员的工作分离。
不断的import和export package,会让程序员的代码遭遇版本问题
如果程序使用了particle class 特性,也会让UI制作人员那边运行不起来
 
解决方案:
本质是使用AddComponent,在运行期组织对象和脚本的关联关系。
 
具体形式为:
 
在UI的root对象上挂载一个入口脚本
 
脚本类容形式如下:
 
class StartScript : MonoBehaviour
{
    string [] scriptList =
        {
           "mainLogic.cs",
           "UIMail_List.cs",
            "UIMail_Write.cs",
        };
 
      void Awake()
      {
         GameObject owner = transform.gameObject;
         foreach(string scriptName in scriptList)
         {
               owner.AddComponent(scriptName);
         }
      }
}
 
注意 :
AddComponent 的时候会触发脚本组件的Awake函数调用。
Awake里不能引用其他脚本内的实例对象和函数,因为和AddComponent的顺序有关,这样是为了避免引入顺序问题。
Start的时候就可以随便引用了。
 
策划先搭大概,导出
程序导入
再将入口脚本补进去,顺便检查下层级结构什么的。导出给策划,同时进行功能开发。
策划再导出,调整,给程序
程序再导入进来,功能也做完了,发布
只要入口脚本写完了,就可以随时导入导出了。双方不受影响
 
我这个实现里,入口脚本里还有一个文件列表。这个关联都不应该在其中的
可以写一个静态类,在那里包含,这样可以进一步避免交换包的时候导致的代码版本问题。 
比如:
// 入口脚本文件,挂载到场景的根对象上。
class StartScript : MonoBehaviour
{
      void Awake()
      {
         GameObject owner = transform.gameObject;
          ScriptList.Init(owner);
      }
}
 
// 逻辑脚本文件,不挂载到任何对象。程序自己控制
static class  ScriptList
{
    static string [] list =
    {
           "mainLogic.cs",
           "UIMail_List.cs",
            "UIMail_Write.cs",
    };
    public static void Init( GameObject owner)
    {
         foreach(string scriptName in scriptList)
         {
               owner.AddComponent(scriptName);
         }
    }
}
 
这样和策划的交集就只有一句话了:
ScriptList.Init(owner);
而这个是只要写成就不需要变动的。正好适合和包走.
 
定位控件的方式: 
1、使用public定位控件
2、使用pathName定位控件
方式2明显优于方式1,而且方式2还可以配合上面说的解耦方案。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值