找回密码
 立即注册
查看: 350|回复: 0

041.UE4如何跳过预编译从而不用模块源码,UE4删除插件源码;

[复制链接]
发表于 2023-2-10 11:03 | 显示全部楼层 |阅读模式
首先说明为什么删除模块源码;

你写了一个插件,源码不希望公开的;
有这样几种情况,
第一种,全部都是编辑器代码,在编辑器情况下使用的,删除源码较为简单;
第二种,有一些runtime代码,需要在game中运行的,需要在编辑器和打包后的exe中都需要的;
第三种,还是前两种情况,但你使用的引擎有所区别;一个是发行版的、打包好的引擎,另一个是开发版的、源码版的引擎,这两种引擎应对前两种情况,也不同;
第四,下面的操作理解一下,前三种遇到的情况都可以解决;我就不按照各种情况来说明了;
使用发行的、打包的引擎,如何删除模块源码;

这类引擎,删掉源码会简单很多;
尽量不要在cpp中写框架的声明性质代码;
.h和.cpp文件都要结构清晰,习惯代码乱写的不要看我的文章;
首先如果不会打包引擎的,可以关注我下一篇文章,打包引擎和打包插件;
其次,EPIC Launcher中下载的引擎,属于发行的,打包的引擎,如果你使用的是这类引擎,那么和我们自己用源码打包出来的引擎是一类的。
这类引擎,你只需要将.cpp文件删除,包括.generated.cpp也删除就可以了;当然,这要求你的插件也是打包出来的,无错误的,并且installed在引擎中;这些都会在打包引擎和打包插件中解释;
这种用于编辑器代码和打包项目runtime代码,都是没问题的;
使用源码引擎、非发行打包的引擎,如何删除模块源码;

第一步,打包好插件,并删除源码文件,一般是.cpp文件;尽量不要在cpp中写框架性质的声明等代码;.h和.cpp文件都要结构清晰,习惯代码乱写的不要看我的文章;
第二步,generate一下solution,我们修改一下模块build.cs;
第三步,在build.cs中添加跳过预编译阶段,bUsePrecomplied = true;
第四步,注意intermediate文件夹不能删除,其中的中间的obj文件还是需要的,是编辑器需要的;若模块在插件中,那么插件中的intermediate文件夹也不能删掉;
第五步,若你的模块在插件中,拷贝intermediate文件夹为副本,在副本的intermediate/Build/Android(或其他平台的文件夹下),有一个UE4文件夹,将其名称更改为你的项目名称;注意,如果你直接修改intermediate,会导致你的插件无法在编辑器状态下使用;
第六步,若你的模块在插件中,把插件的副本的intermediate文件拷贝到项目中,并覆盖;
刚才的改名、拷贝、覆盖操作,你也可以用代码写在模块的build.cs中,变成自动的;下面的代码只有拷贝并没有改名字,c#文件夹改名字还是很简单的;这样做的目的是能够打包runtime代码;
第七步,打开你的项目,在项目的.Target.cs中,开启bPrecomplie = true;
第八步,使用;这样你的项目,可以没有插件源码使用了;这种情况包含了,你的源码是编辑器代码,在编辑器情况下使用;也包含了runtime的源码删除的情况,你打包项目,也都不会出问题;
第九步,另外,如果你是仅仅在编辑器状态下使用,没有runtime的源码,那么,你可以不需要之前的改名以及拷贝操作,直接删掉插件源码,并标记为跳过预编译,就可以在编辑器状态下使用;
注意;

这里需要注意的是插件的打包;当然这里不详细解释插件的打包,只是说明一下,打包插件的引擎,和使用没有源码插件的引擎,要是同一个版本的引擎;
下面解释一下所谓的同一个版本的引擎;源码版引擎只要源码版本一致就行;而发行版,即使是同一个源码版本的,不同打包批次的,也不是同一个版本;所以发行版的、打包版的引擎,你要看是谁发行的,是谁打包的,大家用的是不是同一个包,这才是同一个版本;
下面的代码是C#拷贝文件夹的代码,我简单写了一下,或者自己去实现;

调用;

CopyFolderToTargetedFolder(Path.GetFullPath(Path.Combine(ModuleDirectory, "../../BackUpIntermediate")), Path.GetFullPath(Path.Combine(ModuleDirectory, "../../../../Intermediate")));实现;

using System;
using System.IO;
using System.Linq;

    private void CopyFolderToTargetedFolder(string folder, string targetFolder)
    {
        Action<string, string> action = null;

        action = (f1, f2) =>
        {
            string[] files = Directory.GetFiles(f1);
            string[] directories = Directory.GetDirectories(f1);

            if (Directory.Exists(f2))
            {
                for (int i = 0; i < files.Length; i++)
                {
                    try
                    {
                        System.IO.File.Copy(files, f2 + "\\" + Path.GetFileName(files), true);
                    }
                    catch (Exception ex)
                    {
                        throw ex;
                    }
                }
            }
            else
            {
                Directory.CreateDirectory(f2);

                for (int i = 0; i < files.Length; i++)
                {
                    try
                    {
                        System.IO.File.Copy(files, f2 + "\\" + Path.GetFileName(files), true);
                    }
                    catch (Exception ex)
                    {
                        throw ex;
                    }
                }
            }

            for (int i = 0; i < directories.Length; i++)
            {
                action(directories, f2 + "\\" + directories.Split('/', '\\').Last());
            }
        };

        if (Directory.Exists(folder))
        {
            action(folder, targetFolder);
        }
    }
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-23 17:36 , Processed in 0.089303 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表