IOS(XCode)嵌入Unity模块
今天下午明明要弄明白Android Studio出AAR给Unity用的,结果发现好多问题,小黑心里苦啊,整不明白了呀,让我做Unity吧。。。
好了,废话不给大家多说了,今天小黑给大家带来,如何在IOS原生中,嵌入Unity模块。
目录
1、打开Unity-iPhone.xcodeproj文件,并且编写相关交互文件
IOS(XCode)嵌入Unity模块
版本:
1、Unity:2020.3.11f1
2、XCode:12.5(12E262)
1、Unity端准备自己相应的工程文件。
1、搭建简单场景

2、创建并且编写脚本
既然要嵌入嘛,那就肯定有交互的啊,所以我们一次性把交互内容也写了。
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using UnityEngine;
using UnityEngine.UI;
public class InteractionIos : MonoBehaviour
{
public Toggle _Open;
public Button _CallIOS;
private bool _isOpen;
private float _rotationValue = 0.005f;
// Start is called before the first frame update
void Start()
{
Application.targetFrameRate= 60;
_Open.onValueChanged.AddListener((s) => {
changeRotation();
});
_CallIOS.onClick.AddListener(() =>
{
NativeMethod("Unity`s Message.");
});
}
// Update is called once per frame
void Update()
{
if (_isOpen)
{
transform.RotateAround(Vector3.up, _rotationValue);
}
else
transform.RotateAround(Vector3.up, -_rotationValue);
}
private void changeRotation()
{
_isOpen = !_isOpen;
}
#region InteractionIOS
#if UNITY_IOS
/// <summary>
/// 调用IOS函数
/// </summary>
/// <param name="msg">参数</param>
[DllImport("__Internal")]
internal extern static void NativeMethod(string msg);
public void UnityMethod(string msg)
{
Debug.LogWarning("来自ios端的参数为:" + msg);
_Open.isOn = !_Open.isOn;
}
#endif
#endregion
}
3、挂载脚本
注意事项:
①、IOS再与Unity交互中,是通过UnityPlayer.UnitySendMessage(物体名 , 函数名 , 参数 );所以场景中的名字要记住,本文中交互代码挂载到了Cube上,其下边交互函数为ChangeRotation。
②、构建框架要选择ARM64
③、我们的代码涉及到[DllImport("__Internal")]时,一定要加上宏定义UNITY_IOS,在XCode中它会进行预编译,如果我们还没有编写相关脚本的时候会给我i们报错,报错内容就是缺少我们所要要交互的函数。

4、打包发布Unity为IOS工程
打包发布为IOS原生开发文件。
2、双击打开.xcodeproj文件
1、打开Unity-iPhone.xcodeproj文件,并且编写相关交互文件


这个具体实现类名没什么要求,但是函数名一定要与你在Unity中定义的相同。
还有就是,如果你是一名IOS工程师,那h文件或者m文件你自己随便定义。
如果和小黑一样,非IOS工程师,那么就怪怪的把m后缀改为mm,这样就可以混写C和C++了。
然后用C声明函数,实现函数就好了。
//
// InteractionIOS.m
// Unity-iPhone
//
// Created by h_Admin on 2021/6/19.
//
#import <Foundation/Foundation.h>
extern "C"{
void NativeMethod(const char* msg);
}
//用来接收Unity传递来的消息
void NativeMethod(const char* msg){
NSString* str = [[NSString alloc] initWithUTF8String:msg];
NSLog(@"IOS接到信息为:");
NSLog(str);
}
到现在,我们Unity 调用 IOS 的内容就全部编写完成了。
接下来我们去写IOS 调用 Unity 的内容;
首先找到Unity在XCode中的主入口,UnityAppController.h/m文件:

然后我们照猫画虎,现在.h文件中声明我们要用到的UI组件和按钮事件

接着我们在.m文件中赋值,实现内容。
代码如下:
.h文件中要添加的内容为:
//-----------------------------------Unity-----------------------------------
UIView* _TestViewPanel;
UIButton* _ButtonUnity;
//-----------------------------------Unity-----------------------------------
//-----------------------------------Unity-----------------------------------
-(void) TestView;
//-----------------------------------Unity-----------------------------------
在.m文件中要添加的内容为:
//在didFinishLaunchingWithOptions函数中:
_ButtonUnity = [[UIButton alloc] initWithFrame:CGRectMake(10.0f , 20.0f, 90.0f, 20.0f)];
_ButtonUnity.backgroundColor = UIColor.redColor;
[_ButtonUnity setTitle: @"button" forState:UIControlStateNormal];
[_ButtonUnity setTitle: @"OnPress" forState:UIControlStateHighlighted];
[_ButtonUnity addTarget:self action: @selector((TestView)) forControlEvents:UIControlEventTouchDown];
[_unityView addSubview:_ButtonUnity]
//在didFinishLaunchingWithOptions函数外:
//Cube为场景中挂载脚本的物体名称,UnityMethod为函数名称,最后边的为参数
-(void) TestView{
UnitySendMessage("Cube", "UnityMethod", "IOS传递参数了");
}
至此,一切就绪,我们准备打包发布。
2、选择证书,Command + R 发布 至真机测试

于是XCode会提示信息:Could not launch “XXXXX

因为当我们的软件第一次发布至手机时,手机系统会提示:不受信任的开发者,我们需要去设置一下。

如何设置?在手机 设置 -> 通用 -> 设备管理 -> 信任



现在,我们接着Command + R发布,于是成功了!
让我们来看看结果
通过代码我们知道,红色背景button按钮为IOS原生按钮,而后方的Unity Call IOS 为Unity的UGUI,我们分别点击。

红色区域框选的为Unity给IOS发消息
蓝色区域框选的为IOS给Unity发消息

