unreal 添加三方库_unreal 添加按键事件 - CSDN
  • 摘要:写这个文章主要是被UE官方的...在开发中经常遇到的问题就是加入某第三方的支持,这样的第三方往往属于无源码,而且可能是静态lib或者是动态dll甚至两者皆有。UE4的编译管理用的是自己的UBT(unreal bina...

    摘要:
    写这个文章主要是被UE官方的wiki和answerhub误导了很久,这本来是一个很常见和基本的问题,但是无论是官方的wiki或者是论坛上的提问都十分散乱并且充斥各种错误,因此记录下这个在开发中时常遇到的问题。

    在开发中经常遇到的问题就是加入某第三方库的支持,这样的第三方库往往属于无源码,而且可能是静态lib或者是动态dll甚至两者皆有。UE4的编译管理用的是自己的UBT(unreal binary tool)因此链接第三方库的工作主要是编写UBT脚本。

    1.以插件方式集成.
    基本上这个是最推荐的集成第三方库的方式,因为能够很好的隔离你的代码和第三方代码的影响,在UE4的源码里也可以看到很多第三方库都是这么集成的,比如paper2D,leapmotion等等。在UE4中新建插件的方式略去不表,当你新建完你的插件之后,你会在插件的代码目录下看到一个

    xxx.build.cs
    

    接下来要做的就是修改这个脚本:

    得到当前路径

    private string ModulePath
    {
       get { return ModuleDirectory; }
    }

    关于第三方库放的位置,一般是在plugin的源码同级文件夹下建一个ThirdParty文件夹,里面放上include lib等等。

    得到ThirdParty文件夹的路径

    private string ThirdPartyPath
    {
            get { return Path.GetFullPath(Path.Combine(ModulePath,"../../ThirdParty/")); }
    }
    

    为工程添加include第三方库的头文件路径
    在模快的构造函数里加上:

    PublicIncludePaths.AddRange(
            new string[] { 
                 Path.Combine(ThirdPartyPath, "xxx", "Include"),
            }
            );
                
        
    PrivateIncludePaths.AddRange(
            new string[] {
                Path.Combine(ThirdPartyPath, "Foxit", "Include"),
            }
            );
    

    链接第三方库的Lib

    接下来需要在编译工程时加入第三方静态库的链接,静态链接属于工程在编译期间做的事情,因此这块需要通过cs脚本完成,而dll动态链接库的加载是运行期的事,因此需要在cpp文件中执行。

    我们新建一个叫LoadxxxLib的函数,并把它放在模块的构造函数结尾执行:

    public bool LoadxxxLib(TargetInfo Target)
        {
            bool isLibararySupported = false;
            if ((Target.Platform == UnrealTargetPlatform.Win64) || (Target.Platform == UnrealTargetPlatform.Win32))
            {
                isLibararySupported = true;
                string PlatformString = (Target.Platform == UnrealTargetPlatform.Win64) ? "Win64" : "Win32";
                PublicAdditionalLibraries.Add(Path.Combine(LibraryPath, PlatformString + ".lib"));
                PublicDelayLoadDLLs.Add(PlatformString + ".dll");
                RuntimeDependencies.Add(new RuntimeDependency(LibraryPath + PlatformString + ".dll"));
            }
            return isLibararySupported;
        }
    

    这样就可以保证在编译期链接上我们的第三方lib。

    链接动态DLL

    这个工作需要在plugin的运行期完成,在插件的source文件下找到一个与插件名字同名的cpp文件打开。会看到一个StartupModule的函数,我们需要在这里得到dll文件的handle。

    在StartupModule中添加下面的代码:

    void FXXXModule::StartupModule()
    {
    #if PLATFORM_64BITS
        FString platform = TEXT("win64.dll");
    #else
        FString platform = TEXT("win32.dll");
    #endif
        FString path = IPluginManager::Get().FindPlugin("XXX")->GetBaseDir(); 
        FString dllpath = path + "/ThirdParty/XXX/Lib/" + platform;
        PdfDllHandle = FPlatformProcess::GetDllHandle(*dllpath);
        if (!PdfDllHandle)
        {
            UE_LOG(LogTemp, Warning, TEXT("Failed to load PDF library."));
        }
    }
    

    这里我们用的是PluginManager找到的插件所在的路径,值得注意的是使用这个函数时需要在build.cs
    中加入

    PrivateDependencyModuleNames.AddRange(
                new string[]
                {
                    ...
                    "Projects",
                }
                );
                

    否则工程会链接出错。

    展开全文
  • 源码下载 https://github.com/EpicGames/UnrealEngine.git ..../Setup.sh (下载三方库,比较耗时) //下载完成后 ./GenerateProjectFiles.sh (生成工程文件) //执行完成后 目录下会有cmakelist 和 MakeFile 文件 ..

    源码下载

    git clone https://github.com/EpicGames/UnrealEngine.git  (官方地址)

    觉得clone慢的可以用

    git clone https://github.com.cnpjms.org/EpicGames/UnrealEngine.git(镜像地址)

    如果没有授权帐号,或者git出现rpc等奇奇怪怪的问题 也可以用下面为这边分享的神秘地址

    链接: https://pan.baidu.com/s/1ic5PU42JH2nhPUB76BXgmw 提取码: ez2n

    编译

    cd UnrealEngine
    ./Setup.sh (下载三方库,比较耗时)
    //下载完成后
    ./GenerateProjectFiles.sh (生成工程文件)
    //执行完成后 目录下会有cmakelist 和 MakeFile 文件
    //根据makefile里面的target 选择自己需要的内容进行编译 如下
    make ShaderCompileWorker UnrealLightmass UnrealPak CrashReportClient UE4Editor 
    

    PS:有如下报错

    ERROR: Cannot use an old toolchain (missing ToolchainVersion.txt file, assuming version earlier than v11)

    请参考

    echo "v15_clang-8.0.1-centos7" > Engine/Extras/ThirdPartyNotUE/SDKs/HostLinux/Linux_x64/v15_clang-8.0.1-centos7/ToolchainVersion.txt

    v15_clang-8.0.1-centos7 这个 根据你当前报错的名称进行修改 对应好就行

    然后重新make   等待编译结束

    编译完成后

    cd Engine/Binaries/Linux
    ./UE4Editor

    如果运行失败,提示 vulkan相关的错误,可能是显卡驱动 和vulkan库没有安装好

    先查询支持nvidia驱动

    sudo add-apt-repository ppa:graphics-drivers/ppa      //添加ppa库到系统中
    sudo apt update         //  更新
     
    sudo ubuntu-drivers devices // 显示可以安装的nvidia驱动
    

    根据需求 或者根据推荐的(recommended)安装

    sudo apt install nvidia-430

    等待安装完毕

    再安装vulkan相关的内容

    sudo apt install libvulkan1 mesa-vulkan-drivers vulkan-utils

    等待安装完毕运行

    vulkaninfo

    如果控制台没有出现错误信息,就说明vulkan安装成功了再运行 UE4Editor 应该能成功执行

    PS:由于本人用的nvidia显卡, amd显卡查看vulkan相关安装文章

     

    展开全文
  • 非常感谢我们的天才设计师“李一奇”同学为我的这篇文章设计的图标!前几天发了一条朋友圈,跟大家分享了一下近来一段时间一直在做的一项比较“大胆”的技术尝试。之所以用“大胆”来形容,是因为我们目前是一个创业...

    这里写图片描述
    非常感谢我们的天才设计师“李一奇”同学为我的这篇文章设计的图标!

    前几天发了一条朋友圈,跟大家分享了一下近来一段时间一直在做的一项比较“大胆”的技术尝试。之所以用“大胆”来形容,是因为我们目前是一个创业团队,技术上的任何决策风险都可能导致整个公司陷入灾难。。。
    朋友圈发布之后很多朋友来找我聊具体的实现细节。于是我决定写这篇文章来跟大家仔细分享一下我的整个实现过程。

    先介绍一下背景:
    去年(16年)8月的某一天子雄来找我研究我们下一款产品的技术实现方案。在这之前我已经开始使用Unreal进行新产品Demo的开发。之所以选用Unreal是因为我们之前给老罗演示的产品Demo一直使用的是Unreal。但是子雄提出想更换Unity引擎做后续开发。由于具体理由会涉及我们的产品定位的一些细节,这个目前还在保密,不允许我说。。。 你们猜猜就好。。。
    在一番理由阐述及数据展示之后我被他说服了。本来使用Unity开发或者Unreal开发对我个人来说是无所谓的,但是他最后说了一句“我们未来的某一天可能会切回Unreal开发。。。”
    此时我的内心是崩溃的。。。

    为了保证我们某一天突然改变主意又不能影响研发进度,于是我做了第一步尝试:
    我把我之前开发的Unreal插件做了代码重构,然后在插件代码的上层做了一个对外暴露的C接口层。这样一来插件的功能就可以使用两种方式来调用:
    1.Unreal自身的执行环境。
    2.通过非Unreal的执行环境,直接利用C接口调用。

    以BlankPlugin为基础我写了一个小Demo。我绘制了一张类图,方便大家大概了解一下代码的结构:
    这里写图片描述
    如上图所示,每一个插件专门写一套导出接口(***PluginForUnity),然后所有的插件连接到GameModule。GameModule再统一对外暴露一套接口。修改UnrealBuildTool(以下简称UBT),使GameModule在任何情况下都生成动态库(IOS除外),并且所有的插件都静态链接进入GameModule输出的动态库。
    最终输出的动态库导出的C接口在Unity的C#代码中可以直接调用:
    这里写图片描述
    在开发过程中针对Unreal和Unity两种环境下使用的两套接口,在一些代码逻辑实现上会有一些差异。我们可以在一些实现有差异的地方加上宏将代码隔开:
    这里写图片描述
    然后我们在Unreal的Build文件中加上宏开关:
    这里写图片描述
    这样一来只需要修改Build文件中的一个bool变量的值,然后重新编译代码即可发布相应引擎的功能模块。通过这种实现方式,在Demo实现阶段我就可以随时切换产品依赖的引擎了。

    我们的产品需要一些三方库的支持,所以我需要为Unity插件添加一些三方库,在UBT的环境中添加三方库变得极为简单。UBT实在是太方便了,以至于我现在不管做什么编译都想移植到这个编译环境中来。
    14年的时候我服务于国内原端游时代某巨头公司。我跟我的同事们曾经做过一个事情,我们把CryEngine3移植到移动端(Android,IOS),让CryEngine3变成了全平台次世代游戏引擎。其中在编译及跨平台这方面参考了很多UBT的做法。但是很遗憾由于种种原因这个项目在初期版本完成之后被弃用了。

    在这里给Unity开发者介绍一下我们在UBT下添加第三方库的具体做法。
    在UBT的环境中Unreal的ThirdParty和新的子模块的添加变得极为方便,我们可以通过定义一个Build文件就添加了新模块的各个平台的版本到我们的工程中。为Unity开发C++插件需要引入Unity提供的接口定义文件。我们可以在“Unity\Editor\Data\PluginAPI”目录下找到这些文件:
    这里写图片描述
    因为有的时候我们的多个模块都需要引入这些头文件,于是我将这些文件以ThirdParty的形式添加进入我们的工程:
    1.在ThirdParty文件夹下建立子目录UnityPluginAPI。
    2.将PluginAPI文件夹拷贝至UnityPluginAPI目录,然后创建UnityPluginAPI.build.cs文件。
    3.在UnityPluginAPI.build.cs文件中我们添加如下代码:
    这里写图片描述
    现在我们就可以在我们的插件工程中引入新加入的UnityPluginAPI了:
    这里写图片描述

    9月份的时候我们开始加入新的研发人员和我一起开发新产品。于是我开始考虑作为上线产品对于技术实现的一些要求。目前面临的最大问题是对于Unreal的大量模块的过度依赖导致插件编译出来之后体积较大,急需代码瘦身。代码瘦身的第一步是删除大量对于作为外部插件无用的Unreal模块,同时需要修改UBT,定制自己的编译需求。这部分也是整个过程中最重要,也是工作量最大的地方。
    我首先删除了大量的Unreal Runtime下代码模块。目前能用到的代码模块也只有这些:
    这里写图片描述
    以上这些模块中,Core做了大量的修改,其他模块有的做了一点点修改,有的甚至一点没动。在这个过程中还要修改UBT解决编译依赖的一些错误。最终修改编译工具,使我们的改造引擎在Android及Windows平台的Debug、Development及Shipping环境下编译出动态库,而IOS平台始终编译出静态库。这部分比较繁琐,而且也相对产品研发比较特异,所以就不详细介绍了。

    最后强调一句,以上所有看似使用Unreal辅助Unity开发,但是其实我们一直没有脱离Unreal的开发环境,并且我保持了Unreal插件开发要掌握的所有细节,只要换个Unreal引擎编译你写的所有代码,一下子就变成了为Unreal开发的代码。也就是说我们可以在给使用Unity的产品开发功能的同时顺便也为使用Unreal的产品开发了功能。

    通过这种实现方案目前在我们的产品研发中我们收获了大量的好处:
    1.如果公司有多款产品同时使用Unreal和Unity开发,那我们在一些比较独立的功能模块研发上可以做到一份代码多个产品同时使用,再也不用为不同引擎开发相应的版本。
    2.Unreal提供了大量的C++库,极为方便和稳定,这为我们开发Unity 的Native插件带来了极大的帮助。
    3.写C++代码的时候注意跨平台,这方面Unreal也做了很多适应跨平台的封装。借助UBT的可以多平台编译的特性直接编译目标平台的代码。
    4.在我们产品中有一些比较重要的核心算法,我全部使用C++编写。这样就不用费劲去做C#的加密和混淆了,彻底地防止了反编译的发生。
    5.产品中的一些底层对效率要求极高的模块也用C++编写,保证了执行的效率。
    6.我们借助于UBT可以快速生成多平台的工程文件。这比针对各个平台手动创建工程要方便的多。而且代码文件的层次结构和本地存储目录保持一直,浏览及添加或删除新的代码文件变得极为方便。降低了手动维护出错的概率。UBT的编译配置也非常直观,可灵活配置并定义自己的编译环境。
    7.开发一个Unity产品有的时候我们需要接入一些三方库,这些库大部分是C/C++编写的。我们使用了跟Unreal一样的三方库接入方式。然后把一些三方库的接口根据我们的项目要求做封装,再把少量的接口暴露给C#。这样就简化了C++与C#的通信接口:
    这里写图片描述

    Unity的C#开发非常快速,门槛不高,代码维护及招人都非常容易。Unreal的C++开发能够保证执行效率,容易接入三方库,跨平台方面也不是问题,同时还能够保障代码安全性。我们使用Unity的C#开发应用上层逻辑,使用Unreal C++开发底层算法及其他基础功能模块。通过这种方式我们很好地发挥了两款引擎的各自优势。
    目前这套解决方案还不涉及大量Unreal渲染的东西,不处理那些Unreal特异的东西(例如UObject相关)。
    这套解决方案最大的难点在于我要大量改造Unreal代码,甚至编写自己的编译环境。这些东西又跟具体的项目关系特别紧密,没有办法给大家具体地展示。后续我会总结一些研发过程中可以提炼的细节(不涉密的)继续分享给大家。

    如果您对我的博客感兴趣可以扫下方的二维码关注我的微信订阅号。在那里我会不定期发布更多的技术文章。
    这里写图片描述

    展开全文
  • 在C++中编写Native方法 需要包含如下头文件: #include "Android/AndroidApplication.h" #include "Android/AndroidJNI.h" 方法格式如下: extern "C" JNIEXPORT void JNICALL Java_...

    在C++中编写Native方法

    需要包含如下头文件:

    #include "Android/AndroidApplication.h"
    #include "Android/AndroidJNI.h"
    

    方法格式如下:

    extern "C"
    JNIEXPORT void JNICALL
    Java_com_epicgames_ue4_GameActivity_onNativeTreadStart(JNIEnv *env, jobject instance)
    {
    	// 执行一些操作
    }
    

    这里博主建议不要手动打,容易出错,可以用Android Studio作为IDE:新建一个项目,包名为com.epicgames.ue4,Activity类的名字为GameActivity。

    在C++中调用GameActivity中的方法

    1、获取Env指针:

    JNIEnv* Env = FAndroidApplication::GetJavaEnv();
    

    2、获取方法ID:

    jmethodID id_getMainControllerOrientation = FJavaWrapper::FindMethod(
    		 Env,                               // Env
    		 FJavaWrapper::GameActivityClassID, // 所在的类,即GameActivity
    		 "getMainControllerOrientation",    // 方法名
    		 "()[F",                            // 方法签名,通过反汇编得到
    		 false);                            // 是否为可选
    

    3、通过ID调用方法:

    jfloatArray jfArray = (jfloatArray)FJavaWrapper::CallObjectMethod(Env, FJavaWrapper::GameActivityThis, id_getMainControllerOrientation);
    
    展开全文
  • 3D游戏引擎剖析

    2015-02-21 10:11:39
    这种模块化,可伸缩和扩展的设计观念可以让游戏玩家和程序设计者深入到游戏核心,用新的模型,场景和声音创造新的游戏, 或向已有的游戏素材中添加新的东西。大量的新游戏根据已经存在的游戏引擎开发出来,而大多数...
  • 游戏引擎剖析

    2013-04-12 13:50:35
    这是我在Gameres上看到的一篇文章,文章很长,全文分为11个部分,看后感觉写的非常好,对我启迪很大,特此推荐。作者是国外的一名老程序员,相信对于刚接触或者想要接触游戏引擎的同学,这篇文章能够带领你们步入...
  • AI:从游戏引擎--到AI

    2019-09-28 01:19:28
     这是我在Gameres上看到的一篇文章,文章很长,全文分为11个部分,看后感觉写的非常好,对我启迪很大,特此推荐。作者是国外的一名老程序员,相信对于刚接触或者想要接触游戏引擎的同学,这篇文章能够带领你们步入...
  • UE4 接入Aliyun SDK

    2019-10-30 09:38:02
    1. 首先https://help.aliyun.com/document_detail/106216.html?spm=a2c4g.11186623.6.921.45171717JSWP5D 下载阿里云sdk源码,按照步骤编译出alibabacloud-oss-cpp-sdk.lib 2. 在UE工程文件夹下创建ThirdParty/...
  • 这种模块化,可伸缩和扩展的设计观念可以让游戏玩家和程序设计者深入到游戏核心,用新的模型,场景和声音创造新的游戏, 或向已有的游戏素材中添加新的东西。大量的新游戏根据已经存在的游戏引擎开发出来,而大多数...
  • 3D游戏引擎技术剖析

    2013-10-13 16:36:00
    这种模块化,可伸缩和扩展的设计观念可以让游戏玩家和程序设计者深入到游戏核心,用新的模型,场景和声音创造新的游戏, 或向已有的游戏素材中添加新的东西。大量的新游戏根据已经存在的游戏引擎开发出来,而大多数...
  • 这种模块化,可伸缩和扩展的设计观念可以让游戏玩家和程序设计者深入到游戏核心,用新的模型,场景和声音创造新的游戏, 或向已有的游戏素材中添加新的东西。大量的新游戏根据已经存在的游戏引擎开发出来,而大多数...
  • 游戏引擎全解剖

    2009-04-01 13:19:00
    这种模块化,可伸缩和扩展的设计观念可以让游戏玩家和程序设计者深入到游戏核心,用新的模型,场景和声音创造新的游戏, 或向已有的游戏素材中添加新的东西。大量的新游戏根据已经存在的游戏引擎开发出来,而大多数...
  • 游戏引擎全剖析

    2008-01-05 11:53:00
     这种模块化,可伸缩和扩展的设计观念可以让游戏玩家和程序设计者深入到游戏核心,用新的模型,场景和声音创造新的游戏, 或向已有的游戏素材中添加新的东西。大量的新游戏根据已经存在的游戏引擎开发出来,而...
1 2 3
收藏数 49
精华内容 19
关键字:

unreal 添加三方库