Git Product home page Git Product logo

xlua's Introduction

license release PRs Welcome Build status

(English Documents Available)

C# 下 Lua 编程支持

xLua 为 Unity、.Net、Mono 等 C# 环境增加 Lua 脚本编程的能力,借助 xLua,这些 Lua 代码可以方便的和 C# 相互调用。


xLua 的突破

xLua 在功能、性能、易用性都有不少突破,这几方面分别最具代表性的是:

  • 可以运行时把 C# 实现(方法,操作符,属性,事件等等)替换成 Lua 实现;
  • 出色的 GC 优化,自定义 struct,枚举在 Lua 和 C# 间传递无 C# GC Alloc;
  • 编辑器下无需生成代码,开发更轻量;

更详细的特性、平台支持介绍请参考 xLua 文档: 功能特性


安装

xLua 可以直接简单的安装在 Unity 项目中.

  1. Releases 中下载发行版, 或直接下载本仓库代码.
  2. 打开下载下来的源码压缩包, 你会看到一个 Assets 目录, 这目录就对应 Unity 工程的 Assets 目录,保持这目录结构, 将其内容置入 Unity 项目即可.

注意, Assets/Examples 目录下为示例代码, 你应该在生产环境下删去他们.

如果希望安装到其它目录,请看 FAQ 相关介绍。


文档


快速入门

一个完整的例子仅需3行代码:

安装好xLua,建一个MonoBehaviour拖到场景,在Start加入如下代码:

XLua.LuaEnv luaEnv = new XLua.LuaEnv();
luaEnv.DoString("CS.UnityEngine.Debug.Log('hello world')");
luaEnv.Dispose();
  1. DoString 参数为 string,可输入任意合法的 Lua 代码,本示例在 Lua 里调用 C# 的 UnityEngine.Debug.Log 打印了个日志。
  2. 一个 LuaEnv 实例对应 Lua 虚拟机,出于开销的考虑,建议全局唯一。

C#主动调用 Lua 也很简单,比如要调用 Lua 的系统函数,推荐方式是:

  • 声明

    [XLua.CSharpCallLua]
    public delegate double LuaMax(double a, double b);
  • 绑定

    var max = luaEnv.Global.GetInPath<LuaMax>("math.max");
  • 调用

    Debug.Log("max:" + max(32, 12));

注意, 请不要重复调用 luaEnv.Global.GetInPath<LuaMax>, 这没有任何必要.


热补丁

除了使用 Lua 在 Unity 进行脚本编写, 你也可以使用 Lua 实现 "热补丁". xLua 提供了使用 Lua 逻辑替换 C# 方法逻辑的方案.

  • 侵入性小,老项目原有代码不做任何调整就可使用。
  • 运行时影响小,不打补丁基本和原有程序一样。
  • 出问题了可以用 Lua 来打补丁,这时才会走到 Lua 代码逻辑;

参考使用指南: xLua 文档: 热补丁


更多示例


技术支持

一群:612705778 (已满)

二群:703073338 (已满)

三群:811246782

入群的问题:有问题该先从哪找答案

回答:FAQ

平时也要谨记这答案,90%以上问题都可以在FAQ里头找到答案。这些问题就别在群刷屏了。

xlua's People

Contributors

3wz avatar bigoyayubi avatar chaosddp avatar chexiongsheng avatar clainele avatar dotlive avatar dreamcirno avatar ezhex1991 avatar forsakenyang avatar hsl4125 avatar ineversleeeeep avatar jayatubi avatar lindaluo1113 avatar liuyi13-cpu avatar magicqy avatar ootroyoo avatar pkujhd avatar ps5mh avatar pureivan avatar rebelmx4 avatar seanwengccp avatar slimenull avatar vkensou avatar waizui avatar wangyongxina avatar xiangyuan avatar xpol avatar xuyanghuang-tencent avatar zhaoboqiang avatar zxsean avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

xlua's Issues

Example 关于第二个例子问题

luaEnv.DoString(luaScript.text, "LuaBehaviour", scriptEnv);
换成 luaEnv.DoString("require 'LuaTestScript'", "LuaBehaviour", scriptEnv);
lua文件已经放在Resoures目录下。
Error:
LuaException: LuaTestScript.lua:15: attempt to index a nil value (global 'self') stack traceback: LuaTestScript.lua:15: in function 'update' XLua.LuaEnv.ThrowExceptionFromError (Int32 oldTop) (at Assets/xLua/Assets/XLua/Src/LuaEnv.cs:360) XLuaGenDelegateImpl0.Invoke1 () LuaBehaviour.Update () (at Assets/xLua/Assets/XLua/Examples/02_U3DScripting/LuaBehaviour.cs:80)

