本文旨在记录Unity 导出的iOS 项目笔记,另带接入SDK的终极方案,顺带对比Android 项目

1蓝色的目录 Data 这个就是项目的数据,每个项目不一样也就是这个目录不一样,是不是可以把这个目录删掉,

把新倒出项目Data 拷贝过来就完成项目导出(我试过了不可以了QvQ)。

2Images.xcassets 这个就是图片目录类似 Android Drable 项目图片资源

3Main.mm  工程入口

4Class 黄色目录 这个目录类容多,也是最重要的

  PluginBase 一共四个类接入SDK 的关键类

  AppDelegateListener 顾名思义这个是App代理类,此代理非Java代理,更像是Java的接口,对应Android Activity而不是

  UIApplication,这一点apple和谷歌确实有区别,Apple更为严谨。一般sdk要接入 在适当的位置(适当的位置一定是init方法,因为一般sdk要接入app启动的监听,晚了就监听不到了)

  UnityRegisterAppDelegateListener 方法传入 实现了AppDelegateListener 代理对象

  LifeCycleListener app生命周期监听Android 也是在UIApplication 和Activity中,这也导致了Android Activity 业务太多类写的太复杂不易维护

  UnityRegisterLifeCycleListener 注册声明周期监听,要注意的是注册UnityRegisterAppDelegateListener 就会自动注册生命周期监听

  RenderPluginDelegate对应Activity controller 方法,但是Activity 不仅仅是一个view的控制器,apple就分的非常细,更加的面向对象

  - (void)mainDisplayInited:(struct UnityDisplaySurfaceBase*)surface;

  - (void)onBeforeMainDisplaySurfaceRecreate:(struct RenderingSurfaceParams*)params;

  - (void)onAfterMainDisplaySurfaceRecreate;

  - (void)onFrameResolved;--onCreat

  - (void)didBecomeActive:(NSNotification*)notification;--onStart

  - (void)willResignActive:(NSNotification*)notification;

  - (void)didEnterBackground:(NSNotification*)notification;--> Android 进入后台,apple 分的细 前后都有调用

  - (void)willEnterForeground:(NSNotification*)notification;-->

  - (void)willTerminate:(NSNotification*)notification; -->其实也挺乱的 Activity 的onFinishi 方法(我可能没记住)

这个不是注册监听的方式,是写一个代理的实现类在main方法加载之前赋值上去的在实现类mm文件结尾加

  没有仔细研究,先挖一坑,我后面抽空填上

  UnityViewControllerListener 这个也是Activity ,哈哈我都无语了,android activity 可以存放很多view ios 一个控制器一般

  只会控制一个view ,控制器可以有子控制器来控制多个view。

  这四个或者三个就包含了skd要的所有方法比喻。启动,获取 设备token,app跳转监听,获取view 控制器。

  之前我的做法是找到 UnityAppController 和ViewController 中的方法挨个加,容易出错不说,他有很多平台方法都长一样容易出错,

  而sdk接入是否成功有的只有发行那边知道,发行说没对,来回搞浪费时间,要加班的哦。

  这个方法要改unity代码其实是不对的,就比如你拿到一个SDK,要改SDK代码一样,一般是实现接口,获取数据做业务。

  UnityIos 不需要修改unity代码 是继承UnityAppController 在他的 mm文件加上

  IMPL_APP_CONTROLLER_SUBCLASS(SubClass),这个对象+Load()方法中告诉unity 启动他的UnityAppController子类

  再在init方法中完成监听注册

  

- (instancetype)init
{
self = [super init];
if (self) {
NSLog(@"-------------");
UnityRegisterAppDelegateListener(self);//注册监听
}
return self;
}

这样可以不修改一句Unity 代码完成sdk接入 Andorid 项目提供了一个UnityPlayerActivity 类供使用,我一般是在这个类的里改源码接SDK,

这样坏处就是Unity会升级,unity会改这里的代码。 不能偷懒,之前我也不会。

接SDK的说完了

Classs/UI 这个就是UI业务了,我也挖个坑后面填

Classs/Unity unity的业务 调摄像头,播放视屏啥的

Classs/下面还有10几个类 崩溃日志,传感器,编译宏定义 pluginsbase 的实现类

Class/Native unity的c++代码

