精华内容
下载资源
问答
  • [原创]UnLua Emmylua UE4开发环境搭建 https://www.cnblogs.com/sevenyuan/p/11990776.html 前言  公司开发的第二个虚幻4项目已经上线了,慢慢趋于稳定。回想起开荒的日子,历历在目。从引擎脚本的选择,各工具...

    [原创]UnLua Emmylua UE4开发环境搭建

    https://www.cnblogs.com/sevenyuan/p/11990776.html

    前言

      公司开发的第二个虚幻4项目已经上线了,慢慢趋于稳定。回想起开荒的日子,历历在目。从引擎脚本的选择,各工具(导表,协议生成...)的重构、开发, 引擎扩展(多骨骼支持,Notify扩展,技能编辑器...),UMG蓝图的设计、适配,战斗Demo的创建,开发流程的接轨,功能堆砌,人员一波波的更迭...

      回到正题,18年中,立项的时候,UE4的脚本语言都在实验期,没有成熟的,Python、JS V8、Lua等等开源的脚本也都测试过,最终选择了Lua,主要是基于:

    1、Lua语言在游戏业的广泛引用性。确认不远的将来会有更稳定、程序的框架

    2、UE3老项目战斗Lua的继承

      最终框架使用了unreal.lua, https://github.com/asqbtcupid/unreal.lua, 感谢大大。最近也一直在关注腾讯游戏的lua开源框架,slua和UnLua,现在有时间了,所以来研究下,为新项目最准备。

    一、相关源码获取

    1,UnLua: https://github.com/Tencent/UnLua

    2,Emmylua: https://github.com/EmmyLua/IntelliJ-EmmyLua

    3,LuaSocket: https://github.com/diegonehab/luasocket

    4,Lua5.3: https://www.lua.org/ftp/

    5,MobDebug: https://github.com/pkulchenko/MobDebug/tree/master/src

    二、LuaSocket搭建

    1、编译Lua5.3.4

      Lua源码目录创建install.bat

    复制代码

    REM open `Developer Command Prompt For Visual Studio`
    REM install.bat 5.3.4
    
    %~d0
    cl /MD /O2 /c /DLUA_BUILD_AS_DLL *.c
    ren lua.obj lua.o
    ren luac.obj luac.o
    link /DLL /IMPLIB:lua53.lib /OUT:lua53.dll *.obj
    link /OUT:lua.exe lua.o lua53.lib
    lib /OUT:lua53-static.lib *.obj
    link /OUT:luac.exe luac.o lua53-static.lib
    
    del *.obj
    del *.o
    
    REM bin
    if exist ..\bin (
        rd /s /q ..\bin
    )
    mkdir ..\bin
    move *.exp ..\bin
    move *.dll ..\bin
    move *.exe ..\bin
    
    REM lib
    if exist ..\lib (
        rd /s /q ..\lib
    )
    mkdir ..\lib
    move *.lib ..\lib
    
    REM include
    if exist ..\include (
        rd /s /q ..\include
    )
    mkdir ..\include
    copy lauxlib.h ..\include
    copy lua.h ..\include
    copy lua.hpp ..\include
    copy luaconf.h ..\include
    copy lualib.h ..\include
    
    PAUSE

    复制代码

      启动x64 vs命令行,执行install.bat

      

       bin目录加入Path

    2、编译LuaSocket

      a、打开sln,选择x64,指定Lua的include和lib目录,编译生成core.dll

      b、复制socket文件夹(带着core.dll)到lua bin目录,这个文件夹后续也要复制在游戏引擎目录

      c、复制src中的lua文件到lua bin目录

    3、测试

      

    三、Emmylua搭建

    1、安装IntelliJ IDEA

    2、编译Emmylua

      Emmylua源码目录下: gradlew buildAll

    3、IDEA 安装Emmylua

      

      

    4、设置IDEA配置

      a、取消代码拼写错误检测

      

     5、启动debug调试

      新建运行配置

      

      运行

          

    四、引擎、UnLua配置

    1、UnLua源码置于Plugins下

    2、复制socket文件夹(带着core.dll)复制到 Engine\Engine\Binaries\Win64

    3、Lua脚本Content\Script目录下,创建debugger文件夹,将LuaSocket源码下的lua复制进来

    4、MobDebug.lua也复制进来,修改Socket路径

     5、UnLua.lua中require MobDebug

     

     

    五、OK,IDEA加上断点调试

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • 最近抽空把 Bluelua 计划的最后一部分功能内容做完了,就是在 lua 中重载 UE4 中的网络事件,这样就可以直接在 lua 中重写网络相关的逻辑了。还有就是将之前重载纯蓝图函数和事件几个崩溃修复了。网络相关的重写示例...

    06d64bcdb2a83646f41c94092b31dab3.png

    最近抽空把 Bluelua 计划的最后一部分功能内容做完了,就是在 lua 中重载 UE4 中的网络事件,这样就可以直接在 lua 中重写网络相关的逻辑了。还有就是将之前重载纯蓝图函数和事件几个崩溃修复了。网络相关的重写示例在 BlueluaDemo 的 NetTest 文件夹中

    UE4 中网络事件分两种,一种是 C++ 中的网络事件,就是在 UFUNCTION 中带上 Server/NetMulticast/Client 关键字,另一种是在蓝图中,创建一个 Custom Event,然后在这个事件的复制属性中选择 Run On Server/Multicast/Run on owning Client,如图

    f11d97f65e05e20b9173f3f64802ff95.png

    这两种是互相独立的,也就是 C++ 中的 Server/NetMulticast/Client 函数是无法在蓝图中进行重写,所以如果有这样的需求就需要在 C++ 的 Server/NetMulticast/Client 函数中去调用其它 BlueprintNativeEvent/BlueprintImplementable 函数,将这个事件抛到蓝图中,略显麻烦。Bluelua 中就不用这么麻烦了,现在可以直接在 lua 中分别重写这两类网络事件

    重写 C++ 网络事件

    首先在 ANetCharacter 的 C++ 类中定义三个函数,一个可复制属性和属性的修改通知函数

    UFUNCTION(Unreliable, Server, WithValidation)
    void TestNativeServerFunction();
    
    UFUNCTION(Unreliable, NetMulticast)
    void TestNativeNetMulticastFunction();
    
    UFUNCTION(Unreliable, Client)
    void TestNativeClientFunction();
    
    UPROPERTY(ReplicatedUsing=OnRep_Counter)
    int32 Counter;
    
    UFUNCTION(BlueprintNativeEvent)
    void OnRep_Counter();
    

    实现这几个函数

    void ANetCharacter::TestNativeClientFunction_Implementation()
    {
        UE_LOG(LogTemp, Display, TEXT("%sTestNativeClientFunction get called"), *GetPrefix(this));
    }
    
    void ANetCharacter::TestNativeNetMulticastFunction_Implementation()
    {
        UE_LOG(LogTemp, Display, TEXT("%sTestNativeNetMulticastFunction get called"), *GetPrefix(this));
    }
    
    void ANetCharacter::TestNativeServerFunction_Implementation()
    {
        UE_LOG(LogTemp, Display, TEXT("%sTestNativeServerFunction get called"), *GetPrefix(this));
    
        TestNativeNetMulticastFunction(); // will run on local and remote
        TestNativeClientFunction(); // will run on remote
    }
    
    bool ANetCharacter::TestNativeServerFunction_Validate()
    {
        return true;
    }
    
    void ANetCharacter::OnRep_Counter_Implementation()
    {
        UE_LOG(LogTemp, Display, TEXT("%sNative OnRep_Counter: %d"), *GetPrefix(this), Counter);
    }
    
    // 在服务器的 Tick 中每隔 1 秒递增 Counter
    void ANetCharacter::Tick(float DeltaTime)
    {
        Super::Tick(DeltaTime);
    
        if (Role == ROLE_Authority)
        {
            static float UpdateTime = 0;
            UpdateTime += DeltaTime;
    
            if (UpdateTime > 1.f)
            {
                ++Counter;
                UpdateTime = 0.f;
            }
        }
    }
    

    在 ANetCharacter 的子类 lua 中绑定一个 P 键输入事件,按下 P 键后从客户端调用 TestNativeServerFunction/TestNativeNetMulticastFunction/TestNativeClientFunction 几个函数进行测试

    function m:OnSetupPlayerInputComponent()
        local BlueluaLibrary = LoadClass('BlueluaLibrary')
    
        local EInputEvent = {
            IE_Pressed = 0,
            IE_Released = 1,
            IE_Repeat = 2,
            IE_DoubleClick = 3,
            IE_Axis = 4,
            IE_MAX = 5,
        }
    
        -- Press P key to start ent test
        BlueluaLibrary:BindKeyAction(Super, { Key = { KeyName = 'P' } }, EInputEvent.IE_Pressed, true, false, CreateFunctionDelegate(Super, self, self.OnKeyPressed))
    end
    
    function m:OnKeyPressed()
        -- test net event in c++
        Super:TestNativeClientFunction() -- will run on current client
        Super:TestNativeNetMulticastFunction() -- will run on current client
        Super:TestNativeServerFunction() -- will run on remote server
    end

    在测试前需要在编辑器中勾选 Run Dedicated Server,如图

    6262191676335d704bd1c947d530b2fa.png

    在没有重写的情况下,调用的是 C++ 中的实现,输出的 log 为

    LogTemp: Display: Client 1: Native OnRep_Counter: 1
    LogTemp: Display: Client 1: Native OnRep_Counter: 2
    LogTemp: Display: Client 1: Native OnRep_Counter: 3
    LogTemp: Display: Client 1: Native OnRep_Counter: 4
    LogTemp: Display: Client 1: Native OnRep_Counter: 5
    LogTemp: Display: Client 1: Native OnRep_Counter: 6
    LogTemp: Display: Client 1: Native OnRep_Counter: 7
    LogTemp: Display: Client 1: TestNativeClientFunction get called
    LogTemp: Display: Client 1: TestNativeNetMulticastFunction get called
    LogTemp: Display: Server: TestNativeServerFunction get called
    LogTemp: Display: Server: TestNativeNetMulticastFunction get called
    LogTemp: Display: Client 1: TestNativeClientFunction get called
    LogTemp: Display: Client 1: TestNativeNetMulticastFunction get called
    LogTemp: Display: Client 1: Native OnRep_Counter: 8
    LogTemp: Display: Client 1: Native OnRep_Counter: 9
    LogTemp: Display: Client 1: Native OnRep_Counter: 10

    从 log 中可以看出,当客户端调用 Client/NetMulticast 函数时,是在本地执行的,当调用 Server 函数时,会在服务器执行。服务器上调用 NetMulticast 函数会在服务器本地和客户端上执行,调用 Client 函数会在对应的主控(Autonomous)客户端上执行

    现在在 lua 中重写这些函数的实现,方法就是直接声明一个同名的函数,如下

    -- override Server replicated event in c++
    function m:TestNativeClientFunction()
        print('TestNativeClientFunction get called')
    end
    
    -- override NetMulticast replicated event in c++
    function m:TestNativeNetMulticastFunction()
        print('TestNativeNetMulticastFunction get called')
    end
    
    -- override Client replicated event in c++
    function m:TestNativeServerFunction()
        print('TestNativeServerFunction get called')
        Super:TestNativeNetMulticastFunction() -- will run on local server and remote client
        Super:TestNativeClientFunction() -- will run on remote client
    end
    
    -- override property replicated event in c++
    function m:OnRep_Counter()
        print('OnRep_Counter:', Super.Counter)
    end

    按 P 键进行测试,得到得 log 输出为

    LogBluelua: Display: Client 1: Lua log: OnRep_Counter:   1
    LogBluelua: Display: Client 1: Lua log: OnRep_Counter:   2
    LogBluelua: Display: Client 1: Lua log: OnRep_Counter:   3
    LogBluelua: Display: Client 1: Lua log: OnRep_Counter:   4
    LogBluelua: Display: Client 1: Lua log: OnRep_Counter:   5
    LogBluelua: Display: Client 1: Lua log: TestNativeClientFunction get called
    LogBluelua: Display: Client 1: Lua log: TestNativeNetMulticastFunction get called
    LogBluelua: Display: Server: Lua log: TestNativeServerFunction get called
    LogBluelua: Display: Server: Lua log: TestNativeNetMulticastFunction get called
    LogBluelua: Display: Client 1: Lua log: TestNativeClientFunction get called
    LogBluelua: Display: Client 1: Lua log: TestNativeNetMulticastFunction get called
    LogBluelua: Display: Client 1: Lua log: OnRep_Counter:   6
    LogBluelua: Display: Client 1: Lua log: OnRep_Counter:   7
    LogBluelua: Display: Client 1: Lua log: OnRep_Counter:   8
    LogBluelua: Display: Client 1: Lua log: OnRep_Counter:   9
    LogBluelua: Display: Client 1: Lua log: OnRep_Counter:   10

    从 log 中可以看出,所有的网络事件都正确调到 lua 中重写的实现中了,并且执行一致

    重写蓝图网络事件

    同样在 NetCharacter 蓝图中创建三个 Custom Event,并分别选择 Run On Server/Multicast/Run on owning Client。创建一个 BPCounter 属性,选择 RepNotify,之后蓝图中会自动创建一个函数 OnRep_BPCounter,在这些函数中分别打印一句 log,如图

    d93b70b75595fbe73d485c2912d37888.png

    2454da16408d65e2c07ab68bc8c98ee0.png

    同样在 lua 的按键事件中调用这三个网络事件

    function m:OnKeyPressed()
        -- test net event in c++
        --Super:TestNativeClientFunction() -- will run on current client
        --Super:TestNativeNetMulticastFunction() -- will run on current client
        --Super:TestNativeServerFunction() -- will run on remote server
    
        -- test net event in blueprint
        Super:TestBPClientFunction() -- will run on current client
        Super:TestBPNetMulticastFunction() -- will run on current client
        Super:TestBPServerFunction() -- will run on remote server
    end

    在 lua 没有重载的情况下的 log 输出为

    LogBlueprintUserMessages: [NetCharacter_C_0] Server: BP OnRep_BPCounter: 1
    LogBlueprintUserMessages: [NetCharacter_C_0] Client 1: BP OnRep_BPCounter: 1
    LogBlueprintUserMessages: [NetCharacter_C_0] Server: BP OnRep_BPCounter: 2
    LogBlueprintUserMessages: [NetCharacter_C_0] Client 1: BP OnRep_BPCounter: 2
    LogBlueprintUserMessages: [NetCharacter_C_0] Server: BP OnRep_BPCounter: 3
    LogBlueprintUserMessages: [NetCharacter_C_0] Client 1: BP OnRep_BPCounter: 3
    LogBlueprintUserMessages: [NetCharacter_C_0] Server: BP OnRep_BPCounter: 4
    LogBlueprintUserMessages: [NetCharacter_C_0] Client 1: BP OnRep_BPCounter: 4
    LogBlueprintUserMessages: [NetCharacter_C_0] Server: BP OnRep_BPCounter: 5
    LogBlueprintUserMessages: [NetCharacter_C_0] Client 1: BP OnRep_BPCounter: 5
    LogBlueprintUserMessages: [NetCharacter_C_0] Client 1: TestBPClientFunction get called
    LogBlueprintUserMessages: [NetCharacter_C_0] Client 1: TestBPNetMulticastFunction get called
    LogBlueprintUserMessages: [NetCharacter_C_0] Server: TestBPServerFunction get called
    LogBlueprintUserMessages: [NetCharacter_C_0] Server: TestBPNetMulticastFunction get called
    LogBlueprintUserMessages: [NetCharacter_C_0] Client 1: TestBPClientFunction get called
    LogBlueprintUserMessages: [NetCharacter_C_0] Client 1: TestBPNetMulticastFunction get called
    LogBlueprintUserMessages: [NetCharacter_C_0] Server: BP OnRep_BPCounter: 6
    LogBlueprintUserMessages: [NetCharacter_C_0] Client 1: BP OnRep_BPCounter: 6

    从 log 中可以看出,蓝图的 Run On Server/Multicast/Run on owning Client 事件和 C++ 的 Server/NetMulticast/Client 函数的执行规则是一致的,唯一的区别是可复制属性的 RepNotify 和 ReplicatedUsing,RepNotify 会在服务器本地也调用 OnRep_BPCounter 函数,而 ReplicatedUsing 不会,这一点需要注意

    现在在 lua 中重写这些事件,同样只要声明一个同名的函数就行了,如下

    -- override Server replicated event in blueprint
    function m:TestBPClientFunction()
        print('TestBPClientFunction get called')
    end
    
    -- override NetMulticast replicated event in blueprint
    function m:TestBPNetMulticastFunction()
        print('TestBPNetMulticastFunction get called')
    end
    
    -- override Client replicated event in blueprint
    function m:TestBPServerFunction()
        print('TestBPServerFunction get called')
        Super:TestBPNetMulticastFunction() -- will run on local server and remote client
        Super:TestBPClientFunction() -- will run on remote client
    end
    
    -- override property replicated event in blueprint
    function m:OnRep_BPCounter()
        print('OnRep_BPCounter:', Super.BPCounter)
    end

    重新按 P 键进行测试,得到得 log 输出为

    LogBluelua: Display: Server: Lua log: OnRep_BPCounter:   1
    LogBluelua: Display: Client 1: Lua log: OnRep_BPCounter: 1
    LogBluelua: Display: Server: Lua log: OnRep_BPCounter:   2
    LogBluelua: Display: Client 1: Lua log: OnRep_BPCounter: 2
    LogBluelua: Display: Server: Lua log: OnRep_BPCounter:   3
    LogBluelua: Display: Client 1: Lua log: OnRep_BPCounter: 3
    LogBluelua: Display: Server: Lua log: OnRep_BPCounter:   4
    LogBluelua: Display: Client 1: Lua log: OnRep_BPCounter: 4
    LogBluelua: Display: Server: Lua log: OnRep_BPCounter:   5
    LogBluelua: Display: Client 1: Lua log: OnRep_BPCounter: 5
    LogBluelua: Display: Client 1: Lua log: TestBPClientFunction get called
    LogBluelua: Display: Client 1: Lua log: TestBPNetMulticastFunction get called
    LogBluelua: Display: Server: Lua log: TestBPServerFunction get called
    LogBluelua: Display: Server: Lua log: TestBPNetMulticastFunction get called
    LogBluelua: Display: Client 1: Lua log: TestBPClientFunction get called
    LogBluelua: Display: Client 1: Lua log: TestBPNetMulticastFunction get called

    可以看出,蓝图的网络事件也调到了 lua 中了,并且执行规则一致

    展开全文
  • UE4&lua

    千次阅读 2019-04-23 19:44:53
    UE4层面 Entity(c++)---------->ACharacter/APawn M V&C lua层面 Entity(lua)----------->Entity Controller------------>Actor M ...

    UE4层面

    Entity(c++)---------->ACharacter/APawn

        M                               V&C

     

    lua层面

    Entity(lua)----------->Entity Controller------------>Actor

        M                               C                                   V

     

    UI

    Mode(lua)------------>UI Controller------------>UMG

        M                              C                                  V

     

    通过单例来组织M&C,比如收到Entity消息后创建对应的Controller;大部分UI都是全局唯一的,所以UI的单例可以跟Model放一起

    展开全文
  • 针对UE4的游戏开发,UnLua以及sluaunreal都是采用lua编写逻辑的解决方案。 作为一个没有怎么接触过游戏开发技术栈的小白,本文主要上手UnLua的使用。 从github上,我们可以clone下来示例的project,编译后即可运行...

    大型的游戏项目包含许多错综复杂的业务逻辑,针对UE4游戏而言,如果纯粹采用C++编写的话,一方面会增加大量的劳动成本,影响效率,另一方面难以解决游戏热更的问题。lua作为胶水语言,能够与C/C++/C#等语言互通,简化业务逻辑编写,并且支持热更。针对UE4的游戏开发,UnLua以及sluaunreal都是采用lua编写逻辑的解决方案。

    作为一个没有怎么接触过游戏开发技术栈的小白,本文主要上手UnLua的使用。

    从github上,我们可以clone下来示例的project,编译后即可运行。整个demo的逻辑是在一个空间中自动生成AI敌人,玩家需要射击AI以保全自身,如果碰到AI即游戏失败。整个游戏的逻辑基本在Content/Script下的lua文件中,对于开发者而言,只需要创建蓝图——导出Lua脚本——编写逻辑,就能够完成需求。

    编辑器采用VSCode + Emmylua + C/C++的搭配即可,如果有debug需求可以VS搭配Code。要导出UnLua解析的UE4的lua接口,在UnLuaIntelliSense.Build.cs中修改至ENABLE_INTELLISENSE=1,然后重新构建,即可导出lua定义到Plugins/UnLua/Intermediate/IntelliSense,之后调整workspace的配置即可:

    {
        "settings": {
            "emmylua.source.roots": ["./Plugins/UnLua/Intermediate/IntelliSense"]
        }
    }
    

    我们可以对示例教程中的子弹进行改装。我们可以增加一个CustomProjectile,其蓝图实例为BP_CustomProjectile,并实现UnLua的接口。我们可以自定义其Static Mesh的形状以及材质。之后,通过蓝图窗口的lua template可以在项目中导出蓝图接口BP_CustomProjectile_C.lua,而不需要自己编写蓝图逻辑。然后在蓝图的Interfaces中选中Get Module Name,返回BP_CustomProjectile_C所在位置即可。

    首先对于CustomProjectile,可以自定义一个ProjectileInitializer.lua

    require "UnLua"
    
    _G.ProjectileInitializer = ProjectileInitializer or {}
    
    function ProjectileInitializer:GetRandomColor()
        local R = UE4.UKismetMathLibrary.RandomFloat()
        local G = UE4.UKismetMathLibrary.RandomFloat()
        local B = UE4.UKismetMathLibrary.RandomFloat()
        return UE4.FLinearColor(R, G, B, 1.0)
    end
    
    function ProjectileInitializer:GetInitializer()
        local color = self:GetRandomColor()
        return {
            Color = color,
            Ratio = (color.R + color.G + color.B) / 3,
        }
    end
    
    return ProjectileInitializer
    

    之后可以编写BP_CustomProjectile_C的代码,和BP_DefaultProjectile_C基本相同:

    require "UnLua"
    
    local BP_CustomProjectile_C = Class("Weapon.BP_ProjectileBase_C")
    
    function BP_CustomProjectile_C:Initialize(Initializer)
        self.BaseColor = Initializer.Color
        self.DamageRatio = Initializer.Ratio or 0.1
    end
    
    function BP_CustomProjectile_C:UserConstructionScript()
        self.Super.UserConstructionScript(self)
        self.Damage = self.Damage * self.DamageRatio
        print("Projectile Damage: " .. tostring(self.Damage));
        self.DamageType = UE4.UClass.Load("/Game/Core/Blueprints/BP_DamageType.BP_DamageType_C")
    end
    
    function BP_CustomProjectile_C:ReceiveBeginPlay()
        self.Super.ReceiveBeginPlay(self)
        local MID = self.StaticMesh:CreateDynamicMaterialInstance(0)
        if MID then
            MID:SetVectorParameterValue("BaseColor", self.BaseColor)
        end
    end
    
    return BP_CustomProjectile_C
    

    这样即可根据颜色深度来判断projectile的伤害,实现伤害随机的效果。

    对于UMG而言,也可以在UMG蓝图中先设置各个控件为变量,然后调用各个变量的反射接口以设置控件属性。

    require "UnLua"
    
    local UMG_Main_C = Class()
    
    UMG_Main_C.ExitBtnText = "Hello World"
    
    function UMG_Main_C:Construct()
        if not self.ExitButtonTextBlock then
            print("exit button text is nil!")
        else
            print("bind exit button text...")
            self.ExitButtonTextBlock:SetText(UMG_Main_C.ExitBtnText)
        end
        self.ExitButton.OnClicked:Add(self, UMG_Main_C.OnClicked_ExitButton)	
        --self.ExitButton.OnClicked:Add(self, function(Widget) UE4.UKismetSystemLibrary.ExecuteConsoleCommand(Widget, "exit") end )
    end
    
    function UMG_Main_C:OnClicked_ExitButton()
        UE4.UKismetSystemLibrary.ExecuteConsoleCommand(self, "exit")
    end
    
    return UMG_Main_C
    
    

    从一个UE4初学者角度而言,UnLua的熟悉会有一定壁垒,需要建立在对UE4的C++变成较为熟悉的基础上,才能熟练应用。UnLua/sluaunreal相对于蓝图解决了一个最大的问题是逻辑的可维护性以及可热更的能力,以便支持业务逻辑的快速迭代。lua本身是没有强制静态类型的,虽然最近已有了teal的产生,但整个生态还没有完全兴起。因此如果使用lua作为胶水语言,不在lua层先做一两层业务抽象再写逻辑的话,还不如直接写C++来的稳定。因此,针对初学者或者是独立开发者,用C++加上蓝图是更加妥当的选择。

    That’s it,游戏开发是一门很独特的技术栈,还有许多值得探索的东西。自己虽然没有从事游戏开发工作,但说不定有一天,能够自己写一个游戏呢。

    展开全文
  • 适用于UE4的Bluelua 用Lua替换蓝图,使其与蓝图保持一致,然后无缝切换。 通过反射访问UObject的属性和方法,而无需生成胶合代码,更加简单,易于扩展。 现在支持Android,iOS,Mac,Windows,Linux。 二手开源库 ...
  • UE4使用unlua、EmmyLua 和IDEA进行lua开发

    千次阅读 2020-06-01 11:22:31
    UE4使用unlua、EmmyLua 和IDEA开发 一:相关软件/插件的下载安装 1、UnLua :https://github.com/Tencent/UnLua 2、IDEA:自搜 二:IDEA的安装破解以及安装EmmyLua插件 自己解决 三: UnLua导出 智能提示 1、修改...
  • 本片文章搬运自我自己的博客:原文链接: UE4热更新:基于UnLua的Lua编程指南 作者: ZhaLiPengUE使用的是C++这种编译型语言,在编译之后就成了二进制,只有通过玩家重新安装才能打到更新游戏的目的。但是对于游戏...
  • 简单就是力量,通过运行时反射调用UE4功能。 注意:将-FastLua添加到Visual Studio命令行,然后按F5,将生成静态绑定代码 关于 FastLuaHelper.h中的一些全局函数; 例: GameInstance = Unreal.LuaGetGameInstance...
  • Lua使UE4完美,哈哈哈~~ 这是什么? 这是用于将UE4绑定到lua的框架。 平台和版本 Windows,Mac,Android,IOS UE4:4.20〜4.24 Lua:5.3 如何建造 对于此存储库: Right click CatchMe.uproject then Generate ...
  •   luaL_loadstring 之后调用 lua_pcall 会出错。   luaL_dostring 的定义如下: #define luaL_dostring(L, s) \ (luaL_loadstring(L, s) || lua_pcall(L, 0, LUA_MULTRET, 0)) 结论   用 luaL_dostring。。
  • UE4热更新:基于UnLua的Lua编程指南 https://imzlp.me/posts/36659/ https://imzlp.me/posts/36659/ Z's Blog 首页 归档 分类 标签 笔记 微言 资源 简历 关于 待办事项 站点日志 搜索 UE4热更新:...
  • UObject-LuaInstance布局思维导图:在Unlua框架下, 每个UObject在创建的时候都会尝试绑定一个lua脚本.UObject-LuaInstance布局调用堆栈UObject绑定Lua基础在创建UObject的时候会对所有继承了FUObjectCreateListener的...
  • <div><p>我修改了ue4开多个窗口代码,创建两个独立的窗口,创建了两个不同的World、GameInstance、GameMode等,lua init在GameInstance中,两个GameMode的tick调用lua update,每次...
  • 本片文章搬运自我自己的博客:原文链接: UE4热更新:基于UnLua的Lua编程指南 作者: ZhaLiPengUE使用的是C++这种编译型语言,在编译之后就成了二进制,只有通过玩家重新安装才能打到更新游戏的目的。但是对于游戏...
  • <div><p>在编辑器中创建了BlueprintFunctionLibrary,在lua中可以以OBJ的方式加载进去,但是没法调用里边的方法</p><p>该提问来源于开源项目:Tencent/sluaunreal</p></div>
  • Lua和Blueprint目的都是Give behavior the flexibility of data by encoding it as instructions for a virtual machine.(参见文档Robert strom的《Game Programming patterns》) 现在很多UE4和U3D项目都会单独...
  • 继易语言之后,我们又拿了...C#使用.NET Core 3.1.202, 仅使用.NET Core标准库Lua使用5.3.5(虽然5.4能下载到了,但是懒得去弄,而且新特性对这里没影响),Blueprint使用Unreal Engine 4.25, 默认新建工程的状态,...
  • 继易语言之后,我们又拿了...C#使用.NET Core 3.1.202, 仅使用.NET Core标准库Lua使用5.3.5(虽然5.4能下载到了,但是懒得去弄,而且新特性对这里没影响),Blueprint使用Unreal Engine 4.25, 默认新建工程的状态,...
  • 银藤UE4Lua 简报: NDC2019(한국어):
  • UnLua是针对UE4的功能丰富且经过高度优化的脚本解决方案。 开发人员可以使用Lua来开发游戏逻辑,并且可以使用Lua的热加载功能更快地迭代游戏逻辑。 本文档将介绍UnLua的主要功能和基本编程模式。 Lua&UE 绑定 ...
  • 前言今天学习了一下使用UE4引擎导出类定义的流程,目的是使用将C++代码导出到Lua文件中,方便C++和Lua代码相互调用,跟踪了一下代码发现,产生Lua可用的C++函数的启动代码实际上在UnrealHeaderTool工具中,原来和...
  • luaPanda安装搜索luapanda 点击下载安装或者打开下面的地址,点击会提示打开vscode进行安装luaPanda下载地址:...ssr=false#review-details在gethbub中下载LuaPanda.lua文件,将LuaPan...

空空如也

空空如也

1 2 3 4 5
收藏数 100
精华内容 40
关键字:

luaue4