希望LuaCallCSharpAttribute增加自动包含内部类型的功能

希望[LuaCallCSharp]能够提供选项支持自动包含内部类型。例如:

[LuaCallCSharp(GenFlag.IncludeInnnerClass)]
public class MyClass
{
    public class MyInnerClass {}
}

将同时将MyClassMyClass+MyInnerClass一同暴露给lua,而不需要对每一个内部类再打上[LuaCallCSharp]的标记。

08_Hotfix这个例子为什么我运行点击按钮是报错的?

运行
if (GUI.Button(new Rect(10, 100, 300, 150), "Hotfix"))
{
luaenv.DoString(@"
local tick = 0
xlua.hotfix(CS.HotfixTest, 'Update', function()
--tick = tick + 1
--if (tick % 50) == 0 then
print('<<<<<<<<Update in lua, tick = ' .. tick)
--end
end)
");
}

是报错的 是我设置不对么

How can I find the source codes for plugin

At first , I wanna thank you guys for making such great tools which have blown my mind.
After took a glance at the project, I could't find the source codes or any links for plugin, so it's would be very great if u can offer a link to the source codes, or just a few keywords I can search it.
thanks again.

BlackList参数匹配问题

System.IO.Direcotory有两个CreateDirectory的重载:
1、CreateDirectory(System.String,System.Security.AccessControl.DirectorySecurity)
2、CreateDirectory(System.String)

前者在导出的时候会提示找不到类型,所以在BlackList中添加如下配置来屏蔽这个方法:

public static List<List> BlackList = new List<List>{
new List {"System.IO.Directory", "CreateDirectory", "System.String", "System.Security.AccessControl.DirectorySecurity"},
}

发现生成出来的Wrap文件把两个CreateDirectory都屏蔽了,但期望是能够保留后者的。
看了下Generator.cs:350,发现是在判断isMethodInBlackList时如果方法的参数数量少于配置,都会进入黑名单。

最后临时修改成这样了:
if (parameters.Length != exclude.Count - 2)
continue;

InvalidCastException: This delegate must add to CSharpCallLua:System.Action

我参照Examples里面的02_U3DScripting,将LuaBehaviour中的Awake方法复制到我的代码当中:

void Awake()
{
    m_scriptEnv = s_luaEnv.NewTable();

    LuaTable meta = s_luaEnv.NewTable();
    meta.Set("__index", s_luaEnv.Global);
    m_scriptEnv.SetMetaTable(meta);
    meta.Dispose();

    m_scriptEnv.Set("self", this);
    foreach (var injection in m_injections)
    {
        m_scriptEnv.Set(injection.name, injection.value);
    }

    s_luaEnv.DoString(m_luaScript.text, "LuaBehaviour", m_scriptEnv);

    Action luaAwake = m_scriptEnv.Get<Action>("awake");

    if (luaAwake != null)
    {
        luaAwake();
    }
}

并且依附了一个简答的lua脚本:

function awake()
    print('hello')
end

当时在程序启动的时候出现错误:

InvalidCastException: This delegate must add to CSharpCallLua:System.Action

我对比了我的代码和LuaBehaviour没有什么特别的区别,请问是否还有别的需要设置的部分?

Example中HotFix2这个例子的最后一个测试报错

calc.TestOut(100, out num, ref str, gameObject);
报:
LuaException: [string "chunk"]:4: test error
stack traceback:
[C]: in function 'error'
[string "chunk"]:4: in function <[string "chunk"]:2>
XLua.LuaEnv.ThrowExceptionFromError (Int32 oldTop) (at Assets/XLua/Src/LuaEnv.cs:360)
XLua.DelegateBridge.SystemInt32 (System.Object self, Int32 a, System.Double& b, System.String& c, System.Object go) (at Assets/XLua/Gen/DelegatesGensBridge.cs:565)
HotfixCalc.TestOut (Int32 a, System.Double& b, System.String& c, UnityEngine.GameObject go)
HotfixTest2.Start () (at Assets/XLua/Examples/08_Hotfix/HotfixTest2.cs:263)
版本unity4.6 其他都没问题

lua 调用 c# delegate 报错

我在拿第三方的一个besthttp做了一些调用使用测试,有些疑问,请教一下:

这个是c# code

namespace BestHTTP.WebSocket
{
    public delegate void OnWebSocketOpenDelegate(WebSocket webSocket);
    public delegate void OnWebSocketMessageDelegate(WebSocket webSocket, string message);
    public delegate void OnWebSocketBinaryDelegate(WebSocket webSocket, byte[] data);
    public delegate void OnWebSocketClosedDelegate(WebSocket webSocket, UInt16 code, string message);
    public delegate void OnWebSocketErrorDelegate(WebSocket webSocket, Exception ex);
    public delegate void OnWebSocketErrorDescriptionDelegate(WebSocket webSocket, string reason);

#if (!UNITY_WEBGL || UNITY_EDITOR)
    public delegate void OnWebSocketIncompleteFrameDelegate(WebSocket webSocket, WebSocketFrameReader frame);
#else
    delegate void OnWebGLWebSocketOpenDelegate(uint id);
    delegate void OnWebGLWebSocketTextDelegate(uint id, string text);
    delegate void OnWebGLWebSocketBinaryDelegate(uint id, IntPtr pBuffer, int length);
    delegate void OnWebGLWebSocketErrorDelegate(uint id, string error);
    delegate void OnWebGLWebSocketCloseDelegate(uint id, int code, string reason);

    /// <summary>
    /// States of the underlying browser's WebSocket implementation's state. It's available only in WebGL builds.
    /// </summary>
    public enum WebSocketStates : byte
    {
        Connecting = 0,
        Open       = 1,
        Closing    = 2,
        Closed     = 3
    };
#endif

    public sealed class WebSocket
    {
#region Properties

        /// <summary>
        /// The connection to the WebSocket server is open.
        /// </summary>
        public bool IsOpen
        {
            get
            {
#if (!UNITY_WEBGL || UNITY_EDITOR)
                return webSocket != null && !webSocket.IsClosed;
#else
                return ImplementationId != 0 && WS_GetState(ImplementationId) == WebSocketStates.Open;
#endif
            }
        }

#if (!UNITY_WEBGL || UNITY_EDITOR)
        /// <summary>
        /// Set to true to start a new thread to send Pings to the WebSocket server
        /// </summary>
        public bool StartPingThread { get; set; }

        /// <summary>
        /// The delay between two Pings in millisecs. Minimum value is 100, default is 1000.
        /// </summary>
        public int PingFrequency { get; set; }

        /// <summary>
        /// The internal HTTPRequest object.
        /// </summary>
        public HTTPRequest InternalRequest { get; private set; }

        /// <summary>
        /// IExtension implementations the plugin will negotiate with the server to use.
        /// </summary>
        public IExtension[] Extensions { get; private set; }
#endif

        /// <summary>
        /// Called when the connection to the WebSocket server is estabilished.
        /// </summary>
        public OnWebSocketOpenDelegate OnOpen;

        /// <summary>
        /// Called when a new textual message is received from the server.
        /// </summary>
        public OnWebSocketMessageDelegate OnMessage;

        /// <summary>
        /// Called when a new binary message is received from the server.
        /// </summary>
        public OnWebSocketBinaryDelegate OnBinary;

        /// <summary>
        /// Called when the WebSocket connection is closed.
        /// </summary>
        public OnWebSocketClosedDelegate OnClosed;

这个是lua code

function awake()
print("awake...")
end

local ws = nil
-- local url = "ws://echo.websocket.org"
local url = "ws://115.29.193.48:8088"

function start()
	print("websocket lua start...")
	ws = CS.BestHTTP.WebSocket.WebSocket(CS.System.Uri(url))
	print(ws.IsOpen)

	ws:OnOpen('+', function(ws)
		print("nice!!!~~~~")
	end)
	ws:Open()
end

function update()
	-- print(ws.IsOpen)
end

function ondestroy()
    print("websocket lua destroy")
end

结果如下:

LuaException: [string "LuaBehaviour"]:15: attempt to call a nil value (method 'OnOpen')
stack traceback:
	[string "LuaBehaviour"]:15: in function <[string "LuaBehaviour"]:10>
XLua.LuaEnv.ThrowExceptionFromError (Int32 oldTop) (at Assets/xLua/Src/LuaEnv.cs:360)
XLuaGenDelegateImpl0.Invoke1 ()
LuaBehaviour.Start () (at Assets/_LFramework/Scripts/Common/LuaBehaviour.cs:70)

如果我在update中一直打印:ws.IsOpen,是看得出他在调用链接,最后返回链接上的,但是调用delegate就报错了,是否是我使用者的问题?

Debug.Log的行数错误

非常棒的想法!
我在测试过程中发现了一个问题,一旦开启了HOTFIX_ENABLE宏编译之后,Demo中的HotfixTest里面打印的LOG的函数会定位到HotfixTest2的102行,关闭这个宏之后重新编译就好了。

^>>>>>>>>Update in C#, tick = 50
UnityEngine.Debug:Log(Object)
HotfixTest:Update() (at Assets/XLua/Examples/08_Hotfix/HotfixTest2.cs:102)

Unity版本5.3.5f1

添加第三方库失败

  • 先来个小问题,编译成功,但是最后拷贝的时候失败
=== BUILD AGGREGATE TARGET ALL_BUILD OF PROJECT XLua WITH CONFIGURATION Release ===

Check dependencies

Write auxiliary files
write-file /Users/Leo/Documents/C_Code/Leo/xLua/build/build_osx/XLua.build/Release/ALL_BUILD.build/Script-9529A65AE888411F93CFF299.sh
chmod 0755 /Users/Leo/Documents/C_Code/Leo/xLua/build/build_osx/XLua.build/Release/ALL_BUILD.build/Script-9529A65AE888411F93CFF299.sh

PhaseScriptExecution CMake\ Rules build_osx/XLua.build/Release/ALL_BUILD.build/Script-9529A65AE888411F93CFF299.sh
    cd /Users/Leo/Documents/C_Code/Leo/xLua/build
    /bin/sh -c /Users/Leo/Documents/C_Code/Leo/xLua/build/build_osx/XLua.build/Release/ALL_BUILD.build/Script-9529A65AE888411F93CFF299.sh
echo ""

echo Build\ all\ projects
Build all projects

** BUILD SUCCEEDED **

cp: plugin_lua53/Plugins/xlua.bundle/Contents/MacOS/xlua: No such file or directory
  • 上面问题,我最后手动拷贝xlua.bundle到Plugins中,下面是我按照doc里面添加一个第三方库

CMakeLists.txt修改如下

##省略。。。。


project(XLua)

option ( UINT_ESPECIALLY "using custom ulong" OFF )
option ( USING_LUAJIT "using luajit" OFF )

find_path(XLUA_PROJECT_DIR NAMES SConstruct
    PATHS 
    ${CMAKE_SOURCE_DIR}
    NO_DEFAULT_PATH
    )

MARK_AS_ADVANCED(XLUA_PROJECT_DIR)

#begin lua-rapidjson
set (RAPIDJSON_SRC 
    lua-rapidjson/src/rapidjson.cpp
)
set_property(
	SOURCE ${RAPIDJSON_SRC}
	APPEND
	PROPERTY COMPILE_DEFINITIONS
	LUA_LIB
)
list(APPEND THIRDPART_INC  lua-rapidjson/rapidjson/include)
set (THIRDPART_SRC ${THIRDPART_SRC} ${RAPIDJSON_SRC})
#end lua-rapidjson

#begin pbc
set (PBC_SRC 
    pbc/src/alloc.c
    pbc/src/array.c
    pbc/src/array.c
    pbc/src/bootstrap.c
    pbc/src/context.c
    pbc/src/decode.c
    pbc/src/map.c
    pbc/src/pattern.c
    pbc/src/proto.c
    pbc/src/register.c
    pbc/src/rmessage.c
    pbc/src/stringpool.c
    pbc/src/varint.c
    pbc/src/wmessage.c
    pbc/binding/lua53/pbc-lua53.c
)
set_property(
	SOURCE ${PBC_SRC}
	APPEND
	PROPERTY COMPILE_DEFINITIONS
	LUA_LIB
)
list(APPEND THIRDPART_INC pbc pbc/src)
set (THIRDPART_SRC ${THIRDPART_SRC} ${PBC_SRC})
#end pbc


##省略。。。。

生成后再xcode中已经看到luaopen_rapidjson生成

我测试的工程就是xlua的 01_Helloworld

自己添加了一个LuaDLL如下:


namespace XLua.LuaDLL
{
	using System;
	using System.Runtime.InteropServices;
	using System.Text;
	using XLua;

	public partial class Lua
	{
		[DllImport (LUADLL, CallingConvention = CallingConvention.Cdecl)]
		public static extern int luaopen_rapidjson (System.IntPtr L);

		[DllImport (LUADLL, CallingConvention = CallingConvention.Cdecl)]
		public static extern int luaopen_protobuf_c (System.IntPtr L);


		[MonoPInvokeCallback (typeof(LuaDLL.lua_CSFunction))]
		public static int LoadRapidJson (System.IntPtr L)
		{
			return luaopen_rapidjson (L);
		}
	}
}

修改HelloWorld.cs如下:

/*
 * Tencent is pleased to support the open source community by making xLua available.
 * Copyright (C) 2016 THL A29 Limited, a Tencent company. All rights reserved.
 * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
 * http://opensource.org/licenses/MIT
 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
*/

using UnityEngine;
using XLua;

public class Helloworld : MonoBehaviour
{
	// Use this for initialization
	void Start ()
	{
		LuaEnv luaenv = new LuaEnv ();
//		luaenv.AddBuildin ("socket1", StaticLuaCallbacks.LoadSocketCore);
		luaenv.AddBuildin ("rapidjson", XLua.LuaDLL.Lua.LoadRapidJson);
//		luaenv.AddBuildin ("protobuf.c", XLua.LuaDLL.Lua.LoadPbc);
//		luaenv.DoString ("CS.UnityEngine.Debug.Log('hello world')");
//		luaenv.DoString ("local c = require \"protobuf.c\"");
		luaenv.DoString ("local rapidjson = require('rapidjson')");
//		luaenv.DoString ("local test = require('socket') print(test)");
//		luaenv.DoString ("local rapidjson = require('rapidjson') local t = rapidjson.decode('{\"a\":123}') print(t.a) t.a = 456 local s = rapidjson.encode(t) print('json', s)\n");
//		luaenv.Dispose ();
	}
	
	// Update is called once per frame
	void Update ()
	{
	
	}
}

最后报错:

EntryPointNotFoundException: luaopen_rapidjson
XLua.LuaDLL.Lua.LoadRapidJson (IntPtr L) (at Assets/_LFramework/Script/XLua/LuaDLL.cs:21)
(wrapper native-to-managed) XLua.LuaDLL.Lua:LoadRapidJson (intptr)
XLua.LuaEnv.DoString (System.String chunk, System.String chunkName, XLua.LuaTable env) (at Assets/XLua/Src/LuaEnv.cs:206)
Helloworld.Start () (at Assets/XLua/Examples/01_Helloworld/Helloworld.cs:23)

Stateful Hotfix 如何扩展方法

测试了下Stateful Hotfix,还挺方便的。现在的问题是lua里定义的hotfix对象不能包含原来类里不存在的成员,否则加载时会报错。
所以我现在如果想利用这个机制去扩展添加一些新功能的话只能是定义Global的变量(local的变量无法在hotfix对象中调用)。像下面这样
`
local c = {...}

c_extend =
{
self = c,
ext = function() ... end
...
}

xlua.hotfix(CS.c, c)
`
这种方案是可行的还是应该有什么更好的解决办法?

关于iOS平台hotfix的疑问

Great work! iOS平台hotfix的原理是什么,能否在wiki里详细说明,ios上性能与其他方案(slua/ulua等)的比较情况能否也给出数据,谢谢!

热补丁的问题

在运行hotfixtest例子的时候,按下按钮报了如下的错误,求教如何解决

LuaException: xlua.access, no field __Hitfix0_Update
stack traceback:
[C]: in field 'access'
[string "Init"]:86: in field 'hotfix'
[string "chunk"]:3: in main chunk
XLua.LuaEnv.ThrowExceptionFromError (Int32 oldTop) (at Assets/XLua/Src/LuaEnv.cs:360)
XLua.LuaEnv.DoString (System.String chunk, System.String chunkName, XLua.LuaTable env) (at Assets/XLua/Src/LuaEnv.cs:212)
HotfixTest.OnGUI () (at Assets/XLua/Examples/08_Hotfix/HotfixTest.cs:29)

请问是否支持C#的try...catch?

例如这种代码如何翻译为lua代码?

void test1()
{
	throw new Exception("abc");
}
void test5()
{
	try
	{
		try
		{
			try
			{
				test1 ();
			}
			catch(Exception ex)
			{
				Debug.Log (ex.Message);
				throw new Exception("efg");
			}
		}
		catch(Exception ex)
		{
			Debug.Log (ex.Message);
			throw ex;
		}
	}
	catch(Exception ex)
	{
		Debug.Log (ex.Message);
	}
}

HotFix易用性的问题

void OnGUI()
{
if (GUI.Button(new Rect(10, 100, 300, 150), "Hotfix"))
{
luaenv.DoString(@"
local tick = 0
xlua.hotfix(CS.HotfixTest, 'Update', function()
tick = tick + 1
if (tick % 50) == 0 then
print('<<<<<<<<Update in lua, tick = ' .. tick)
end
end)
");
}
}
根据你的范例,我想用lua重写Update方法,tick是一个类变量,我不能直接使用而要在lua中重新声明,如果我update中调用了类方法,是不是我也要在lua中重写,再进一步,如果我调用了一个类,是不是我也得在lua中重写这个类?这是否影响了hotfix的易用性,因为我只是想重写update方法。

Loading script assembly "Library/ScriptAssemblies/Assembly-CSharp.dll" failed!

AssemblyResolutionException: Failed to resolve assembly: 'UnityEngine, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'
Mono.Cecil.BaseAssemblyResolver.Resolve (Mono.Cecil.AssemblyNameReference name, Mono.Cecil.ReaderParameters parameters)
Mono.Cecil.BaseAssemblyResolver.Resolve (Mono.Cecil.AssemblyNameReference name)
Mono.Cecil.DefaultAssemblyResolver.Resolve (Mono.Cecil.AssemblyNameReference name)
Mono.Cecil.MetadataResolver.Resolve (Mono.Cecil.TypeReference type)
Mono.Cecil.ModuleDefinition.Resolve (Mono.Cecil.TypeReference type)
Mono.Cecil.TypeReference.Resolve ()
Mono.Cecil.Mixin.CheckedResolve (Mono.Cecil.TypeReference self)
Mono.Cecil.MetadataBuilder.GetConstantType (Mono.Cecil.TypeReference constant_type, System.Object constant)
Mono.Cecil.MetadataBuilder.AddConstant (IConstantProvider owner, Mono.Cecil.TypeReference type)
Mono.Cecil.MetadataBuilder.AddParameter (UInt16 sequence, Mono.Cecil.ParameterDefinition parameter, Mono.Cecil.ParamTable table)
Mono.Cecil.MetadataBuilder.AddParameters (Mono.Cecil.MethodDefinition method)
Mono.Cecil.MetadataBuilder.AddMethod (Mono.Cecil.MethodDefinition method)
Mono.Cecil.MetadataBuilder.AddMethods (Mono.Cecil.TypeDefinition type)
Mono.Cecil.MetadataBuilder.AddType (Mono.Cecil.TypeDefinition type)
Mono.Cecil.MetadataBuilder.AddTypeDefs ()
Mono.Cecil.MetadataBuilder.BuildTypes ()
Mono.Cecil.MetadataBuilder.BuildModule ()
Mono.Cecil.MetadataBuilder.BuildMetadata ()
Mono.Cecil.ModuleWriter.b__0 (Mono.Cecil.MetadataBuilder builder, Mono.Cecil.MetadataReader _)
Mono.Cecil.ModuleDefinition.Read[MetadataBuilder,MetadataBuilder] (Mono.Cecil.MetadataBuilder item, System.Func`3 read)
Mono.Cecil.ModuleWriter.BuildMetadata (Mono.Cecil.ModuleDefinition module, Mono.Cecil.MetadataBuilder metadata)
Mono.Cecil.ModuleWriter.WriteModuleTo (Mono.Cecil.ModuleDefinition module, System.IO.Stream stream, Mono.Cecil.WriterParameters parameters)
Mono.Cecil.ModuleDefinition.Write (System.IO.Stream stream, Mono.Cecil.WriterParameters parameters)
Mono.Cecil.ModuleDefinition.Write (System.String fileName, Mono.Cecil.WriterParameters parameters)
Mono.Cecil.AssemblyDefinition.Write (System.String fileName, Mono.Cecil.WriterParameters parameters)
XLua.Hotfix.HotfixInject () (at Assets/XLua/Src/Editor/Hotfix.cs:218)

“某次性能测试” 的疑惑

Doc里的XLua介绍.ppt的倒数第二页 “附录:某次性能测试”,有些疑惑。
比如:
max xlua slua ulua
6249375 1 0.15 0.21
是说执行6249375次,xlua用了一秒,slua和ulua分别用了0.15秒和0.21秒吗?
这样的话 XLua 岂不是要慢很多?

struce/class 映射只支持int类型吗?

public struct Param1
{
public int x;
public string y;
}

[CSharpCallLua]
public interface Param2
{
int x{ get; set; }
int y { get; set; }
}

[XLua.LuaCallCSharp]
public class MyClass
{
public void Test() { Debug.Log("TEST"); }

public void ComplexFunc1(Param1 p1)
{
    Debug.Log("P1 = {x=" + p1.x + ",y=" + p1.y + "}");
}

public void ComplexFunc(Param1 p1, Param2 p2)
{
    Debug.Log("P1 = {x=" + p1.x + ",y=" + p1.y + "}");
    Debug.Log("P1 = {x=" + p2.x + ",y=" + p2.y + "}");
    p2.x = 3;
}

}

发现p1.y 是不行的? 这个特性可以考虑加上吗?

命名空间问题

有些类使用的是Global空间啊,然后就导致了一些问题。比如Coroutine,会跟UnityEngine.Coroutine产生冲突!

[hotfix]标签需要提前打上么

可能产品上线后才能知道具体哪里需要bugfix,热更新这个特性是否可以做到发布时没打[hotfix]标签的类,打补丁时再加上[hotfix]标签?

感觉这样比较适合一般使用场景,尤其是iOS平台。

GetComponentInChildren报错

GetComponent可以正常工作,但是GetComponentInChildren报错 LuaException: invalid arguments to UnityEngine.Component.GetComponentInChildren!

请问是怎么回事呢?

gen wrap file fail! err=TemplateCommon:268: attempt to index a nil value (local 't')

我把所有类都打上hotfix,generate的时候报错了,不知道具体是哪个类处理的时候错误了

gen wrap file fail! err=TemplateCommon:268: attempt to index a nil value (local 't')
stack traceback:
TemplateCommon:268: in function 'GetPushStatement'
TemplateCommon:265: in function 'GetPushStatement'
[string "luatemplate"]:55: in local 'callback'
TemplateCommon:111: in function 'ForEachCsList'
[string "luatemplate"]:52: in local 'callback'
TemplateCommon:111: in function 'ForEachCsList'
[string "luatemplate"]:8: in main chunk, stack= at XLua.LuaEnv.ThrowExceptionFromError (Int32 oldTop) [0x00047] in G:\work\zhwangScPerf\Engine\AssetBundleFramework\Assets\XLua\Src\LuaEnv.cs:360
at XLua.LuaFunction.Call (System.Object[] args, System.Type[] returnTypes) [0x00093] in G:\work\zhwangScPerf\Engine\AssetBundleFramework\Assets\XLua\Src\LuaFunction.cs:168
at XLua.LuaFunction.Call (System.Object[] args) [0x00000] in G:\work\zhwangScPerf\Engine\AssetBundleFramework\Assets\XLua\Src\LuaFunction.cs:183
at TemplateEngine.LuaTemplate.Execute (XLua.LuaFunction compiledTemplate, XLua.LuaTable parameters) [0x00007] in G:\work\zhwangScPerf\Engine\AssetBundleFramework\Assets\XLua\Src\TemplateEngine\TemplateEngine.cs:186
at CSObjectWrapEditor.Generator.GenOne (System.Type type, System.Action2 type_info_getter, UnityEngine.TextAsset templateAsset, System.IO.StreamWriter textWriter) [0x00085] in G:\work\zhwangScPerf\Engine\AssetBundleFramework\Assets\XLua\Src\Editor\Generator.cs:383 UnityEngine.Debug:LogError(Object) CSObjectWrapEditor.Generator:GenOne(Type, Action2, TextAsset, StreamWriter) (at Assets/XLua/Src/Editor/Generator.cs:390)
CSObjectWrapEditor.Generator:GenDelegateBridge(IEnumerable`1, String) (at Assets/XLua/Src/Editor/Generator.cs:595)
CSObjectWrapEditor.Generator:GenDelegateBridges() (at Assets/XLua/Src/Editor/Generator.cs:711)
CSObjectWrapEditor.Generator:GenAll() (at Assets/XLua/Src/Editor/Generator.cs:1086)

请问 hotfix 子类中重载父类的方法

父类中有个 :
public virtual void Awake()
{
Debug.Log("name" + gameObject.name);
}
子类中重载:
public override void Awake()
{
base.Awake();
Debug.Log("testpanel awake===");
}
我在hotfix 这个子类的Awake时:
xlua.hotfix(CS.TestPanel, 'Awake', function()
print('<<<<<<<<Awake in lua')
end)
这里,有什么办法还可以执行到父类的Awake。

关于生成代码

为了测试代码加[Hotfix] 对生成代码大小影响,我给所有给ngui的所有代码都加了[XLua.Hotfix(XLua.HotfixFlag.Stateful)],但是调用生成的时候,
gen wrap file fail! err=TemplateCommon:268: attempt to index a nil value (local 't')
stack traceback:
TemplateCommon:268: in function 'GetPushStatement'
TemplateCommon:265: in function 'GetPushStatement'
[string "luatemplate"]:55: in local 'callback'
TemplateCommon:111: in function 'ForEachCsList'
[string "luatemplate"]:52: in local 'callback'
TemplateCommon:111: in function 'ForEachCsList'
[string "luatemplate"]:8: in main chunk, stack= at XLua.LuaEnv.ThrowExceptionFromError (Int32 oldTop) [0x00047] in F:\XLua&ULua\xLua-master-ngui-hotfix\Assets\XLua\Src\LuaEnv.cs:360
at XLua.LuaFunction.Call (System.Object[] args, System.Type[] returnTypes) [0x00093] in F:\XLua&ULua\xLua-master-ngui-hotfix\Assets\XLua\Src\LuaFunction.cs:168
at XLua.LuaFunction.Call (System.Object[] args) [0x00000] in F:\XLua&ULua\xLua-master-ngui-hotfix\Assets\XLua\Src\LuaFunction.cs:183
at TemplateEngine.LuaTemplate.Execute (XLua.LuaFunction compiledTemplate, XLua.LuaTable parameters) [0x00007] in F:\XLua&ULua\xLua-master-ngui-hotfix\Assets\XLua\Src\TemplateEngine\TemplateEngine.cs:186
at CSObjectWrapEditor.Generator.GenOne (System.Type type, System.Action2 type_info_getter, UnityEngine.TextAsset templateAsset, System.IO.StreamWriter textWriter) [0x00085] in F:\XLua&ULua\xLua-master-ngui-hotfix\Assets\XLua\Src\Editor\Generator.cs:383 UnityEngine.Debug:LogError(Object) CSObjectWrapEditor.Generator:GenOne(Type, Action2, TextAsset, StreamWriter) (at Assets/XLua/Src/Editor/Generator.cs:390)
CSObjectWrapEditor.Generator:GenDelegateBridge(IEnumerable`1, String) (at Assets/XLua/Src/Editor/Generator.cs:592)
CSObjectWrapEditor.Generator:GenDelegateBridges() (at Assets/XLua/Src/Editor/Generator.cs:708)
CSObjectWrapEditor.Generator:GenAll() (at Assets/XLua/Src/Editor/Generator.cs:1083)

热更新问题

热更新某个c#类的成员函数,如何在lua中访问该类的私有变量?

反射调用c#类的私有方法

有c#方法
public class A{ void foo(int x) { } }

想在lua通过反射
MethodInfo.Invoke(Object obj, Object[] params)
调用:
method:Invoke(obj, { 2017 })

但是传参的时候报错了,求指点:
LuaException: c# exception:invalid obj for System.Reflection.BindingFlags,stack: at XLua.ObjectCasters+c__AnonStorey59.<>m__B1 (IntPtr L, Int32 idx, System.Object target) [0x00000] in :0
at XLua.OverloadMethodWrap.Call (IntPtr L) [0x00000] in :0
at XLua.MethodWrap.Call (IntPtr L) [0x00000] in :0
stack traceback:
[C]: in method 'Invoke'
[string "chunk"]:17: in function <[string "chunk"]:9>
XLua.LuaEnv.ThrowExceptionFromError (Int32 oldTop)
XLua.DelegateBridge.SystemVoid (XLua.LuaTable self) (at Assets/XLua/Gen/UnityEngineBoundsWrap.cs:539)

集中了几个问题在一个issue

1.我看了下介绍

  • 开发期无需生成代码
  • Generate Code 和反射间可无缝切换
    这里的意思是指平时不生成的时候 lua 是用反射来调用c#的类吗?或者说这个生成代码到底干了什么?
  1. #4

热补丁的基本原理是在il层面上对原有代码加了一点逻辑实现的。
而Hotfix标签相当于白名单,列出哪些类型要做上述预处理。
当然,要默认对用户所有类型都预处理也是可以的,看需求,如果需求强烈,可以设置一个宏,不用打标签,对所有类型都处理。

我还是有点不解,这里设置一个宏的意思是什么?

3.我实际运行了一下hotfix的那个例子,添加了HOTFIX_ENABLE宏 ,cp 了Mono.Cecil.dll,但是还是需要我 inject 标识那个类,并且要生成代码才能inject finish?
这样一来是不是就是说如果想要热补丁,就必须对那个c#类进行inject处理 然后发布的时候生成代码?
这样一来如果发布的时候那个c#类出问题了该怎么办呢?

不好意思,麻烦解答下

文档中有误

OSX命令行 cp /Applications/Unity/Unity.app/Contents/Managed/Mono.Cecil.* Project/Assets/XLua/Src/Editor/

此处应该为

OSX命令行 cp /Applications/Unity/Unity.app/Contents//FrameWorks/Managed/Mono.Cecil.* Project/Assets/XLua/Src/Editor/

热更重载函数

lua热更某个C#重载函数,可以简洁的调用c#父类的虚函数吗?
类似这样 base.method()

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.