Giter Site home page Giter Site logo

unlua's Introduction

LOGO

license release PRs Welcome

概述

UnLua是适用于UE的一个高度优化的Lua脚本解决方案。它遵循UE的编程模式,功能丰富且易于学习,UE程序员可以零学习成本使用。

在UE中使用Lua

  • 直接访问所有的UCLASS, UPROPERTY, UFUNCTION, USTRUCT, UENUM,无须胶水代码。
  • 替换蓝图中定义的实现 ( Event / Function )。
  • 处理各类事件通知 ( Replication / Animation / Input )。

更详细的功能介绍请查看功能清单

优化特性

  • UFUNCTION调用,包括持久化参数缓存、优化的参数传递、优化的非常量引用和返回值处理。
  • 访问容器类(TArray, TSet, TMap),内存布局与引擎一致,Lua Table和容器之间不需要转换。
  • 高效的结构体创建、访问、GC。
  • 支持自定义静态导出类、成员变量、成员函数、全局函数、枚举。

平台支持

  • 运行平台:Windows / Android / iOS / Linux / OSX
  • 引擎版本:Unreal Engine 4.17.x - Unreal Engine 5.x

注意: 4.17.x 和 4.18.x 版本需要对 Build.cs 做一些修改。

快速开始

安装

  1. 复制 Plugins 目录到你的UE工程根目录。
  2. 重新启动你的UE工程

开始UnLua之旅

注意: 如果你是一位UE萌新,推荐使用更详细的图文版教学继续以下步骤。

  1. 新建蓝图后打开,在UnLua工具栏中选择 绑定(可同时按住Alt键自动生成第2步的路径)
  2. 在接口的 GetModule 函数中填入Lua文件路径,如 GameModes.BP_MyGameMode
  3. 选择UnLua工具栏中的 创建Lua模版文件
  4. 打开 Content/Script/GameModes/BP_MyGameMode.lua 编写你的代码

更多示例

最佳实践示例

Lyra with UnLua 基于UE官方 Lyra初学者游戏包 的完整示例项目,目前正在施工中

文档

常用文档:设置选项 | 调试 | 智能提示 | 控制台命令 | FAQ

详细介绍:

  • 编程指南:介绍 UnLua 的主要功能和编程模式
  • 插件与模块:介绍 Plugins 目录下的插件列表以及它们所包含的模块
  • 功能清单:更详细的功能列表
  • 实现原理:介绍 UnLua 的两种覆盖机制
  • API:更详细的 UnLua API 说明

技术支持

  • 官方交流QQ群:936285107
  • 推荐VSCode插件:Lua Booster

unlua's People

Contributors

610789338 avatar 909185693 avatar bobbycalf avatar c209 avatar crazytuzi avatar forsakenyang avatar gotgimhong avatar hernanzhou avatar hohooho avatar hxhb avatar inkiu0 avatar italink avatar jozhn avatar katacai avatar kimixuchen avatar laishikai avatar leo8916 avatar michaelzdl avatar quabqi avatar rowechien avatar shudal avatar shuiliulcl avatar swejackies avatar ubpa avatar wtmsuperman avatar xiejiangzhi avatar xuyanghuang-tencent avatar yangruihan avatar yj66xiaopipi avatar z466chen 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

unlua's Issues

关于静态导出的函数(含非const引用参数)调用方式

对于含非const引用参数的函数,如:
void GetPlayerBaseInfo(int32& Level, float& Health, FString& Name);

据“Programming_Guide”里面介绍,如果上面的函数是UFunction,则在lua中可以这样调用:
local Level, Health, Name = self:GetPlayerBaseInfo()

但如果以上函数是通过静态导出的,如使用ADD_FUNCTION宏导出的,则不能这样调,而需要:
local Level, Health, Name
Level, Health, Name = self:GetPlayerBaseInfo(Level, Health, Name)
不单参数必须填写(否则报参数个数不对的问题),还需要在返回的地方接住这些引用被修改后的值。

请问有更好的方法吗?

打安卓包的时候clang++报错

