分类 问题 下的文章

Unity中使用c# Process在Mac上异常Win32Exception: ApplicationName

在Unity中调用TexturePacker打包图集,核心代码如下:

    Process p = new Process ();
    p.StartInfo.FileName = "TexturePacker";
    p.StartInfo.CreateNoWindow = true;
    p.StartInfo.UseShellExecute = false;
    p.StartInfo.RedirectStandardError = true;
    p.StartInfo.RedirectStandardOutput = true;
    p.Start();
    p.WaitForExit();

在Windows上运行正常,Mac上报异常:

Win32Exception: ApplicationName='TexturePacker', CommandLine='',
CurrentDirectory='' System.Diagnostics.Process.Start_noshell
(System.Diagnostics.ProcessStartInfo startInfo,
System.Diagnostics.Process process)
System.Diagnostics.Process.Start_common
(System.Diagnostics.ProcessStartInfo startInfo,
System.Diagnostics.Process process) System.Diagnostics.Process.Start
() (wrapper remoting-invoke-with-check)
System.Diagnostics.Process:Start ()

一番查找发现,Mac上应该用open命令调用目标应用,Mac版本的代码修改如下:

- 阅读剩余部分 -

Unity使用System.Drawing.dll在Mac上报异常DllNotFoundException: gdiplus.dll

在Unity中使用Mono库System.Drawing.dll处理图像,Windows上一切正常,在Mac上运行报异常:

DllNotFoundException: gdiplus.dll
System.Drawing.GDIPlus..cctor ()
Rethrow as TypeInitializationException: An exception was thrown by the type initializer for System.Drawing.GDIPlus
System.Drawing.Bitmap..ctor (Int32 width, Int32 height, PixelFormat format)
System.Drawing.Bitmap..ctor (Int32 width, Int32 height)
(wrapper remoting-invoke-with-check) System.Drawing.Bitmap:.ctor (int,int)

System.Drawing.dll内部依赖于gdiplus.dll,gdiplus.dll在Window上属于系统自带库所以一切正常。Mac上不存在gdiplus.dll,也未在网上找到独立的Mono版gidplus.dll。
但在Unity和MonoDevelop安装路径下有个libgdiplus.dylib,倒腾到dllmap中依旧异常,这两个路径下带的libgdiplus.dylib都不能正常使用。
最后安装了完整的Mono环境才搞定,Unity自带的Mono运行时是经过定制的这也能理解。

解决步骤如下:

- 阅读剩余部分 -

Dotfuscator进行dll混淆的一个问题

用Dotfuscator进行Unity3D代码混淆时报异常:

Could not find a compatible version of ildasm to run on assembly (valid path to solution output exe). This assembly was originally built with .NET Framework v2.0.50727

找不到.NET Framework v2.0.50727,在Dotfuscator工程配置文件project.xml中添加路径映射解决

<dotfuscator version="2.3">   
   <propertylist>
      <property name="ILDASM_v2.0.50727" value="C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\ildasm.exe" />
      <property name="ILDASM_v4.0.30319" value="C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\ildasm.exe" />  
   </propertylist>

参考:http://stackoverflow.com/questions/11469293/dotfuscator-could-not-find-compatible-version-of-ildasm

Unity3D 每次打包生成的AssetBundle Hash都不一样的原因

用Unity3D做游戏开发,基本都会涉及到资源版本管理及更新,下面是做的过程中遇到的一小问题,记录一下以供参考。

而常用于标记资源版本的方法有计算文件Hash、VCS的版本等,进行文件Hash计算时发现同一个资源文件每次打包成AssetBundle后Hash都不一样,这不科学啊,这样基本是废了用Hash作版本标记的方法。

查了查资料,发现AssetBuildPipeline.BuildAssetBundle接口options参数,可以增加一项BuildAssetBundleOptions.DeterministicAssetBundle。这将保证AssetBundle使用唯一Hash进行标识,若不加这个参数AssetBundle每次构建时都生成不同ID

Unity3D WWW用file协议下载失败问题

Unity3D中加载本地或远程资源会用到WWW类,最使用Unity3D的WWW类加载本地磁盘资源时发现总是加载失败,先看看以下例子:

using System.Collections;
using UnityEngine;

public class WWWTest : MonoBehaviour
{
    void Start()
    {
        StartCoroutine(Load());
    }

    private IEnumerator Load()
    {
        string path = "file://D:/file.txt";
        WWW www = new WWW(path);
        yield return www;

        if (www.error != null)
        {
            Debug.LogError(www.error);
        }
        else
        {
            Debug.Log(www.text);
        }
    }
}

这段代码是从path路径加载一个文本文件,成功则打印文本内容,失败则打印异常信息。

- 阅读剩余部分 -