1.C#代码
using UnityEngine;
using System.Collections;
public class LuaMono : MonoBehaviour
{
private static LuaMono _instance;
public static LuaMono Instance
{
get
{
return _instance;
}
}
public UILabel label;
void Awake()
{
_instance = this;
DontDestroyOnLoad( this.gameObject );
}
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
public void setLabel( string text )
{
label.text = text;
}
}
C#代码中,我们定义了一个NGUI的UILabel,并且定义了一个设置Label的方法。LuaMono是一个单例类,在Awake中初始化。同时我们对UILabel添加了get属性
2.生成的wrap文件
public static void Register(LuaState L)
{
L.BeginClass(typeof(LuaMono), typeof(UnityEngine.MonoBehaviour));
L.RegFunction("setLabel", setLabel);
L.RegFunction("__eq", op_Equality);
L.RegFunction("__tostring", Lua_ToString);
L.RegVar("label", get_label, set_label);
L.RegVar("Instance", get_Instance, null);
L.EndClass();
}
分为:RegFunction(注册方法)和RegVar(注册成员变量)
注意,我们的成员变量,ulua默认给我们添加了get和set,提高效率。
3.如何在Lua中使用
静态方法:如Instance
LuaMono.Instance,通过点操作符来获取
非静态方法:如setLabel
LuaMono.Instance:setLabel( "From Lua" ),通过冒号操作符来获取
非静态成员变量:如label
LuaMono.Instance.label,同样使用点操作符来获取
4.设置label的text
local label1 = LuaMono.Instance.label
label1.text = "aaa"
通过Wrap文件我们知道label和text都被注册成RegVar,所以它们在Lua代码中用点操作符来获取
5.Lua代码
Hello = {}
function PrintHello( str )
print( "我擦 " .. str )
MyHelloWorld.Instance:ShowText()
LuaMono.Instance:setLabel( "From Lua" )
local label1 = LuaMono.Instance.label
label1.text = "aaa"
end
有一个问题,假如我在UI的Prefab上添加或者删除UIlabel或UISprite,就得重新生成wrap,这样就修改了C#代码,热更时,不是还得发版本吗?
现在有一种方案解决,但是目前自己实现有难度,大家有什么好的方法》