2014-11-24 52 views
0

我想在我的C#.NET程序中实现lua脚本,但是当我执行代码时,其中一个方法没有执行。LuaInterface不调用方法

这里是类:

namespace Program1 
{ 
    public class LuaFunctions 
    { 
     Client Client { get; set; } 
     private Lua lua { get; set; } 

     public LuaFunctions(Client c) { 
      this.Client = c; 
      this.lua = new Lua(); 

      registerFunctions(); 
     } 

     public void ExecuteCode(string code) 
     { 
      this.lua.DoString(code); 
     } 

     private void registerFunctions() 
     { 
      lua.RegisterFunction("message", this, this.GetType().GetMethod("Message")); 
      lua.RegisterFunction("pname", this, this.GetType().GetMethod("playername")); 
     } 

     public void Message(string s) 
     { 
      System.Windows.Forms.MessageBox.Show(s); 
     } 

     public string playername() 
     { 
      return Client.Player.Name; 
     } 
    } 
} 

当我执行这行Lua代码“消息(PNAME)”,它甚至不尝试执行方法“playername()”返回一定的价值,所以它会在DoString()行中崩溃,因为“pname”是“返回”null。

+3

如果你试图调用'pname'功能,那么你需要'消息(PNAME())'。 'message(pname)'是要使用'pname' *函数*作为'message'函数的值。 – 2014-11-24 01:28:09

+0

你是对的,我试图创建像使用一些“自定义变量”,如$ name,所以我可以使用像,如果($ name ==“Kyore”),那么,你知道怎么样可能做到这一点? – Kyore 2014-11-24 02:03:57

+0

如果您试图让变量自动更新/ etc。你必须看看LuaInterface是否支持这个功能。如果你只是想能够设置变量,那么你只需要在调用想要使用它的代码之前设置全局或本地/环境变量。而不是注册一个函数。 – 2014-11-24 13:32:28

回答

0

pname正在被注册为一个函数,未被设置为包含字符串值的变量。

message(pname)执行message功能报错pname函数而不是报错一个字符串(或主叫pname结果)函数的值。

要将pname函数的结果传递给message,您需要使用message(pname())

+0

谢谢你的解释,你知道如何创建一个变量而不是函数来返回一个值吗? – Kyore 2014-11-24 13:54:04

+1

@Kyore我不知道。应该有一种方法来创建一个应该很容易找到的全球化(我会认为)。这说的不是Lua Interface“暂时搁置”吗? github页面似乎建议使用'NLua'来代替它。 – 2014-11-24 13:58:55

0

这取决于您正在尝试创建变量的位置。如果你试图在Lua中设置一些变量,那么lua["somevariable"] = "value";就可以工作。更完整的例子是:

传递原始值的状态:

double val = 12.0; 
lua["x"] = val; // Create a global value 'x' 
var res = lua.DoString ("return 10 + x*(5 + 2)")[0] as double; 

检索全局值:

lua.DoString ("y = 10 + x*(5 + 2)"); 
var y = lua["y"] as double; // Retrieve the value of y