Unity SLua 如何调用Unity中C#方法

1.原理

就是通常在Lua框架中所说的,开放一个C#的web接口,或者叫做在Slua框架中注册函数。

2.作用

在Lua中调用C#中的方法,这个是在做热更新中很常用的一种方法,无论是slua,还是lua,都差不多、这里,我拿slua举例。

3.实际运用 举例:如何在Slua中打印Log

原理:其实是slua通过调用C#中的Debug.Log方法实现的打印,并不是说是lua中的打印方法起到作用。

步骤:

首先,既然是Lua调用C#中的方法,这里自定义写一个打印log的方法。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28


public class CDebug {

    /// <summary>

    /// lua中打印Log

    /// </summary>

    /// <param name="title">标题</param>

    /// <param name="contents">内容</param>

    public static void Log(string title,string contents)

    {

        int level = 3;

        //这里代码不需要解释把,如果对颜色有需求,可以自己稍微修改一下。

        switch(level)

        {

            case 1:

                Debug.Log(contents);

                break;

            case 2:

                Debug.LogWarning(title+":"+ contents);

                break;

            case 3:

                Debug.LogError(title + ":" + contents);

                break;

            default:

                Debug.Log(contents);

                break;

        }

    }

}

  I:

注意图中 标红。一般每个lua框架中,都会有这么个注册函数,加了这个注册函数。才会,有下面那步。执行。

II:

点击 Slua->Custom->Make

之后,发现编译之后,多一个:

III:

注意:之后我们可以看到多了一个脚本,用svn版本控制,对比一下文件,其实还是有其他地方改动的。

会发现BindCustom文件中的代码变成了


1

2

3

4

5

6

7

8

9

10

11

12

13


public class BindCustom {

        public static Action<intptr>[] GetBindList() {

            Action<intptr>[] list= {

                 Lua_CDebug.reg, //这是自动生成的,多附加的

// 因为之前我们看到CustomExport脚本中的OnAddCustomClass方法中

//很多方法是被注释了,所以,需要手动把之前生成过的文件加上,具体看

//SVN版本控制对比一下BundCustom脚本,需要把之前生成过的代码

//手动加上。

//附加:这个不是什么BUG,因为别人以为所有需要在Lua中调用C#的代码都附加好了,

//所以,不需要了,假如我们的项目需要上线,也需要还原Log方法,因为他会打包到

//apk包中的.

</intptr></intptr>

  

这样一个调用C#中的方法的功能做完了,其他的类似的,仿照这个例子就可以。

时间: 2024-10-28 12:01:07

Unity SLua 如何调用Unity中C#方法的相关文章

绑定服务调用远程服务中的方法

在Andorid平台中,各个组件运行在自己的进程中,他们之间是不能相互访问的,但是在程序之间是不可避免的要传递一些对象,在进程之间相互通信.为了实现进程之间的相互通信,Andorid采用了一种轻量级的实现方式RPC(Remote Procedure Call 远程进程调用)来完成进程之间的通信,并且Android通过接口定义语言(Andorid Interface Definition Language ,AIDL)来生成两个进程之间相互访问的代码,例如,你在Activity里的代码需要访问Se

webview中js调用Android中的方法

package com.example.helloworld; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.view.Menu; import android.webkit.WebView; public class MainActivity extends Activity { private WebView webView = null

使用Java的反射功能调用类中的方法

最近一直在搞Java的反射,今天使用反射调用方法时出现了很多问题,主要是没有详细参考官方API.所以走了很多弯路. 所以想把这个例子记下来,供自己也供他人学习. package com.mine.practice.reflect; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /** * 使用反射调用类中的方法 * @author 2014-11-5 上午10:51:28

在Android Studio中调用so中的方法

本节用的so是上节用Android Studio创建的so.想在Android Studio中调用so中的方法,需要先引用so.Android Studio中引用so的方法有二种,下面开始介绍. 一 引用so  在app/src/main目录下新建Directory,命名文件夹为jniLIB(文件名不能错),把so文件放进去 ,如图: 二 编写java代码调用so中方法 ①在代码中引用so 创建myJNI.java文件,用System.loadLibrary加载so,同时声明so中的HelloW

通过反射调用类中的方法

操作步骤: 1:实例化Class: 2:通过Class类的getMethod()方法取得一个Method的对象,并设置次方法操作时所需的参数类型: 3:使用invoke进行调用,并向方法中传递要设置的参数,但在使用invoke()方法时必须传入一个类的实例化对象 实例1:sayChina()方法中没有参数 package cn.itcast02; import java.lang.reflect.Method; //调用Person类中的sayChina()方法,没有参数 public clas

使用AIDL调用服务中的方法

AIDL:android interface define language(接口定义语言) 作用:方便远程调用其他服务中的方法 注意:安卓四大组件都要在清单文件注册 aidl创建图: interface InterfaceAidl { void interfacePay(); } public class MyService extends Service { class MyBinder extends InterfaceAidl.Stub { @Override public void i

纯静态界面中(html)中通过js调用dll中的方法从数据库中读取数据

最近接到一个离职员工的任务,一个搭好框架的ERP系统,看了两天,说一下看到的东西,整个项目目录中我没发现一个.aspx后缀的文件,全是静态HTML文件,之后发现他用的jquery简直看的头疼,不过大概能看懂,发现一个可能大家会感兴趣的东西,他在静态界面中通过js对象就直接调DLL中的方法从数据库中得到数据并通过js加载出来,当时我就瞎了,他的大概过程是: 建立了多个js对象(数据库中一张表对应一个),并为这个对象添加了很多与DLL中对应的方法,比如DLL中有一个对用户表修改用户密码的操作,那他j

本地应用调用远程服务中的方法

*  AIDL:安卓接口定义语言 ,来公开服务的接口的方式来暴露服务接口* IPC:进程间通讯 intel-process communication* AIDL编写步骤: 远程工程 1. 把IRemoteService.java接口改成.aidl的接口 2. 去掉.aidl接口文件的权限修饰符public 3. 让远程服务里的内部类继承Stub package com.example.alipay; import android.app.Service; import android.cont

Unity扩展GameObject等类中的方法

有时我们想在添加组件时避免重复添加,就需要先把存在的组件删除.于是写出扩展方法封装AddComponent. public static class Assist { public static T AddComponentSingle<T>(this GameObject gameObject) where T : Component { return addcomponentSingle<T>(gameObject); } public static T AddComponen