|
首先说明为什么删除模块源码;
你写了一个插件,源码不希望公开的;
有这样几种情况,
第一种,全部都是编辑器代码,在编辑器情况下使用的,删除源码较为简单;
第二种,有一些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 + &#34;\\&#34; + 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 + &#34;\\&#34; + Path.GetFileName(files), true);
}
catch (Exception ex)
{
throw ex;
}
}
}
for (int i = 0; i < directories.Length; i++)
{
action(directories, f2 + &#34;\\&#34; + directories.Split(&#39;/&#39;, &#39;\\&#39;).Last());
}
};
if (Directory.Exists(folder))
{
action(folder, targetFolder);
}
} |
|