UATHelper: Packaging (Android (ETC1)): ********** BUILD COMMAND STARTED **********
UATHelper: Packaging (Android (ETC1)): Running: D:\UE\UE_4.22\Engine\Binaries\DotNET\UnrealBuildTool.exe TPSProject Android Shipping -Project=H:\UE_project\MobileTest\MobileTPS.uproject H:\UE_project\MobileTest\MobileTPS.uproject -NoUBTMakefiles -remoteini="H:\UE_project\MobileTest" -skipdeploy -Manifest=H:\UE_project\MobileTest\Intermediate\Build\Manifest
.xml -NoHotReload -log="C:\Users\AERO\AppData\Roaming\Unreal Engine\AutomationTool\Logs\D+UE+UE_4.22\UBT-TPSProject-Android-Shipping.txt"
UATHelper: Packaging (Android (ETC1)): PLATFORM_ANDROID_NDK_VERSION = 140200
UATHelper: Packaging (Android (ETC1)): NDK toolchain: r14b, NDK version: 19, GccVersion: 4.9, ClangVersion: 3.8.275480
UATHelper: Packaging (Android (ETC1)): Compiling Native code with NDK API 'android-19'
UATHelper: Packaging (Android (ETC1)): Writing manifest to H:\UE_project\MobileTest\Intermediate\Build\Manifest.xml
UATHelper: Packaging (Android (ETC1)): Building 2 actions with 12 processes...
UATHelper: Packaging (Android (ETC1)): [1/2] TPSProject-Android-Shipping-armv7-es2.so
UATHelper: Packaging (Android (ETC1)): D:/UE/UE_4.22/Engine/Intermediate/Build/Android/UE4/Shipping/Voice/Module.Voice.cppa7.o:D:/Build/++UE4/Sync/Engine/Intermediate/Build/Android/UE4/Shipping/Voice/Module.Voice.cpp:function FVoiceCaptureOpenSLES::Init(FString const&, int, int): error: undefined reference to 'UAndroidPermissionFunctionLibrary::Initializ
e()'
UATHelper: Packaging (Android (ETC1)): D:/UE/UE_4.22/Engine/Intermediate/Build/Android/UE4/Shipping/Voice/Module.Voice.cppa7.o:D:/Build/++UE4/Sync/Engine/Intermediate/Build/Android/UE4/Shipping/Voice/Module.Voice.cpp:function FVoiceCaptureOpenSLES::Init(FString const&, int, int): error: undefined reference to 'UAndroidPermissionFunctionLibrary::CheckPerm
ission(FString const&)'
UATHelper: Packaging (Android (ETC1)): clang++.exe: error: linker command failed with exit code 1 (use -v to see invocation)
PackagingResults: Error: undefined reference to 'UAndroidPermissionFunctionLibrary::Initialize()'
PackagingResults: Error: undefined reference to 'UAndroidPermissionFunctionLibrary::CheckPermission(FString const&)'
PackagingResults: Error: linker command failed with exit code 1 (use -v to see invocation)
UATHelper: Packaging (Android (ETC1)): Took 28.7963488s to run UnrealBuildTool.exe, ExitCode=5
UATHelper: Packaging (Android (ETC1)): ERROR: UnrealBuildTool failed. See log for more details. (C:\Users\AERO\AppData\Roaming\Unreal Engine\AutomationTool\Logs\D+UE+UE_4.22\UBT-TPSProject-Android-Shipping.txt)
UATHelper: Packaging (Android (ETC1)): (see C:\Users\AERO\AppData\Roaming\Unreal Engine\AutomationTool\Logs\D+UE+UE_4.22\Log.txt for full exception trace)
PackagingResults: Error: UnrealBuildTool failed. See log for more details. (C:\Users\AERO\AppData\Roaming\Unreal Engine\AutomationTool\Logs\D+UE+UE_4.22\UBT-TPSProject-Android-Shipping.txt)
UATHelper: Packaging (Android (ETC1)): AutomationTool exiting with ExitCode=5 (5)
UATHelper: Packaging (Android (ETC1)): BUILD FAILED
PackagingResults: Error: Unknown Error

lua变量共用的问题

我在一个服务端客户端都有的Actor(PlayerController)里,加了个local变量,在ReceiveBeginPlay的时候判断如果是客户端对值 +2,如果是服务端对值+4,运行的时候服务端的local变量是+2,但是客户端的local变量变成+6,如果开启多进程模式或者standalone模式就是正常的,这个有办法解决吗。
另外,目前demo中的AI还是走的行为树和蓝图,如果实现接口用lua重写,效率和蓝图比大概差多少?

如何导出类的静态成员变量

目前似乎没找到对应的宏。
从实现的方面,可以定义一个对应的静态函数来返回,然后导出这个静态函数,不过这样比较繁琐呢。

UI动画无法播放