至此,Unity嵌入IOS原生,已圆满完成。
唠家常
- 小黑的今日分享结束啦,小伙伴们你们get到了么,你们有没有更好的办法呢,可以评论区留言分享,也可以加小黑的QQ:841298494,大家一起进步。
今日无推荐
- 客官,看完get之后记得点赞哟!
- 小伙伴你还想要别的知识?好的呀,分享给你们
- 小黑的杂货铺,想要什么都有,客官不进来喝杯茶么?
IOS(XCode)嵌入Unity模块的更多相关文章
- iOS端给unity发送消息,实现两者交互。
上一篇我们简单说了一下unity发消息给iOS端.现在我们就来说一下iOS端给unity发送消息的简单使用. 首先iOS端做得事情其实很简单就一句话,直接上代码 /** * 第一个参数:是unity那 ...
- [转]phonegap 2.9 IOS Xcode 搭建环境
phonegap 2.9 IOS Xcode 搭建环境 一:下载phoneGap2.9和安装Xcode5(目前最新版) 选择2.9是因为3.0以上坑爹版本编译神马的要在有网络情况. 二: 下载ph ...
- iOS Xcode及模拟器SDK下载
原文: Xcode及模拟器SDK下载 如果你嫌在 App Store 下载 Xcode 太慢,你也可以选择从网络上下载: Xcode下载(Beta版打的包是不能提交到App Store上的) 绝对官方 ...
- iOS/Xcode异常:no visible @interface for XXX declares the selector YYY
在iOS/Xcode开发过程中,出现如下异常信息: no visible @interface for XXX declares the selector YYY 分析原因: There are lo ...
- [HMLY]6.iOS Xcode全面剖析
一.创建一个新工程 1.第一步打开Xcode,找到Xcode程序图标并点击 2.如下界面,我们点击新建一个项目,即第二项 (1).Get started with a playground playg ...
- iOS Xcode全面剖析
链接:http://www.jianshu.com/p/3c8527898e84 一.创建新一个工程二.Xcode界面详细介绍三.Xcode菜单详解四.Xcode快捷键介绍五.结语六.参考资料 前言 ...
- iOS—Xcode 7真机测试
Xcode 7真机测试详解 1.准备 注意:一定要让你的真机设备的系统版本和app的系统版本想对应,如果不对应就会出现一个很常见的问题:could not find developer disk im ...
- iOS XCode启用/关闭Clang Warnings
前言:warnings是编码中很重要的一个环节,编译器给出合理的warning能帮助开发者找到自己代码的问题,防止很多bug产生. 默认用XCode创建一个工程,会自动开启一些重要的warnings ...
- iOS - Xcode 配置
1.Xcode 配置 1.1 OS X 1)main 文件注释修改路径: /Applications(应用程序) ▸ Xcode.app ▸ Contents ▸ Developer ▸ Librar ...
- iOS之小功能模块--彩虹动画进度条学习和自主封装改进
前言: 首先展示一下这个iOS小示例的彩色进度条动画效果: 阅读本文先说说好处:对于基础不好的读者,可以直接阅读文末尾的"如何使用彩虹动画进度条"章节,然后将我封装好的这个功能模块 ...
随机推荐
- Sublime Text 修改默认语言为Python
Sublime Text 3 修改默认语言为Python 步骤如下 英文:Tools - Developer - New Plugin 中文:工具 - 插件开发 - 新建插件 清空原来内容,用下面的代 ...
- 怎么样子盒子能撑起父盒子?浮动,BFC,边距重叠
怎么样子盒子能撑起父盒子? 从行内元素跟块元素来看: 一般情况下,行内元素只能包含数据和其他行内元素. 而块级元素可以包含行内元素和其他块级元素. 块级元素内部可以嵌套块级元素或行内元素. 建议行内元 ...
- SpringBoot 解决跨域问题代码
package com.example.demo.gs; import org.springframework.context.annotation.Configuration; import jav ...
- Vivado_8位流水灯
Design 代码中的计数器设置是因为我的开发板的时钟是100MHZ的,也就是1秒完成了100_000_000次时钟信号,所以我设置计数器为100_000_000次. 也就是说,我让流水灯的变化周期为 ...
- 硬核剖析Java锁底层AQS源码,深入理解底层架构设计
我们常见的并发锁ReentrantLock.CountDownLatch.Semaphore.CyclicBarrier都是基于AQS实现的,所以说不懂AQS实现原理的,就不能说了解Java锁. 上篇 ...
- CLR、CLS、CTS概述
在学习.NET的过程中,都会不可避免地接触到这三个概念,那么这三个东西是什么以及它们之间的关系是怎样的呢?任何编程语言,如果想要在.NET CLR上执行,就必需提供一个编译器,将此语言的程序编译成.N ...
- 如何正确遵守 Python 代码规范
前言 无规矩不成方圆,代码亦是如此,本篇文章将会介绍一些自己做项目时遵守的较为常用的 Python 代码规范. 命名 大小写 模块名写法: module_name 包名写法: package_name ...
- Go语言核心36讲08
在上一篇文章,我们一直都在围绕着可重名变量,也就是不同代码块中的重名变量,进行了讨论. 还记得吗?最后我强调,如果可重名变量的类型不同,那么就需要引起我们的特别关注了,它们之间可能会存在"屏 ...
- 二叉树总结——BiTree
在C++编译器下可直接运行 #include <stdio.h> #include <malloc.h> //算法思想:先读入根结点数据,并且创建根结点,在读入左子树数据并创建 ...
- 【云原生 · Kubernetes】部署kube-apiserver集群
个人名片: 因为云计算成为了监控工程师 个人博客:念舒_C.ying CSDN主页️:念舒_C.ying 部署kube-apiserver集群 10.1 创建kube-apiserver 证书 10 ...