IOS(XCode)嵌入Unity模块

news/2024/7/20 22:12:14 标签: xcode, ios, c#, unity, unity3d

       今天下午明明要弄明白Android Studio出AAR给Unity用的,结果发现好多问题,小黑心里苦啊,整不明白了呀,让我做Unity吧。。。

好了,废话不给大家多说了,今天小黑给大家带来,如何在IOS原生中,嵌入Unity模块。

目录

IOS(XCode)嵌入Unity模块

版本:

1、Unity端准备自己相应的工程文件。

1、搭建简单场景

2、创建并且编写脚本

3、挂载脚本

4、打包发布Unity为IOS工程

xcodeproj%E6%96%87%E4%BB%B6-toc" style="margin-left:40px;">2、双击打开.xcodeproj文件

xcodeproj%E6%96%87%E4%BB%B6%EF%BC%8C%E5%B9%B6%E4%B8%94%E7%BC%96%E5%86%99%E7%9B%B8%E5%85%B3%E4%BA%A4%E4%BA%92%E6%96%87%E4%BB%B6-toc" style="margin-left:80px;">1、打开Unity-iPhone.xcodeproj文件,并且编写相关交互文件

2、选择证书,Command + R 发布 至真机测试

唠家常

今日无推荐


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原生开发文件。


xcodeproj%E6%96%87%E4%BB%B6">2、双击打开.xcodeproj文件

xcodeproj%E6%96%87%E4%BB%B6%EF%BC%8C%E5%B9%B6%E4%B8%94%E7%BC%96%E5%86%99%E7%9B%B8%E5%85%B3%E4%BA%A4%E4%BA%92%E6%96%87%E4%BB%B6">1、打开Unity-iPhone.xcodeproj文件,并且编写相关交互文件

这个具体实现类名没什么要求,但是函数名一定要与你在Unity中定义的相同。

还有就是,如果你是一名IOS工程师,那h文件或者m文件你自己随便定义。

如果和小黑一样,非IOS工程师,那么就怪怪的把m后缀改为mm,这样就可以混写CC++了。

然后用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之后记得点赞哟!
  • 小伙伴你还想要别的知识?好的呀,分享给你们😄
  • 小黑的杂货铺,想要什么都有,客官不进来喝杯茶么?

http://www.niftyadmin.cn/n/1582039.html

相关文章

Android原生集成JPush SDK

因为小黑是一名Unity开发&#xff0c;所以Android Studio上有写的不对的地方请大佬们指出&#xff0c;再集成的时候&#xff0c;有问题的或者疑问的也可以直接提出。 目录 使用版本&#xff1a; 接入JPush SDK 一&#xff1a;下载JPush的SDK 1、注册极光推送官网账号&…

分块烘焙 + 动态挂载光照贴图

由于小黑还是刚接触渲染和烘焙的小菜鸡&#xff0c; 有大佬看到该文章请给予指点&#xff0c;拜谢。 基于&#xff1a;URP &#xff08;轻量级渲染管线&#xff09; HDRP&#xff0c;我觉得应该是更没有问题的&#xff0c;毕竟专业的 Built-In&#xff0c;经过测试没有问题…

Unity - 无限滚动

今天学习&#xff1a;Unity - UGUI - 无限滚动 目录 今天学习&#xff1a;Unity - UGUI - 无限滚动 版本&#xff1a; 一&#xff1a;思路分享&#xff08;Share idea&#xff09; 二&#xff1a;脚本编写&#xff08;Scripts&#xff09; 三&#xff1a;场景面板布置&am…

Unity之GPS定位(腾讯sdk)

Unity之GPS定位&#xff08;腾讯sdk&#xff09; 目录 Unity之GPS定位&#xff08;腾讯sdk&#xff09; 前言 Unity版本及使用插件 正题 编写脚本 Run运行&#xff0c; 跑起来就行&#xff0c;具体要什么&#xff0c;去相关类找就好了。 没有腾讯地图SDK的Key&#xff…

Json转C#实体类

Json转C#实体类 刚才发布了一篇地理位置逆解析&#xff0c;其中就用到了我们这篇博客的知识&#xff0c;于是我单独拿出来记录一下&#xff0c;以后好随时用。案例在这里&#xff1a;GPS定位逆解析 实现方案是这样的&#xff1a; 先把获取到的json字符串通过JsonConvert.Des…

GPS定位解决偏差

目录 GPS定位解决偏差 开篇 实践 1、解决思路以及步骤 2、实践出真理&#xff01; 3、上坐标系之间的代码。 希望大家&#xff1a;点赞&#xff0c;留言&#xff0c;关注咯~ &#x1f618;&#x1f618;&#x1f618;&#x1f618; 唠家常 今日推荐都在文章中了…

Xcode找不到.h或者.m文件解决办法 .h file not found

Xcode找不到.h或者.m文件解决办法 .h file not found 开篇唠叨 小黑最经又开始干iOS接入微信SDK了&#xff0c;目前刚开始就遇到了困难&#xff0c;于是总结一下分享给大家&#xff0c;要是大家看完了还解决不了&#xff0c;那就多搜搜吧&#xff0c;最后解决了记得告诉小黑…

用XAMPP搭建本地:Web服务器,访问服务器,下载服务器。

用XAMPP搭建本地&#xff1a;Web服务器&#xff0c;访问服务器&#xff0c;下载服务器。 首先需要下载XAMPP&#xff0c;链接为&#xff1a;XAMPP下载地址&#xff0c;XAMPP中文网。 下载完成后进行安装&#xff0c;直接一键点到底。 一、如何确定我们安装完成了&#xff1f…