用UserWidget:PlayAnimation播放widgetanimation没有效果 示例中也没有调用UI动画详细的展示

创建Lua模版按钮所创建的Lua文件的路径和文件名问题

  • GetModuleName 返回 BP_Game 的时候, 创建的 Lua 文件为 BP_Game_C ,加载 Lua 文件的时候,却加载的 BP_Game.lua,导致加载失败

  • GetModuleName 返回 XX.BP_Game_C 的时候,创建的 Lua 文件的位置还是在 Script 目录下,而不是正确的 Script/XX

  • 创建模版的时候,没有提示,直接覆盖了以前的文件,感觉不妥

Plugin compile fails in UE-4.23.0, succeeds in UE-4.22.3

Compiling an empty Unreal (4.23.0) project from Visual Studio fails when the UnLua plugin is added to the project, with this output:

1>------ Skipped Build: Project: UE4, Configuration: BuiltWithUnrealBuildTool Win32 ------
1>Project not selected to build for this solution configuration 
2>------ Build started: Project: Sandbox23, Configuration: Development_Editor x64 ------
2>Creating makefile for Sandbox23Editor (no existing makefile)
2>Creating makefile for UnrealHeaderTool (no existing makefile)
2>UnrealBuildTool : error : Program targets are not currently supported from this engine distribution.
2>C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\VCTargets\Microsoft.MakeFile.Targets(44,5): error MSB3075: The command ""C:\Program Files\Epic Games\UE_4.23\Engine\Build\BatchFiles\Build.bat" Sandbox23Editor Win64 Development -Project="E:\Projects\UE4\Tests\Sandbox23\Sandbox23.uproject" -WaitMutex -FromMsBuild" exited with code 5. Please verify that you have sufficient rights to run this command.
2>Done building project "Sandbox23.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 1 skipped ==========

The compile succeeds when I remove the UnLua plugin from the project.

Compiling a 4.22.3 project from Visual Studio with the UnLua plugin succeeds.

I also tried it with Visual Studio 2019, but there was no difference.

Missing .gitignore

Hi, thanks a lot for releasing this project!

I suppose there needs to be a .gitignore like this one here or running the sample project will make the repo dirty.

Cheers!

用Lua如何从行为树里得到地图当中所有的character?

首先这主要是用来测试的,后面不一定要用get all actors这种方法。但依然,希望将它调试成功。
地图上有两个TestCharacter,TestCharacter(bp类)继承自AMyCharacterBase(cpp类)继承自ACharacter。
在ai行为树的一个service上执行此逻辑:

function BTS_FindTarget_C:ReceiveActivationAI(OwnerController, ControlledPawn)
    --print("enter bts find target")
    local myTeam = ControlledPawn.TeamNum
    --print("can directly get team?", ControlledPawn.TeamNum)
    local allActors = UE4.UGameplayStatics.GetAllActorsOfClass(ControlledPawn, UE4.UClass.Load("ACharacter"))
    print(" all characters: ", allActors)
    --print("value at index 0 is:", allActors:get(0))
    --local n = allActors:length();
    local n = UE4.UKismetArrayLibrary.Array_Length(allActors)
    print("length :" , n)
    for i = 1, n do
        print("the character is:", UE4.UKismetArrayLibrary.Array_Get(allActors, i))
    end
    --print("length", n)
    --for i = 1, 2 do
    --    print("the character:", allActors:get(i))
    --end
    --for i, v in ipairs(allActors) do
    --    print("the character:", v)
    --    if v.TeamNum ~= myTeam then
    --        UE4.UBTFunctionLibrary.SetBlackboardValueAsObject(self, "Target", v)
    --        return
    --    end
    --end
end

得到的结果如下,也就是说未找到这个类的actor:

LogUnLua: == UNLUA_PRINT : length :    0    
LogUnLua: == UNLUA_PRINT :  all characters:     TArray: 0000023053CF10A8    
LogUnLua: == UNLUA_PRINT : length :    0    
LogUnLua: == UNLUA_PRINT :  all characters:     TArray: 00000231BE97FF88   

使用BEGIN_EXPORT_REFLECTED_CLASS编译报错

使用BEGIN_EXPORT_REFLECTED_CLASS导出UClass的非UFunction函数编译报错。确认了lua lib路径是正确的。

