UE4 Plugin打包使用笔记
Plugin经过打包,在模块内的.Build.cs文件中加上bUsePrecompiled = true,并且把cpp文件都删掉后也依然能够使用、参与项目打包的原因就是Plugin在打包时就已经提前生成了所需要的中间文件,中间文件存放在插件路径的Intermediate文件夹中
在Intermediate/Build中,生成了在插件打包时由.uplugin文件内指定的白名单平台所需的项目打包的中间文件
这里拿Win64举例,在Intermediate/Build/Win64中,有UE4以及UE4Eidtor两个文件夹,分别供编辑器和打包项目使用
UE4文件夹下分别有Development、Inc、Shipping三个文件夹,分别是打包开发版时使用的obj文件,反射文件,打包发行版时的obj文件
- 如果项目使用的引擎是源码版,在项目打包时,引擎会自动把所有用到的插件的Intermediate文件复制到项目的Intermediate文件夹下以供项目打包,非源码版则没有这个复制动作,为啥这样还没弄明白
- 但是已经打包过,并且放在项目路径下的插件,引擎并不会自动复制,为啥这样也没弄明白
- 因为这个原因,使用非源码版的引擎,在使用已经打包过的插件参与项目打包的时候,不需要进行其他的操作,但是源码版引擎则需要手动把打包过的插件的Intermediate文件复制到项目的Intermediate文件夹中
- 所以这个时候需要在模块的.Build.cs文件中加上复制文件的操作
using System;
using System.IO;
if (!(Target.Type == TargetType.Editor)) //编辑器下不需要复制
{
string TargetName = Target.Name;
string PluginBaseDirectory = Path.GetFullPath(Path.Combine(ModuleDirectory, "..", "..")); //插件路径
string ProjectBaseDirectory = Path.GetFullPath(Path.Combine(PluginBaseDirectory, "..", "..")); //项目路径
if (Target.Platform == UnrealTargetPlatform.Win32 || Target.Platform == UnrealTargetPlatform.Win64)
{
string DirectoryShouldCopy = Path.GetFullPath(Path.Combine(PluginBaseDirectory, "Intermediate\\Build", Target.Platform.ToString(), "UE4"));
string TargetDirectory = Path.GetFullPath(Path.Combine(ProjectBaseDirectory, "Intermediate\\Build", Target.Platform.ToString(), TargetName));
DirectoryCopy(DirectoryShouldCopy, TargetDirectory);
}
else if (Target.Platform == UnrealTargetPlatform.Linux)
{
string LinuxOnlyDirectory = "B4D820EA"; //Linux打包特有的路径
string DirectoryShouldCopy = Path.GetFullPath(Path.Combine(PluginBaseDirectory, "Intermediate\\Build\\Linux", LinuxOnlyDirectory, "UE4"));
string TargetDirectory = Path.GetFullPath(Path.Combine(ProjectBaseDirectory, "Intermediate\\Build\\Linux", LinuxOnlyDirectory, TargetName));
DirectoryCopy(DirectoryShouldCopy, TargetDirectory);
}
}
public void DirectoryCopy(string SourceDirectory, string TargetDirectory)
{
try
{
DirectoryInfo Dir = new DirectoryInfo(SourceDirectory);
FileSystemInfo[] Fileinfo = Dir.GetFileSystemInfos();
foreach (FileSystemInfo Info in Fileinfo)
{
if (Info is DirectoryInfo)
{
if (!Directory.Exists(TargetDirectory + "\\" + Info.Name))
{
Directory.CreateDirectory(TargetDirectory + "\\" + Info.Name);
}
DirectoryCopy(Info.FullName, TargetDirectory + "\\" + Info.Name);
}
else
{
File.Copy(Info.FullName, TargetDirectory + "\\" + Info.Name, true);
}
}
}
catch (Exception Ex)
{
System.Console.WriteLine(Ex);
}
}
DirectoryCopy函数来自这篇博客,感谢