下面我们开始今天的Unity3D技能培训。 我们学习Unity3D培训目标:让U3D初学者可以更快速的掌握U3D技术,自行制作修改素材,可以独立完成2D、3D小规模游戏及网页游戏开发。
好了,下面我们就来一起学习在Unity3D项目中如何使用Lua语言吧,Unity3D基于Mono虚拟机,所以理论上.NET的类库是可以直接在Unity3D中使用的。可是考虑到Unity3D跨平台的需要,我们选择的工具必须在各个平台获得良好的支持。在前文中提到的LuaInterface理论上是可以在Unity3D中使用的,可是由于IOS不支持反射机制,所以这个类库我们无法直接在Unity3D中使用的。。好了,我们,现在来创建一个简单地Unity项目:
第一步是下载UniLua:http://github.com/xebecnan/UniLua。将UniLua引用到项目中有两种方法,一种是将该项目中的UniLua编译成dll然后在Unity项目中使用,一种是将该项目中的UniLua直接复制到Unity 项目中,我们这里使用第二种方法,因为博主比较懒,呵呵。将UniLua的命名空间添加到我们项目中,我们就可以开始动手写程序了。不过这里,博主想说的是Mono可能会导致的一个错误,估计是阿楠在写这个项目的时候使用了.NET4.0以上的版本,而在.NET4.0以上的版本是支持默认参数的构造函数的。可是由于Mono默认使用的是.NET3.5,所以在编译项目的时候就会报错,我们可以通过Project->Assembly-CSharp->Build->General将.NET的目标框架设为4.0,这样就可以解决这个问题了。好了,下面我们开始写代码啦,首先创建一个InvokeScript.cs的脚本:
[csharp] view plaincopyprint?
using UnityEngine;
using System.Collections;
using UniLua;
public class InvokeScript : MonoBehaviour {
//Lua脚本文件,我们将在C#调用该脚本
public TextAsset LuaFile;
//Lua虚拟机
private ILuaState mLua;
void Start()
{
//初始化Lua虚拟机
mLua=LuaAPI.NewState();
//加载Lua标准库
mLua.L_OpenLibs();
//引用一个静态地C#库
mLua.L_RequireF(CSharpLib.CLASSNAME,CSharpLib.InitLib,false);
//执行Lua脚本
mLua.L_DoString(LuaFile.text);
}
void OnGUI()
{
if(GUILayout.Button("调用Lua脚本",GUILayout.Height(30)))
{
InvokeLua();
}
if(GUILayout.Button("调用C#脚本",GUILayout.Height(30)))
{
InvokeCSharp();
}
}
#region 调用C#脚本
void InvokeCSharp()
{
//获取方法并传入参数
mLua.GetGlobal("SumAndSub");
mLua.PushInteger(12);
mLua.PushInteger(8);
mLua.PCall(2,4,0);
}
#endregion
#region 调用Lua脚本
void InvokeLua()
{
//获取Lua脚本中的arg1参数
mLua.GetGlobal("arg1");
//输出arg1
Debug.Log("Lua脚本中的变量arg1="+mLua.L_ToString(-1));
//获取Lua脚本中的arg2参数
mLua.GetGlobal("arg2");
//输出arg2
Debug.Log("Lua脚本中的变量arg2="+mLua.L_ToString(-1));
//获取Lua脚本中的Printf方法
mLua.GetGlobal("Printf");
//调用Lua脚本中的Printf方法
mLua.PCall(0,0,0);
//获取Lua脚本中的Sum方法
mLua.GetGlobal("Sum");
//传入参数12和25
mLua.PushInteger(12);
mLua.PushInteger(25);
//调用此方法
mLua.PCall(2,3,0);
//获取传入的两个参数及求和结果
int a=mLua.ToInteger(-3);
int b=mLua.ToInteger(-2);
int sum=mLua.ToInteger(-1);
//输出
Debug.Log("调用Lua脚本中的Sum方法:"+a+"+"+b+"="+sum);
}
#endregion
}
[csharp] view plaincopyprint?
在这段脚本中,我们首先初始化了Lua环境,这一点和我们在C++中使用Lua是一样的,因为UniLua在设计API的时候在命名上和LuaAPI保持了高度的一致,如果你对Lua API足够熟悉的话,那么现在这一切对你而言应该会很简单的。接下来,我们通过Require的形式引入了我们编写的一个C#库,它是一个静态库,目的是封装C#方法以便于Lua脚本来调用,这一部分我们稍后会讲到。接下来,我们通过Unity的AssetText加载了一个Lua脚本文件,该脚本的文件的扩展名是.txt,因为我们只需要Lua脚本的内容。在脚本中我们定义了两个方法InvokeLua和InvokeSharp来分别调用Lua脚本和C#脚本。好了,接下来,我们重点来讲Lua调用C#脚本的这部分,因为UniLua在调用函数这块儿和LuaInterface不太一样,所以我们不能再用原来的先注册C#方法然后再像Lua脚本方法一样,不过这里的原理是一样的,不过UniLua提供了更好的方法绑定机制,我们来看下面的脚本:
[csharp] view plaincopyprint?
using UnityEngine;
using System.Collections;
using UniLua;
public static class CSharpLib
{
//当前类文件名称,我们将在Lua脚本中使用这个名称
public const string CLASSNAME="CSharpLib.cs";
//C#库初始化
public static int InitLib(ILuaState lua)
{
NameFuncPair[] define=new NameFuncPair[]
{
new NameFuncPair("SumAndSub",SumAndSub),
};
lua.L_NewLib(define);
return 1;
}
//我们在C#中定义一个求和差的方法
public static int SumAndSub(ILuaState lua)
{
//第一个参数
int a=lua.L_CheckInteger(1);
//第二个参数
int b=lua.L_CheckInteger(2);
//计算和
int c=a+b;
//计算差
int d=a-b;
//将参数及计算结果压入栈
lua.PushInteger(a);
lua.PushInteger(b);
lua.PushInteger(c);
lua.PushInteger(d);
//有四个返回值, 尽管在C#中不支持返回多个值,可是在Lua中这样是支持的
return 4;
}
}
大家一定注意到这里有个NameFuncPair类吧,这就是在UniLua中用来将一个C#方法和Lua方法进行绑定的方法,我们首先构造这样一个NameFuncPair数组,然后将其加入到lua_L_NewLib()的参数中,这样相当于是注册了一个库,我觉得应该就是注册了一个方法集合吧.而CLASSNAME是一个表示当前类名称的常量,可以取任意字符,这里我们使用该类的文件名我们将在Lua脚本是用这个值来查找当前类.接下来,我们可以看到博主构造了一个求和差的C#方法,这个方法和Lua API中定义的方法是一致的,即我们需要指定该方法会返回的值得数目.如果我们需要返回一个值,就要把它通过push系列的方法压入栈中.这里我们返回了四个值,大家一定会问好是C#还支持返回多个值啊,其实呢,这是Lua语言提供给我们的一个福利啊,比如我们需要返回一个物体在3D世界里的坐标,通常情况下,我们需要用三个赋值语句才能获取吧,可是你用Lua的话,一行代码就可以搞定啦.好,现在我们回到InvokeScript脚本的Start方法中,大家可以注意到这里有一个L_RequireF()的方法,前面只是轻描淡写地说它引入了一个库,那么现在我们看看它具体做了什么吧,第一个参数表示这个类的名字,指向我们定义好的CLASSNAME,第二个参数是这个类的初始化方法指向InitLib()方法,第三个参数是是否要在全局空间中使用这个库,这里我们选在false.好了,这样,我们就完成了C#脚本的编写.好了,下面我们在项目中创建一个纯文本文件,我们输入如下代码:
[plain] view plaincopyprint?
local csharplib=require"CSharpLib.cs"
arg1="Unity3D"
arg2="Unreal"
arg3="Coco2dX"
function Printf()
print("This is the methods invoked in Lua")
end
function Sum(a,b)
return a,b,a+b
end
function SumAndSub(a,b)
print(csharplib.SumAndSub(a,b))
end
第一行代码同样是一个require的方法,这是Lua脚本中引用一个库的方法,该方法可以引用Lua的标准库,同样可以引用我们定义的外部库,大家注意到这里的名字和我们之前定义的CLASSNAME是一样的,因为我们就是通过这个名字来查询这个库的,我们在Lua环境中注册了这个库,所以现在才可以引用这个库.在这段脚本中我们定义了几个字符型的变量,两个Lua方法,一个用Lua包装的C#方法.好了,现在我们将这个文本文件指定到InvokeScript的LuaFile字段,我们通过LuaFille的text获取脚本内容,然后通过DoString()方法来执行脚本中的内容,注意这里要先对C#库进行注册,然后再执行脚本中的内容,否则会出现错误.好了,最后,我们来一起看看运行效果吧:
大家可以看到C#调用的Lua脚本中我们获取了脚本中的两个变量arg1、arg2,调用了Lua中定义的两个方法,而最后一个方法,如我们所愿,它返回了四个值,这正是我们所希望的结果.这里顺便说一下啊,在Lua中的print方法和return在Call以后是可以直接在Debug中输出结果的,无需我们再去做Log。更多精彩unity3d技术文章请点击 http://www.gopedu.com/article
分享到:
相关推荐
《Unity3D网络游戏实战游戏开发与设计技术丛书》是一本专为学习Unity3D和Lua编程语言的游戏开发者准备的教材。Unity3D是一款强大的跨平台游戏引擎,它被广泛应用于制作2D、3D游戏,虚拟现实(VR)、增强现实(AR)...
本项目"build_xlua_with_libs-master_lua_Unity热更新_unity3D游戏_androidunity_"提供了一个基于Lua的解决方案,用于实现Unity在Android和iOS平台上的热更新功能。 首先,我们要理解什么是Lua。Lua是一种轻量级的...
Unity3D的API分为多个部分,包括C#脚本API、UnityScript(JavaScript的变种,现已不再支持)API以及Lua插件的API。其中,C# API是最常用的部分,因为C#是Unity3D的主要编程语言。C# API涵盖了Unity的所有组件、类、...
它允许开发者将C++代码编译为lua库,然后在Unity3D中通过tolua调用,从而实现高效的游戏逻辑处理。在本DEMO中,tolua将用于调用kbengine的API,使游戏客户端能与服务器进行有效通信。 四、DEMO实践:kbengine_unity...
在Unity3D项目中,Lua常用于编写游戏逻辑,因为它的执行速度快、易于学习且便于调试。 压缩包中的"Excel转Lua"工具,可能是通过读取Excel文件中的数据,然后根据预设的规则或模板生成对应的Lua脚本。这种工具的优点...
在游戏开发领域,Unity3D作为一款强大的跨平台引擎,因其丰富的功能和易用性而备受开发者喜爱。同时,Lua作为一种轻量级的脚本语言,以其简洁的语法和高效的执行性能,在游戏开发中广泛用于编写逻辑代码。当Unity与...
描述中提到的链接是一个关于Unity3D与Lua集成的教程,Lua是一种轻量级的脚本语言,常用于游戏开发中的逻辑控制。LuaFramework_UGUI-master这个文件名可能是指一个开源的Unity3D项目,它包含了使用Lua进行游戏逻辑...
- **Mário Kašuba**:拥有斯洛伐克技术大学应用信息学硕士学位,在校期间曾使用Lua语言进行3D机器人模拟,并开发了多种多媒体应用程序和计算机游戏。目前,他是IT Academy公司的共同创始人兼首席信息官,并且教授C...
例如,CryEngine 和 Unity3D 都支持 Lua 脚本,开发者可以通过 Lua 编写游戏的事件处理、AI 等功能。 **Python** Python 是一种高级、通用的编程语言,以其易读性和强大的库支持著称。在游戏开发中,Python 可用于...
Unity是一款强大的跨平台游戏开发引擎...在`Tutorial-chess`这个压缩包中,你可以找到实现这些功能的源代码和资源文件,通过学习和研究,可以加深对Unity游戏开发的理解,掌握游戏逻辑实现、UI设计和优化等方面的技能。
【tolua WebGL库】是一个将Lua脚本语言与WebGL图形渲染技术相结合的工具,它允许开发者使用Lua编写游戏或交互式应用的逻辑,并通过WebGL在浏览器中实现高性能的3D图形渲染。这个库的出现使得开发人员可以利用Lua的...
通过研究《突出重围》的源码,开发者不仅可以提升Unity3D的技能,还能学习到游戏开发的整体流程和设计思路,为自己的项目提供灵感和参考。同时,这也是一个很好的实战案例,帮助开发者深入理解游戏开发中的实际问题...
Unity是全球广泛使用的跨平台游戏开发引擎,特别适合制作2D和3D的互动内容。Unity2019.3版本是该引擎...通过阅读这份手册,开发者不仅可以了解Unity2019.3的最新功能,还能学习到性能优化的技巧,提高自己的开发技能。
2. C#:C#是Microsoft开发的一种面向对象的编程语言,广泛应用于Windows平台的游戏开发,尤其与Unity 3D引擎搭配使用,可以创建高性能的2D和3D游戏。在斗地主服务端,C#可能用于构建网络通信模块,处理客户端请求,...
1. **Unity引擎**:Unity是游戏开发中最常用的跨平台引擎之一,涉及到3D图形渲染、物理引擎、碰撞检测、脚本系统等多个方面。理解和掌握Unity引擎的工作原理及其API,是成为合格Unity开发者的基础。 2. **数据结构...
《基于uLua与NGUI的资源打包与代码热更新游戏框架源码解析》 在现代游戏开发中,高效地管理资源以及实现代码...此框架的源码提供了深入学习和自定义游戏开发的宝贵资料,对提升开发者在Unity3D环境下的技能大有裨益。
Unity3D游戏开发中的网络游戏服务器架构设计对于成为一名优秀的主程至关重要。在着手新项目时,作为主程,首要任务是明确以下几个关键点: 1. **服务器操作系统环境**:选择服务器运行的操作系统需要考虑到稳定性、...
Unity3D是一款强大的跨平台游戏开发工具,它支持创建2D和3D游戏、实时渲染场景以及其他交互式3D应用。它的核心是基于C#的脚本系统,C#是Unity的主要编程语言,提供了丰富的功能和高性能,特别适合处理游戏逻辑和对象...
11. Unity3D、UE4 等游戏引擎开发经验:游戏服务器岗位职责中提到 Unity3D、UE4 等游戏引擎开发经验,说明 Unity3D、UE4 等游戏引擎开发经验是游戏服务器开发中不可或缺的一部分。 12. 计算机相关专业本科以上学历...
在游戏开发中,常见的脚本语言有Lua、Python、JavaScript(例如Unity3D中的UnityScript和C#)等。这些脚本语言能够帮助开发者轻松实现游戏逻辑、交互、动画控制等。 以"影流之主"为例,劫是《英雄联盟》中一个非常...