2>UnLuaTestGameInstance.cpp.obj : error LNK2019: 无法解析的外部符号 lua_gettop,该符号在函数 "public: virtual int __cdecl UnLua::TExportedMemberFunction<class UUnLuaTestGameInstance,class FTreasureHunterRoleHandler *>::Invoke(struct lua_State *)" (?Invoke@?$TExportedMemberFunction@VUUnLuaTestGameInstance@@PEAVFTreasureHunterRoleHandler@@$$V@UnLua@@UEAAHPEAUlua_State@@@z) 中被引用
2>UnLuaTestGameInstance.cpp.obj : error LNK2019: 无法解析的外部符号 lua_settop,该符号在函数 "int __cdecl UnLua::Index(struct lua_State *)" (?Index@UnLua@@YAHPEAUlua_State@@@z) 中被引用
2>UnLuaTestGameInstance.cpp.obj : error LNK2019: 无法解析的外部符号 lua_pushvalue,该符号在函数 "int __cdecl UnLua::Index(struct lua_State *)" (?Index@UnLua@@YAHPEAUlua_State@@@z) 中被引用
2>UnLuaTestGameInstance.cpp.obj : error LNK2019: 无法解析的外部符号 lua_copy,该符号在函数 "int __cdecl UnLua::Index(struct lua_State *)" (?Index@UnLua@@YAHPEAUlua_State@@@z) 中被引用
2>UnLuaTestGameInstance.cpp.obj : error LNK2019: 无法解析的外部符号 lua_tolstring,该符号在函数 "int __cdecl UnLua::Index(struct lua_State *)" (?Index@UnLua@@YAHPEAUlua_State@@@z) 中被引用
2>UnLuaTestGameInstance.cpp.obj : error LNK2019: 无法解析的外部符号 lua_touserdata,该符号在函数 "int __cdecl UnLua::Index(struct lua_State *)" (?Index@UnLua@@YAHPEAUlua_State@@@z) 中被引用
2>UnLuaTestGameInstance.cpp.obj : error LNK2019: 无法解析的外部符号 lua_pushstring,该符号在函数 "public: virtual void __cdecl UnLua::FGlueFunction::Register(struct lua_State *)" (?Register@FGlueFunction@UnLua@@UEAAXPEAUlua_State@@@z) 中被引用
2>UnLuaTestGameInstance.cpp.obj : error LNK2019: 无法解析的外部符号 lua_pushcclosure,该符号在函数 "public: virtual void __cdecl UnLua::FGlueFunction::Register(struct lua_State *)" (?Register@FGlueFunction@UnLua@@UEAAXPEAUlua_State@@@z) 中被引用
2>UnLuaTestGameInstance.cpp.obj : error LNK2019: 无法解析的外部符号 lua_pushlightuserdata,该符号在函数 "public: virtual void __cdecl UnLua::TExportedMemberFunction<class UUnLuaTestGameInstance,class FTreasureHunterRoleHandler *>::Register(struct lua_State *)" (?Register@?$TExportedMemberFunction@VUUnLuaTestGameInstance@@PEAVFTreasureHunterRoleHandler@@$$V@UnLua@@UEAAXPEAUlua_State@@@z) 中被引用
2>UnLuaTestGameInstance.cpp.obj : error LNK2019: 无法解析的外部符号 lua_getfield,该符号在函数 "int __cdecl UnLua::Index(struct lua_State *)" (?Index@UnLua@@YAHPEAUlua_State@@@z) 中被引用
2>UnLuaTestGameInstance.cpp.obj : error LNK2019: 无法解析的外部符号 lua_rawget,该符号在函数 "int __cdecl UnLua::Index(struct lua_State *)" (?Index@UnLua@@YAHPEAUlua_State@@@z) 中被引用
2>UnLuaTestGameInstance.cpp.obj : error LNK2019: 无法解析的外部符号 lua_rawset,该符号在函数 "public: virtual void __cdecl UnLua::FGlueFunction::Register(struct lua_State *)" (?Register@FGlueFunction@UnLua@@UEAAXPEAUlua_State@@@z) 中被引用
2>F:\TH\TreasureHunterResearch\UnLuaTest\Binaries\Win64\UE4Editor-UnLuaTest.dll : fatal error LNK1120: 12 个无法解析的外部命令

OnRep函数没有被调用的问题

我在C++代码中声明了一个变量,并且实现了RPC调用从客户端设置服务端的变量,在设置成功的时候会调用变量的OnRep函数同步到客户端。
在lua中重写了OnRep,发现在蓝图中调用Rpc设置变量成功之后会调用到lua的OnRep函数
但是在Lua中调用Rpc设置变量,同样能成功改变服务端的变量,却不会调用lua到OnRep,请问这个是什么问题?

