XLua映射Prefab上C#代码字段到Luabehaviour解决方案

1.    Xlua对prefab上ui脚本绑定的gameobject映射到xlua的Luabehaviour

(1).导入文件夹ExportRelevance2XLua

(2).选择工程目录中的prefab,编辑需要映射到Luabehaviour的普通ui脚本,

上图为一个模板,如果需要映射的字段,增加一个Attribute-Export2LuaBehaviour,参数传入引用名字,例如go1,并且ui类需要继承IExportQuote接口

 

(3)选中一个prefab,如图

(4)在prefab上右键点击ExportRelevence,如图


我们看到这个字符串的key和gameobject的value成功导入,这个功能就基本完成了,在xlua中,lua脚本中的self字段指定的是这个Luabehaviour对象的this,所以我们可以在xlua里使用类似go1.name,go1:GetComponet(“xxx”).xxx之类的方法调用

 

(5)这个工具是为了配合CSharp2Lua工具使用的,但是CSharp2Lua在转换脚本过程中,转译的是代码,无法获得Button委托的关系,所以这个button时间还需要我们自己做关系映射,后面我会在Luabehaviour上绑定的每个LuaScript增加一个RigesterButtons方法,通过Luabehaviour中的Injection映射上去,然后调用例如 button1:GetComponent(‘Button’).onClick:AddLister(Test.Mode1.XXXX()

end)

注:1.Test.Mode1.XXXX()  是使用CSharp2Lua转换后的lua脚本某个模块中的一个方法

 

1.  为了能在lua中获取到button对象,可以在ui类的C#脚本中和其他需要做映射的字段一样,增加一个Attribute-Export3LuaBehaviour,然后使用工具一起导出


由于CSharp2Lua的工具我就不提供了,网上有一些类库,这篇文章仅提供一个思路,以下是我写的映射部分的代码


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Reflection;
using System;
using UnityEditor;
using XLua;


/// <summary>
/// 右键点击prefab 把继承IExportQuote接口的ui脚本里面标注(Export2LuabehaviourAttribute)属性的字段导出到Luabehaviour类里面的injections字段,建立映射关系
/// </summary>
public class ExportRelevence
{
    [MenuItem("Assets/ExportRelevence")]
    // Use this for initialization  
    public static void ExportRelevencer()
    {
        //如果转换过程失败给予提示
        try
        {
            GameObject[] objs = Selection.gameObjects;


            LuaBehaviour luaBehaviour = objs[0].GetComponent<LuaBehaviour>();
            //确保LuaBehaviour和继承IExportQuote的接口对象存在,go on
            if (luaBehaviour == null)
            {
                Debug.LogError("[ExportRelevence]ExportRelevencer:cant find luaBehaviour");
                return;
            }


            if (objs[0].GetComponent<IExportQuote>() == null)
            {
                Debug.LogError("[ExportRelevence]ExportRelevencer:cant find IExportQuote interface object");
                return;
            }


            List<Injection> m_Injection = new List<Injection>();


            Type type = objs[0].GetComponent<IExportQuote>().GetType();


            FieldInfo[] fields = type.GetFields();


            foreach (FieldInfo f in fields)
            {
                if (Attribute.IsDefined(f, typeof(Export2LuabehaviourAttribute), true))
                {
                    var value = f.GetValue(objs[0].GetComponent<IExportQuote>());
                    m_Injection.Add(new Injection(AttributeProcess.GetNodeName(f), value));
                }
            }
            luaBehaviour.injections = m_Injection.ToArray();
            //保存prefab关联变化
            AssetDatabase.SaveAssets();
            Debug.Log("[ExportRelevence]ExportRelevencer: export relevence to luabehaviour successful and slected prefab name is : " + objs[0].name);
        }
        catch (Exception e)
        {
            Debug.LogError("[ExportRelevence]ExportRelevencer: export had some wrong :" + e.ToString());
            throw;
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值