Mapz / LuHaxe

LuHaxe is a Haxe to Lua solution for Unity

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

LuHaxe

LuHaxe是我的一个脑洞概念实现,它的目标是让程序员通过编写Haxe(与ActionScript、TypeScript极其相似的体验和手感),完成Unity3D环境中lua脚本的开发工作。胶水中的胶水,不会lua也能写一手好lua的胶水。

LuHaxe特点

  • 底层采用某大神的tolua,成熟稳定,重复造车轮子不是脑洞的目的。因此本框架具有tolua的全部特点。
  • 采用Haxe语言进行脚本编写,并“翻译”成lua执行,代替在tolua环境下进行lua脚本编写的传统开发模式。
  • Haxe是强类型的面向对象语言,具有完整的面向对象特性,包括但不限于继承、接口、抽象、重载、g/setter、lambda、泛型模板等,详见Wiki。更贴合Java、C#等程序员的书写和设计习惯。
  • 支持HaxeDevelop(FlashDevelop)、VS Code等代码编辑工具,具有完善的代码提示、代码自动完成、Refactor、类型检测、编译时错误检测等。解决了当下lua开发中比较大的痛点,方便多人同步进行规模化开发。
  • 可通过trace输出日志的方式调试Haxe文件,亦可以通过tolua的调试机制调试生成的lua文件。
  • AS、TS、JS程序员可三分钟内上手。
  • 有成品的Haxe库和底层库不依赖tolua,如:PureMVC(MVC框架)Enitias(ECS框架)Protobuf(序列化)Bson(序列化)TCP/UDP Socket等。移植其他语言类库也比较容易。
  • Haxe可输出成多种主流语言,因此前后端通用的战斗逻辑可统一用Haxe进行编写,然后输出成服务器相对应的语言即可。

安装(Windows)


示例

package example;
import unityengine.Object;
import unityengine.PrimitiveType;
import unityengine.GameObject;
import unityengine.Resources;
import Global.*;
import unityengine.WWW;
import unityengine.ui.Text;

class Example{
	private var go:GameObject;
	private var cube:GameObject;
	private var sphere:GameObject;
	private var txt:GameObject;
	
    public function new(){
	//测试GameObject
	this.go = GameObject.New("go");
	this.go.AddComponent(typeof(unityengine.ParticleSystem));
	this.cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
	this.sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere);
	this.cube.transform.position = Vector3.New(3, 0, 0);

	//测试Prefab
	var canvas = GameObject.Find("Canvas");		
	this.txt = Object.Instantiate(Resources.Load("TextPreb"));
	this.txt.transform.parent = canvas.transform;

	//测试Update方法
	TimerHelper.AddUpdateListener(this, this.Update);

	//Coroutine 测试协程
	Coroutine.start(CoFunc);	
    }
	
    public function Update():Void{
	//测试GameObject位移
	var pos = this.cube.transform.position;
	var newPos = Vector3.New(pos.x + 0.01, pos.y, pos.z);
	this.cube.transform.position = newPos;
    }

    private function CoFunc():Void{
	//测试网络加载、协程、获取组件
	var www = WWW.New("http://www.baidu.com");
	Coroutine.www(www);
	var content = DataHelper.WWWtoString(www);
	trace(content);
	this.txt.GetComponent(typeof(Text)).text = "Bytes Downloaded:" + www.bytesDownloaded;
	Coroutine.wait(3);
	this.txt.GetComponent(typeof(Text)).text = "Coroutine Ended";
    }
}

创建API映射

Haxe调用tolua需要进行API映射,本框架映射API非常简单:

  • tolua中的内容 (Vector3.lua)
function Vector3.New(x, y, z)				

	local t = {x = x or 0, y = y or 0, z = z or 0}

	setmetatable(t, Vector3)						

	return t

end
  • Haxe映射文件 (Vector3.hx)
package;

extern class Vector3 

{

	var x:Float;
	var y:Float;
	var z:Float;
	static function New(x:Float, y:Float, z:Float):Vector3;

}
  • 注意:由于haxe的翻译规则,通过“冒号”进行方法调用lua指令,需要将lua当成“点”的模式进行处理,参考UpdateBeat.hx。

项目进度

当前搭建好了脚手架,进行了可行性验证,但是还有大量API未映射,希望得到各位大神的帮助。

  • 已测试特性:GameObject、协程、UGUI、TCP/WS Socket、WWW。

交流

QQ群:709673804   验证码:撸Haxe

About

LuHaxe is a Haxe to Lua solution for Unity

License:MIT License


Languages

Language:C# 73.4%Language:Lua 17.6%Language:Haxe 8.9%Language:Batchfile 0.1%