lua中如何创建DynamicDelegate?

在自定义的AssetManager子类中,提供了一些异步加载资源的接口。这些接口的参数一般是
(要加载的资源路径,回调Delegate)
对于暴露给蓝图的版本,使用的Delegate是通过宏"DECLARE_DYNAMIC_DELEGATE_XXX"来定义的,也就是DynamicDelegate。
以前使用另一种lua方案时,方案中定义了一个形如“LuaDelegate”的类型,并提供了一个给lua使用的接口“createDelegate”——传入参数是lua函数,返回值是LuaDelegate对象。这个LuaDelegate对象就可作为DynamicDelegate类型的参数来使用。
请问在UnLua下,如何实现类似的调用需要?

关于TArray导出给lua的接口

这些接口,跟使用TArray有不少差异,如:
1、接口对index的起始索引的理解,是从1开始的。
2、有些接口名与TArray原生接口名不一致,如“Num”->“Length”。
请问这样的设计是基于什么考虑呢?这样对原有代码的兼容性其实不太友好呢,使用时也要比较注意,需要把这个本在C++层是FScriptArray的对象、当做另一个LuaArray来用。

This is looking pretty good!

This is looking pretty good guys, love this already, just a tiny question, is there an ETA on the "UnLuaIntelliSense" IDE thingy, if if this plugin get intellisense working, WOW, it will be what was missing in UE4 for me and many others i'm sure.

lua的gc问题

在Actor对应的Lua的类成员加了个很大的table,删除该Actor的时候会调用以下接口
image
但是查看内存的时候却不会减少。

关于lua代码的打包

请问建议做法是不是:把“Content/Script”目录添加到“ProjectSettings -> Packaging -> Additional Non-Asset Directories to Package”,以确保lua代码被正常打包即可?
我们之前的做法是,自定义了一种BinPackage的uasset,内部将所有的lua代码(或其他非uasset文件),将其“文件名,文件内容”以TMap的形式序列化,这个Package参与资源打包。运行时是先加载这个Package,然后读取里面所需文件的内容。不过这样需要自定义加载lua代码的处理,好像UnLua不提供自定义的功能。
那我们是应该用开头说的那种方式来对lua代码做打包吗?

静态绑定的类的子类,动态绑定失败的问题

蓝图父类 -- Lua 父类 在蓝图中 静态绑定
蓝图子类 -- Lua 子类 未在蓝图中 静态绑定
尝试在 Lua 代码中 world spawn actor 动态绑定 Lua 子类到蓝图子类上
执行后,Lua 子类没有绑定上 ,子类的 field 没有办法获取

TArray breaking GC Clusters assumptions

编辑器下 UI运行下面脚本, 结束时会报错

require "UnLua"

local WBP_TestUI_C = Class()
if 1 > 0 then
	local Position = TArray(0)
	Position = nil
end
collectgarbage("collect")
return WBP_TestUI_C
LogGarbage: Warning: Object ScriptStruct /Script/UnLua.PropertyCollector (0x000002868e30fa00) from cluster ScriptStruct /Script/UnLua.PropertyCollector (0x000002868e30fa00 / 0x0000028682bb3b00) is referencing 0x000002868d056400 Package /Script/UnLua which is not part of root set or cluster.
LogGarbage: Warning: Object ScriptStruct /Script/UnLua.PropertyCollector (0x000002868e30fa00) from cluster ScriptStruct /Script/UnLua.PropertyCollector (0x000002868e30fa00 / 0x0000028682bb3b00) is referencing 0x000002868d056400 Package /Script/UnLua which is not part of root set or cluster.
Encountered 2 object(s) breaking GC Clusters assumptions. Please check log for details.

可以调试么?

看到ThirdParty里没有集成luasocket,也就没法使用现有的一些基于luasocket的调试插件了。请问现在如何调试呢?未来会集成luasocket么?

自建的enum蓝图(content中的枚举资源)如何在lua中load?

local ENotifyEvent = UE4.UClass.Load('/MultiplayerCombatEditor/Settings/ENotifyEvent.ENotifyEvent')

路径:UserDefinedEnum'/MultiplayerCombatEditor/Settings/ENotifyEvent.ENotifyEvent'
得到错误:
LogUnLua: Warning: RegisterClass: Failed to register class /MultiplayerCombatEditor/Settings/ENotifyEvent.ENotifyEvent_C!

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.