好久没写博客了,今天被一个问题困扰了好久,网上了查不到相应的解决方案,自行解决后才觉得还是写写博客吧,说不定能帮助别人少走弯路……

    首先说明我的运行环境:MAC系统版本号10.13.4, Unity版本号2018.1.0。解释下当前环境的问题,首先MAC系统升级到10.13版本后,文件系统改为了APFS格式,而Windows系统中的Unity 工程是在NTFS格式的文件系统中创建的,所以工程或文件导入MAC系统后,Unity旧版本会无法识别,而unity目前只有Unity2017beta更新了相关的支持,所以我是用了Unity2018版本。但是,也因此出现了一些问题……

    Unity工程的Plugins文件夹中经常会放入一些dll文件,而这些dll文件是在Windows系统中编译生成的,比如dll文件是封装的数据,用来序列化操作,其中一个类如下:

/// <summary>
/// 关卡数据
/// </summary>
[Serializable]
public class LevelData {

    /// <summary>
    /// 关卡ID
    /// </summary>
    public int ID;
    /// <summary>
    /// 关卡等级
    /// </summary>
    public int level;
    /// <summary>
    /// 关卡名称
    /// </summary>
    public string name;
    /// <summary>
    /// 场景ID
    /// </summary>
    public int sceneID;
    /// <summary>
    /// 场景中的敌人id
    /// </summary>
    public int[] enemyIds;
    /// <summary>
    /// 每个敌人id对应的数量
    /// </summary>
    public int[] enemyCounts;
}

    这样能保证我序列化和反序列化用到的是同一个的类,这里序列化和反序列化操作用的是BinaryFormatter的Serialize和Deserialize方法,具体的不再解释。当我把数据序列成二进制文件后,MAC的编辑器下运行反序列化没有任何问题,但是打包到IOS端运行后,反序列化二进制文件会异常……例如反序列化二进制为上面的LevelData,会提示System.Runtime.Serialization.SerializationException: Field "name" not found in class LevelData……大概意思是找不到name字段,就算修改了字段名,也会提示找不到其他字段……

    这个问题非常莫名其妙,排查了好久,最后干脆把dll文件删掉,直接将dll中的源码放入Unity工程中使用,例如LevelData脚本就会放入,这样会被自动编译到Unity工程的程序集文件中。这样运行后发现问题解决了……

    最后问了下以前公司的大佬,他们把Unity工程打包IOS时,是通过移动硬盘在MAC电脑上打包的,而移动硬盘的格式非NTFS的,而是MAC-OS扩展(日志式),这样打包是可以正常使用Plugins中的dll文件的。MAC系统上显示的移动硬盘信息如图:

unity ui适配ipad unity windows ios_unity ui适配ipad

    其实就是指Unity的工程在Mac上打包不能用NTFS格式的磁盘,因为这是Windows系统格式的。也可以在Mac磁盘上进行分区,单独设置一个分区的格式为Mac OS(日志式)的,这样通过NTFS的硬盘拷贝的工程,直接拷贝到MAC的这个分区上进行打包操作即可。

    因此联想到问题的根源可能是文件系统的原因,因为用的是NTFS格式文件系统工程,就算拷贝到MAC系统上,文件保存的系统格式是不变的,导致打包后无法正常使用。具体的根源还请指导的大神告知……

    还有一种猜想解决方案,的Unity工程中使用的dll,在MAC系统上使用VS for Mac来生成,然后放入到Unity的Plugins文件夹,这样编译的dll就是Mac文件系统格式的。皆因自己无能,找不到MAC上的VS在哪查看和设置FrameWork .NET的版本,生成的dll版本是.NET6的,而Unity旧版本只支持.NET3.5以内的……望知晓的大佬指点下