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函数来自这篇博客,感谢

UE4