码迷,mamicode.com
首页 > 移动开发 > 详细

「Unity」与iOS、Android平台的整合:1、导出的Xcode工程

时间:2016-07-06 00:08:12      阅读:2694      评论:0      收藏:0      [点我收藏+]

标签:

本文属于「Unity与iOS、Android平台的整合」系列文章之一。

本文主要讲解Unity导出的Xcode工程的目录结构。

 

我所用软件的版本:

  Unity 5.3.5f1

  Xcode 7.3

 

前导步骤

第一步,创建一个新的工程 Build_to_iOS_Android

第二步,创建一个新文件 CSharpToCPP.cs

using UnityEngine;

public class CSharpToCPP
{
    public void Func(int num)
    {
        if (num < 1)
        {
            return;
        }
        else
        {
            Debug.Log("Log:Time" + num);
        }
    }
}

第三步,创建Plugins/iOS/iOS_EmptyMM.mm、StreamingAssets/ALL_EmptyTxt.txt

第四步,保存一下场景,如下图

技术分享

第五步,选择iOS平台,Build导出Xcode工程

技术分享

第六步,打开所导出的Xcode工程

技术分享

 

进入正题

1、程序入口

任何程序都有一个入口,Unity导出的Xcode工程中也不例外,通过下图我们可以看到,在应用的入口中创建了UnityAppController的对象。

技术分享

 

 通过下图我们可以看到,UnityAppController是继承了UIApplicationDelegate,至于它是什么我就不赘述了,大家可以看一下这一篇文章:简析UIApplication及UIApplicationDelegate

技术分享

 

 下图为一个UIApplication的声明周期,我们可以看到系统事件存在着非常有用的监听,在UnityAppController.mm里面我们也可以看到对应的函数,这意味着在Unity中一样可以收到这些事件,以后我们将继承UnityAppController,并重写这些监听。

技术分享

 

 

2、C# -> C++:

在Unity中,我们用的是C#、JS进行编程(我是C#党),但是导出Xcode工程后,这些代码都转换成了C++代码。

在Player Settings里面我们可以看到脚本的运行模式有两种,一种是IL2CPP,另一种是Mono2x(以后肯定会被CPP替代,我就不讲了),通常我们会选择IL2CPP,因为效率高。

技术分享

 

选择IL2CPP我们的逻辑代码将全部转换为C++代码,下图为CSharpToCPP.cs转换成的C++代码。

技术分享

 

以下代码是上图中的翻译代码,对比我们一开始写的CSharpToCPP.cs里逻辑,应该能够看懂其中的逻辑。

// System.Void CSharpToCPP::Func(System.Int32)
extern Il2CppClass* Int32_t2847414787_il2cpp_TypeInfo_var;
extern Il2CppClass* String_t_il2cpp_TypeInfo_var;
extern Il2CppClass* Debug_t1588791936_il2cpp_TypeInfo_var;
extern Il2CppCodeGenString* _stringLiteral2043233667;
extern const uint32_t CSharpToCPP_Func_m1441544591_MetadataUsageId;
extern "C"  void CSharpToCPP_Func_m1441544591 (CSharpToCPP_t373417985 * __this, int32_t ___num0, const MethodInfo* method)
{
    static bool s_Il2CppMethodIntialized;
    if (!s_Il2CppMethodIntialized)
    {
        il2cpp_codegen_initialize_method (CSharpToCPP_Func_m1441544591_MetadataUsageId);
        s_Il2CppMethodIntialized = true;
    }
    {
        int32_t L_0 = ___num0;
        if ((((int32_t)L_0) >= ((int32_t)1)))
        {
            goto IL_0008;
        }
    }
    {
        return;
    }

IL_0008:
    {
        int32_t L_1 = ___num0;
        int32_t L_2 = L_1;
        Il2CppObject * L_3 = Box(Int32_t2847414787_il2cpp_TypeInfo_var, &L_2);
        IL2CPP_RUNTIME_CLASS_INIT(String_t_il2cpp_TypeInfo_var);
        String_t* L_4 = String_Concat_m389863537(NULL /*static, unused*/, _stringLiteral2043233667, L_3, /*hidden argument*/NULL);
        IL2CPP_RUNTIME_CLASS_INIT(Debug_t1588791936_il2cpp_TypeInfo_var);
        Debug_Log_m1731103628(NULL /*static, unused*/, L_4, /*hidden argument*/NULL);
        return;
    }
}

由于C++代码是机器自动生成的,可读性催人尿下,所以最好参照自己的C#代码进行阅读。

由于Unity -> Xcode -> 设备,编译时间太过漫长了,所以在问题排查时,我会尝试注释或简单修改C++代码,实现问题定位等。

 

 

3、资源 StreamingAssets -> Data/Raw

Unity导出Xcode工程后,原工程中的各种资源都被压缩、打包、加密后存放在Data文件夹中,这一点和Android是一致的,网上也有很多资源解密的方法,大家有需要可以自行搜索。

我们重点说一下Unity中的StreamingAssets文件夹,关于这个文件的作用,大家可以看一下这篇文章:Unity3D研究院之手游开发中所有特殊的文件夹

通过下图我们可以看到,StreamingAssets文件夹中的ALL_EmptyTxt.txt文件被完整地拷贝到Data/Raw文件夹中,实际上不光是文件,文件夹也会原封不动地拷入该文件夹。

技术分享

至于这有什么用,比如说,配置文件放在这里,上手机调试的话可以在Xcode工程中直接修改配置,而不需要到Unity里重新导出Xcode工程。

 

 

4、Plugins/iOS -> Library/Plugins/iOS

Plugins/iOS文件夹中通常会放一些*.a、*.h、*.m文件,这些文件将拷贝至在Xcode工程的Library/Plugins/iOS文件夹中,在Xcode编译时也将被编译。

技术分享

实际操作过程中,我会把自己为iOS写的OC、C、C++代码、SDK提供的.a文件放到里面,以避免每次编译后都要在Xcode工程里重新导入。

 

 

5、Icon

在Unity的Player Settings是中,我们可以添加相应的Icon

技术分享

 

这些Icon图片将被重新压缩、命名最后放入下图中的位置。

技术分享

 

由于Icon在Unity内将占据一定的内存,所以一般我会在Xcode中替换Icon文件,效果一致且不占用Unity的内存。

 

 

6、闪屏

Unity在iOS有很多种闪屏方案,具体方案效果大家可以自行搜索~

技术分享

 

下图为常见的单图片闪屏导出位置,与Icon一样,我一般在这边替换,哦对,不要忘了取消ShowUnitySplashScreen的勾选。

技术分享

 

 

7、Framework

在Unity的Plugins/iOS/中文件可以为自身简单勾选配置一些Framework依赖,见下图。

技术分享

 

这些依赖将自动添加到Xcode工程中,我们可以在Frameworks文件夹检查是否添加。 

技术分享

 

 

8、Player Settings -> 设置

技术分享

在Unity的Player Settings中存在着大量的配置,这些配置将反应到Xcode工程中,在下图中圈出了部分,这些东西并不复杂,我也就不赘述了。

技术分享

技术分享

技术分享

 

「Unity」与iOS、Android平台的整合:1、导出的Xcode工程

标签:

原文地址:http://www.cnblogs.com/777777-716/p/5642071.html

(0)
(1)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!