Unity不同平台生成中预处理的注意点-创新互联

Unity3D的项目,这周吃亏在宏上了。大背景是项目需要在Unity中用Hudson自动生成不同平台的版本。

成都创新互联公司长期为上千多家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为科尔沁左翼企业提供专业的网站设计、成都网站建设科尔沁左翼网站改版等技术服务。拥有10年丰富建站经验和众多成功案例,为您定制开发。

程序设计语言的预处理的概念:在编译之前进行的处理。

#if UNITY_WEBPLAYER
      BuildTarget target = BuildTarget.WebPlayer;
#elif UNITY_STANDALONE_WIN && UNITY_EDITOR
       BuildTarget target = BuildTarget.StandaloneWindows;
#elif UNITY_ANDROID
      BuildTarget target = BuildTarget.Android;
#else
      BuildTarget target = BuildTarget.iPhone;
#endif

#if UNITY_WEBPLAYER
  public const string AssetRootPath = AutomaticBuild.WebPlatFormDataPath + "/";
#elif UNITY_STANDALONE_WIN && UNITY_EDITOR
   public const string AssetRootPath = AutomaticBuild.WinPlatFormDataPath + "/";
#elif UNITY_ANDROID
  public const string AssetRootPath = AutomaticBuild.AndRoidPlatFormDataPath + "/";
#else
  public const string AssetRootPath = AutomaticBuild.IOSPlatFormDataPath + "/";
#endif

如上面两段代码,打开Unity项目(例如PC & Mac Standalone保存的)之后,再打开项目的Script(这里用VS2008+VA),会发现上述加粗行高亮。即Target和AssetRootPath在编译前已然确定,且之后不能对其做出变更。

当采用Unity支持的命令编译时C:\program files\Unity\Editor>Unity.exe -quit -batchmode -executeMethod MyEditorScript.MyMethod

此时MyMethod可能用了如下代码,

BuildPipeline.BuildPlayer( levels, "WebPlayerBuild",                     BuildTarget.WebPlayer, BuildOptions.None);
但Target和AssetRootPath并没有赋予应有的Web相应值,会造成生成的Unity3D文件能生成但不对,执行BuildPlayer时会报Runtime Error错。

不禁让我想起Effective C++里的第2个条款:尽量以const, enum, inline替换 #define。果然金科玉律……

我的解决方式如下:

1.在MyMethod中先调用

SwitchActiveBuildTarget (target : BuildTarget)函数。

  private static string AssetRootPath = null;

  public static string GetAssetRootPath()
  {
    if (AssetRootPath != null)
      return AssetRootPath;

    if (EditorUserBuildSettings.activeBuildTarget==BuildTarget.WebPlayer)
    {
      AssetRootPath = "WebData/LatestData/";
    }
    else if (EditorUserBuildSettings.activeBuildTarget == BuildTarget.Android)
    {
      AssetRootPath = "AndroidData/LatestData/";
    }
    else if (EditorUserBuildSettings.activeBuildTarget == BuildTarget.StandaloneWindows)
    {
      AssetRootPath = "WinData/LatestData/";
    }
    else
    {
      AssetRootPath = "IOSData/LatestData/";
    }

    return AssetRootPath;
  }

  public static BuildTarget GetBuildTarget()
  {
    return EditorUserBuildSettings.activeBuildTarget;
  }

由于需求的小变更,小小地重构了上次的代码:

    ClearISingleFileSeries();
    ClearDirectorySeries();


  ///
  /// 删除单个文件的数组
  ///

  static void ClearISingleFileSeries()
  {
    string[] SingleFileSeries = { Application.dataPath + "/Plugins/I18N.dll", Application.dataPath + "/Plugins/I18N.CJK.dll", Application.dataPath + "/Plugins/I18N.West.dll" };
    ClearFiles(SingleFileSeries);
  }


  ///
  /// 删除filesPath数组内指向的文件
  ///

  ///  
  static void ClearFiles(string[] filesPath)
  {
    foreach (string singleFilePath in filesPath)
    {
      if (File.Exists(singleFilePath))
      {
        try
        {
          File.Delete(singleFilePath);
        }
        catch (System.Exception ex)
        {
          //catch ex
        }
      }
    }
     
  }


  ///
  /// 删除目前做Web版本会出现内存问题的Audio资源
  ///

  static void ClearDirectorySeries()
  {
    string[] audioPath = { Application.dataPath + "/Game/Audio/Resources", Application.dataPath + "/Game/Audio/SFX", Application.dataPath + "/Game/MyGUI" };
    foreach (string audioDirectory in audioPath)
    {
      if (Directory.Exists(audioDirectory))  //保护,避免文件目录不存在跳异常
        ClearFilesAndDirectory(audioDirectory);
    }
  }

     
  ///
  /// 删除dataPath文件目录下的所有子文件及子文件夹
  ///

  ///  
  static void ClearFilesAndDirectory(string DirectoryPath)
  {
    DirectoryInfo dir = new DirectoryInfo(DirectoryPath);


    //文件
    foreach (FileInfo fChild in dir.GetFiles("*"))
    {
      if (fChild.Attributes != FileAttributes.Normal)
        fChild.Attributes = FileAttributes.Normal;
      fChild.Delete();
    }


    //文件夹
    foreach (DirectoryInfo dChild in dir.GetDirectories("*"))
    {
      if (dChild.Attributes != FileAttributes.Normal)
        dChild.Attributes = FileAttributes.Normal;
      ClearFilesAndDirectory(dChild.FullName);
      dChild.Delete();
    }

  }

转载自:http://blog.csdn.net/pandawuwyj/article/details/7959335

另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


分享文章:Unity不同平台生成中预处理的注意点-创新互联
网页地址:http://azwzsj.com/article/cecccg.html