UnityFramework 这个对unity的封装了,比如你要继承 生命周的类你要找到这些类的目录,还有其他相关的类的头文件都拷贝到了这个.h文件

在自己的代码中加一句

#import <UnityFramework/UnityFramework.h> 所有的你要想要的头文件都帮你倒入了,看下他的代码

#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h> #import "UnityAppController.h" #include "UndefinePlatforms.h"
#include <mach-o/ldsyms.h>

康康 UnityAppController.h

#import <QuartzCore/CADisplayLink.h>

#include "RenderPluginDelegate.h"

好像有啥也没有 但是对于高级应用而言已经够了。

最后加上iOS 启动播放视屏的方法(没入门的都会,但是如果是天天搞Unity 确实让人摸不到头脑

//
// MyApp.m
// UnityFramework
//
// Created by xiaolong on 2021/10/17.
//
#import <Foundation/Foundation.h>
#import "MyApp.h"
#import "AppDelegateListener.h"
#import "UnityViewControllerListener.h"
#import <AVKit/AVKit.h>
@interface MyApp()<AppDelegateListener,UnityViewControllerListener,LifeCycleListener>
@property(nonatomic,strong)AVPlayerViewController* pvc;
@property(nonatomic,assign)bool hasPaly;
@end @implementation MyApp - (instancetype)init
{
self = [super init];
if (self) {
UnityRegisterAppDelegateListener(self);
UnityRegisterViewControllerListener(self);
}
_hasPaly = FALSE;
return self;
} - (void)viewDidAppear:(NSNotification *)notification{ if(_hasPaly == false){
_hasPaly = true;
NSLog(@"------------------------"); NSURL *url = [[NSBundle mainBundle] URLForResource:@"move.mov" withExtension:nil];
self.pvc = [[AVPlayerViewController alloc] init];
self.pvc.player = [AVPlayer playerWithURL:url]; UIView* unityView = UnityGetGLViewController().view;
CGSize s = unityView.bounds.size;
self.pvc.view.frame = CGRectMake(0,0,s.width, s.height);
[unityView addSubview:self.pvc.view];
self.pvc.showsPlaybackControls = false;//关闭控制器,用户不能操作
[self.pvc.player play];
//[UnityGetGLViewController() presentViewController:self.pvc animated:NO completion:nil];
//[UnityGetGLViewController() addChildViewController:self.pvc];
[NSTimer scheduledTimerWithTimeInterval:6 repeats:false block:^(NSTimer *time){
[self.pvc.player pause];
[self.pvc.view removeFromSuperview];
[self.pvc dismissViewControllerAnimated:NO completion:nil];
//[UnityGetGLViewController() dismissViewControllerAnimated:false completion:nullptr];
}];
}
}
@end IMPL_APP_CONTROLLER_SUBCLASS(MyApp) //代码写的很烂,不会。我要在视屏没有播完把视屏给关了,各种问题啊,要么控制器不能关闭,第一次正常,关了App第二次就不行,这是我改的
最后一版,能用,慎用,unity有播放视屏的我抽空看看。

这个类的结尾一定要是mm,父类有c++代码

视屏考进来时放iPhone 项目里,不是UnityFrameWork 项目

iOS Unity 项目解析的更多相关文章

  1. iOS swift项目IM实现,从长连接到数据流解析分析之Socket

    iOS  swift项目IM实现,从长连接到底层数据解析分析之Socket 一:项目简介:  去年开始接手了一个国企移动项目,项目的需求是实现IM即时通讯功能. * 一期版本功能包括了:       ...

  2. iOS - JSON 数据解析

     iOS - JSON 数据解析 前言 NS_CLASS_AVAILABLE(10_7, 5_0) @interface NSJSONSerialization : NSObject @availab ...

  3. 直接拿来用!最火的iOS开源项目

    1. AFNetworking 在众多iOS开源项目中,AFNetworking可以称得上是最受开发者欢迎的库项目.AFNetworking是一个轻量级的iOS.Mac OS X网络通信类库,现在是G ...

  4. (转)直接拿来用!最火的iOS开源项目(一)

    1. AFNetworking 在众多iOS开源项目中,AFNetworking可以称得上是最受开发者欢迎的库项目.AFNetworking是一个轻量级的iOS.Mac OS X网络通信类库,现在是G ...

  5. 【转】GitHub平台最火的iOS开源项目——2013-08-25 17

    http://www.cnblogs.com/lhming/category/391396.html 今天,我们将介绍20个在GitHub上非常受开发者欢迎的iOS开源项目,你准备好了吗? 1. AF ...

  6. iOS开源项目

    在结束了GitHub平台上“最受欢迎的Android开源项目”系列盘点之后,我们正式迎来了“GitHub上最受欢迎的iOS开源项目”系列盘点.今天,我们将介绍20个在GitHub上非常受开发者欢迎的i ...

  7. GitHub上最火的40个iOS开源项目

    1. AFNetworking 在众多iOS开源项目中,AFNetworking可以称得上是最受开发者欢迎的库项目.AFNetworking是一个轻量级的iOS. Mac OS X网络通信类库,现在是 ...

  8. 直接拿来用!最火的iOS开源项目(一)

    直接拿来用!最火的iOS开源项目(一) 发表于2013-06-05 10:17| 39373次阅读| 来源CSDN| 100 条评论| 作者唐小引 iOS开源项目GitHub移动开发最受欢迎的开源项目 ...

  9. GitHub上最受欢迎的iOS开源项目TOP20

    AFNetworking 在众多iOS开源项目中,AFNetworking可以称得上是最受开发者欢迎的库项目.AFNetworking是一个轻量级的iOS.Mac OS X网络通信类库,现在是GitH ...

  10. Unity项目开发过程中常见的问题,你遇到过吗?

    最近看到有朋友问一个unity游戏开发团队,需要掌握哪些知识之类的问题.事实上Unity引擎是一个很灵活的引擎,根据团队开发游戏类型的不同,对人员的要求也有差异,所以不能一概而论.但是,一些在Unit ...

随机推荐

  1. 【阿里云ACP】-03(数据库RDS)

    OSS快速使用入门:创建Bucket 1.用户创建一个Bucket时,可以根据费用单价.请求来源分布.响应延迟等方面的考虑,为该bucket选择所在的数据中心 阿里云所有数据中心都提供OSS公众服务 ...

  2. echarts——横向柱状堆叠图

    var data = { data: [[320], [120], [220], [150]], legend: ['华为', '中兴', '烽火', '瑞斯'], } var option; var ...

  3. HTML基础知道了解

    第1章 Html介绍 1.Html和CSS的关系 1.1 学习web前端开发基础技术需要掌握:HTML.CSS.JavaScript语言.下面我们就来了解下这三门技术都是用来实现什么的: 1.2 HT ...

  4. win10事件查看器出现10016错误的解决办法

    该错误一般会重复出现在事件查看器,严重的会导致系统卡死. 以解决下列错误为例,给出步骤: 注意记录用户(划掉的部分)及要添加的权限(本例为"本地激活"权限) 1.运行regedit ...

  5. div css 页面中心弹窗窗口

    <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8&quo ...

  6. Vue 更改数组中的值,页面不刷新问题。解决方法+原理说明

    一.Vue 更改数组中的值,页面不刷新问题 data{ hobby:["打游戏","想静静","发呆"] } 1.错误写法(页面不刷新): ...

  7. Color the ball HDU - 1556 _差分

    N名同学拍成一排,编号为1,2,3,4 -- N.现在有一位老师需要检查所有同学的出勤情况,他会进行点名,每次给出两个数a,b,并且保证a小于等于b,这个区间内的所有同学都会被点名一次,老师会进行N次 ...

  8. 解决idea不能自动下载maven配置文件pom.xml下的jar包依赖的问题

    表现:无法下载pom配置文件中的依赖包,或只能下载少数包,各项配置都正确的情况 理由未知: 百度了很长一段时间,网上给出比较精准的解决之一是 setting>>maven>>去 ...

  9. C++实现单链表相关操作

    #include<iostream>#include<cstdlib>//C++动态分配存储空间using namespace std;#define OK 1#define ...

  10. Java流程控制之for循环

    for循环[重点] 虽然所有的循环结构都可以用while或者do...while表示,但Java提供了另一种语句--for循环,使一些循环结构变得更加简单. for循环语句是支持迭代的一种通用结构,是 ...