在unity中打开ios_unity中打开ios的浏览器 - CSDN
  • 在unity中新建类Open,记得引用 System.Runtime.InteropServices; using UnityEngine; using System.Collections; using System.Runtime.InteropServices; public class Open : MonoBehaviour { ...
    在unity中新建类Open,记得<span style="font-family: Arial, Helvetica, sans-serif;">引用 System.Runtime.InteropServices; </span><pre name="code" class="csharp">
    
    
    
    using UnityEngine;
    using System.Collections;
    using System.Runtime.InteropServices; 
    
    public class Open : MonoBehaviour {
    
    	[DllImport("__Internal")]  
    	private static extern void OpenA (); 
    
    	[DllImport("__Internal")]  
    	public static extern void OpenB (); 
    
    	[DllImport("__Internal")]  
    	public static extern void OpenC (); 
    
    	[DllImport("__Internal")]
    	private static extern int getNum();
    
    	public void ClickButtonA(){
    		OpenA ();
    	}
    
    	public void ClickButtonB(){
    		OpenB ();
    	}
    
    	public void ClickButtonC(){
    		OpenC ();
    	}
    }
    
    
    
    在项目中Assets/<span style="font-family: Arial, Helvetica, sans-serif;">Plugins/iOS 下添加.mm文件</span>


    //
    //  OpenApp.m
    //  
    //
    //  Created by apple on 16/7/12.
    //
    //
    
    #import <Foundation/Foundation.h>
    
    extern "C"{
        void OpenA(){//打开自定义url的app,与object-c中url写法稍有不同(<span class="s1" style="font-family: Arial, Helvetica, sans-serif;">@"aaa11://%@"</span><span style="font-family: Arial, Helvetica, sans-serif;">)</span>
            NSURL *url = [NSURL URLWithString:@"aaa11://"];
            [[UIApplication sharedApplication] openURL:url];
        }
        
        void OpenB(){
            NSURL *url = [NSURL URLWithString:@"https://itunes.apple.com/cn/app/wechat/id836500024?mt=12//"];
            [[UIApplication sharedApplication] openURL:url];
        }
        
        void OpenC(){//经ios9.2设备测试,这两种方式打开app前都要经过app store
    //        NSURL *url = [NSURL URLWithString:@"https://itunes.apple.com/cn/app/ai-qi-yihd-wo-qu-shang-xue/id409563112?mt=8//"];
    //        [[UIApplication sharedApplication] openURL:url];
            
            
              NSURL *url = [NSURL URLWithString:@"itms-apps://itunes.apple.com/cn/app/ai-qi-yihd-wo-qu-shang-xue/id409563112?mt=8//"];
              [[UIApplication sharedApplication] openURL:url];
            
        }
        
    }

    展开全文
  • using System.Runtime.InteropServices; //记得引用这个命名空间 Unity端using ...public class SDKISOAPP : MonoBehaviour{ //导出按钮以后将xcode项目生成这个按钮的注册, //这样就可以xocd...


    using System.Runtime.InteropServices; //记得引用这个命名空间 

    1、Unity端

    using UnityEngine;

    using System.Runtime.InteropServices;

    public class SDKISOAPP  : MonoBehaviour{

        //导出按钮以后将在xcode项目中生成这个按钮的注册,
        //这样就可以在xocde代码中实现这个按钮点击后的事件。//IOS中注册的格式都是这样的:[DllImport("__Internal")]

        [DllImport("__Internal")]
        private static extern void _PressButtonGoogleTranslate();

        [DllImport("__Internal")]
        private static extern void _PressButtonBaiduMap();

        public static void ActivateButtonGoogleTranslate() {
            if (Application.platform != RuntimePlatform.OSXEditor){
                //点击按钮后调用xcode中的 _PressButton0 ()方法,
                //方法中的内容须要我们自己来添加
                _PressButtonGoogleTranslate();
            }
        }

        public static void ActivateButtonBaiduMap() {
            if (Application.platform != RuntimePlatform.OSXEditor){
                //点击按钮后调用xcode中的 _PressButton0 ()方法,
                //方法中的内容须要我们自己来添加
                _PressButtonBaiduMap();
            }
        }

    }



    2、iOS端

    XCode .h 文件


    #ifndef MyView_h

    #define MyView_h



        extern void _PressButtonGoogleTranslate();


        extern void _PressButtonBaiduMap();



    #endif /* MyView_h */




    XCode .m 文件



    #import <Foundation/Foundation.h>

    #import "MyView.h"

        

    @implementation MyView

        

    void _PressButtonGoogleTranslate() {

        //创建一个url,这个url就是WXApp的url,记得加上://

        NSURL *url = [NSURL URLWithString:@"googletranslate://"];

        //打开url

        [[UIApplication sharedApplication] openURL:url];

    }


    void _PressButtonBaiduMap() {

        //创建一个url,这个url就是WXApp的url,记得加上://

        NSURL *url = [NSURL URLWithString:@"baidumap://"];

        //打开url

        [[UIApplication sharedApplication] openURL:url];

    }


    @end


    把建好的文件拖入 Unity 工程,一起打包即可

    或者Unity打包完在XCode里面添加即可


    常用的 iOS APP URL schemes 参见:https://blog.csdn.net/u014361280/article/details/80662723

    苹果app(iOS app)比较常用的URL schemes,可以用于iOS应用间相互调用


    展开全文
  • Unity5.5.0f1调用IOS/Android原生接口打开移动端图库或者相机,选择图片后保存在Unity目录,然后Unity加载显示。
  • Unity3d 调用IOS相册

    2019-03-04 09:19:39
    Unity3d 调用IOS相册Unity3d 调用IOS相册软件环境.h/ .m文件编写unity3d 调用脚本合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定...

    Unity3d 调用IOS相册

    最近在做项目的时候需要调用IOS相册,作为IOS小白的我也试了下,中间也遇到一些坑,最后还是弄好打包真机测试成功,虽然做出来很快,但是要真的弄清Ios和Unity3d的互通消息机制还是需要慢慢摸索的。

    软件环境

     1.Unity3d 2018.3.0f2
     2.Xcode10.1
    

    .h/ .m文件编写

    在U3d Assets下面的Plugins\IOS下面创建IOSCameraController.h 和IOSCameraController.m文件。创建可以先创建文本然后更改后缀名。
    IOSCameraController.h文件

     //import 引用头文件 相当远Using 
    #import<QuartzCore/CADisplayLink.h>
    //声明一个IOSCameraController类  继承自UIViewController <>里面是是协议/代理的调用声明 可以理解为c#的接口
    @interface IOSCameraController : UIViewController<UIImagePickerControllerDelegate,UINavigationControllerDelegate>
    @end
    

    IOSCameraController.m文件

    #import "IOSCameraController.h"
    @implementation IOSCameraController
    -(void)OpenTarget:(UIImagePickerControllerSourceType)type{
       //创建UIImagePickerController实例
       UIImagePickerController *picker;
       picker= [[UIImagePickerController alloc]init];
       //设置代理
       picker.delegate = self;
       //是否允许编辑 (默认为NO)
       picker.allowsEditing = YES;
       //设置照片的来源
       // UIImagePickerControllerSourceTypePhotoLibrary,      // 来自图库
       // UIImagePickerControllerSourceTypeCamera,            // 来自相机
       // UIImagePickerControllerSourceTypeSavedPhotosAlbum   // 来自相册
       picker.sourceType = type;
       
       //这里需要判断设备是iphone还是ipad  如果使用的是iphone并没有问题 但是如果 是在ipad上调用相册获取图片 会出现没有确定(选择)的按钮 所以这里判断
       //了一下设备,针对ipad 使用另一种方法 但是这种方法是弹出一个界面 并不是覆盖整个界面 需要改进 试过另一种方式 重写一个相册界面 
       //(QQ的ipad选择头像的界面 就使用了这种方式 但是这里我们先不讲 (因为我也不太懂 但是我按照简书的一位老哥的文章写出来了 这里放一下这个简书的链接
       //https://www.jianshu.com/p/0ddf4f7476aa)
       if (picker.sourceType == UIImagePickerControllerSourceTypePhotoLibrary &&[[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
           // 设置弹出的控制器的显示样式
           picker.modalPresentationStyle = UIModalPresentationPopover;
           //获取这个弹出控制器
           UIPopoverPresentationController *popover = picker.popoverPresentationController;
           //设置代理
           popover.delegate = self;
           //下面两个属性设置弹出位置
           popover.sourceRect = CGRectMake(0, 0, 0, 0);
           popover.sourceView = self.view;
           //设置箭头的位置
           popover.permittedArrowDirections = UIPopoverArrowDirectionAny;
           //展示选取照片控制器
           [self presentViewController:picker animated:YES completion:nil];
       } else {
           //展示选取照片控制器
           [self presentViewController:picker animated:YES completion:^{}];
       }
      
    }
    //选择完成,点击界面中的某个图片或者选择(Choose)按钮时触发
    -(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info{
       //关闭界面
       [picker dismissViewControllerAnimated:YES completion:^{}];
       //得到照片
       UIImage *image = [info objectForKey:@"UIImagePickerControllerEditedImage"];
       if (image == nil) {
           image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
       }
       //有些时候我们拍照后经常发现导出的照片方向会有问题,要么横着,要么颠倒着,需要旋转才适合观看。但是在ios设备上是正常的
       //所以在这里处理了图片  让他旋转成我们需要的
       if (image.imageOrientation != UIImageOrientationUp) {
       //图片旋转
           image = [self fixOrientation:image];
       }
       //获取保存图片的地址
       NSString *imagePath = [self GetSavePath:@"Temp.jpg"];
       //保存图片到沙盒路径 对应unity中的Application.persistentDataPath 之后我们取图片就需要在这个路径下取  这是一个可读可写的路径
       [self SaveFileToDoc:image path:imagePath];
    }
    //获取保存文件的路径 如果有返回路径 没有创建一个返回
    -(NSString*)GetSavePath:(NSString *)filename{
       NSArray *pathArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
       NSString *docPath = [pathArray objectAtIndex:0];
       return [docPath stringByAppendingPathComponent:filename];
    }
    //将图片保存到沙盒路径
    -(void)SaveFileToDoc:(UIImage *)image path:(NSString *)path{
       NSData *data;
       if (UIImagePNGRepresentation(image)==nil) {
           data = UIImageJPEGRepresentation(image, 1);
       }else{
           data = UIImagePNGRepresentation(image);
       }
       [data writeToFile:path atomically:YES];
       //保存之后通知unity 执行对应的回调 
       //UnitySendMessage 是用来给unity发消息的  有三个参数 1.挂载对应回调脚本的物体名 2.回调函数的名称 3.对应回调上的参数
       UnitySendMessage("Canvas", "Message", "Temp.jpg");
    }
    #pragma mark 图片处理方法
    //图片旋转处理
    - (UIImage *)fixOrientation:(UIImage *)aImage {
       CGAffineTransform transform = CGAffineTransformIdentity;
       
       switch (aImage.imageOrientation) {
           case UIImageOrientationDown:
           case UIImageOrientationDownMirrored:
               transform = CGAffineTransformTranslate(transform, aImage.size.width, aImage.size.height);
               transform = CGAffineTransformRotate(transform, M_PI);
               break;
               
           case UIImageOrientationLeft:
           case UIImageOrientationLeftMirrored:
               transform = CGAffineTransformTranslate(transform, aImage.size.width, 0);
               transform = CGAffineTransformRotate(transform, M_PI_2);
               break;
               
           case UIImageOrientationRight:
           case UIImageOrientationRightMirrored:
               transform = CGAffineTransformTranslate(transform, 0, aImage.size.height);
               transform = CGAffineTransformRotate(transform, -M_PI_2);
               break;
           default:
               break;
       }
       
       switch (aImage.imageOrientation) {
           case UIImageOrientationUpMirrored:
           case UIImageOrientationDownMirrored:
               transform = CGAffineTransformTranslate(transform, aImage.size.width, 0);
               transform = CGAffineTransformScale(transform, -1, 1);
               break;
               
           case UIImageOrientationLeftMirrored:
           case UIImageOrientationRightMirrored:
               transform = CGAffineTransformTranslate(transform, aImage.size.height, 0);
               transform = CGAffineTransformScale(transform, -1, 1);
               break;
           default:
               break;
       }
       
       // Now we draw the underlying CGImage into a new context, applying the transform
       // calculated above.
       CGContextRef ctx = CGBitmapContextCreate(NULL, aImage.size.width, aImage.size.height,
                                                CGImageGetBitsPerComponent(aImage.CGImage), 0,
                                                CGImageGetColorSpace(aImage.CGImage),
                                                CGImageGetBitmapInfo(aImage.CGImage));
       CGContextConcatCTM(ctx, transform);
       switch (aImage.imageOrientation) {
           case UIImageOrientationLeft:
           case UIImageOrientationLeftMirrored:
           case UIImageOrientationRight:
           case UIImageOrientationRightMirrored:
               // Grr...
               CGContextDrawImage(ctx, CGRectMake(0,0,aImage.size.height,aImage.size.width), aImage.CGImage);
               break;
               
           default:
               CGContextDrawImage(ctx, CGRectMake(0,0,aImage.size.width,aImage.size.height), aImage.CGImage);
               break;
       }
       // And now we just create a new UIImage from the drawing context
       CGImageRef cgimg = CGBitmapContextCreateImage(ctx);
       UIImage *img = [UIImage imageWithCGImage:cgimg];
       CGContextRelease(ctx);
       CGImageRelease(cgimg);
       return img;
    }
    @end
    //由于C++编译器需要支持函数的重载,会改变函数的名称,因此dll的导出函数通常是标准C定义的。
    //这就使得C和C++的互相调用变得很常见。但是有时可能又会直接用C来调用,不想重新写代码,
    //让标准C编写的dll函数定义在C和C++编译器下都能编译通过,通常会使用以下的格式:(这个格式在很多成熟的代码中很常见)
    #if defined(__cplusplus)
    extern "C" {
    #endif
       //导出接口供unity使用
       void IOS_OpenCamera(){
           IOSCameraController *app = [[IOSCameraController alloc]init];
           UIViewController *vc = UnityGetGLViewController();
           [vc.view addSubview:app.view];
           [app OpenTarget:UIImagePickerControllerSourceTypeCamera];
       }
       void IOS_OpenAlbum(){
           IOSCameraController *app = [[IOSCameraController alloc]init];
           UIViewController *vc = UnityGetGLViewController();
           [vc.view addSubview:app.view];
           [app OpenTarget:UIImagePickerControllerSourceTypePhotoLibrary];
       }
    #if defined(__cplusplus)
    }
    #endif
    

    unity3d 调用脚本IOSAlbumCamera.cs ,开始准备用www加载本地图片,但是好像www和UnityWebRequest,但是这个在IOS上面会报错,具体错误下方贴出,所以用了万能的IO加载

    using UnityEngine;
    using System.Collections;
    using UnityEngine.UI;
    using System.Runtime.InteropServices;
    using UnityEngine.Networking;
    using System.IO;
    
    public class IOSAlbumCamera : MonoBehaviour
    {
       [SerializeField] private Button _openCamera; //打开相机按钮
       [SerializeField] private Button _openAlbum; //打开相册按钮
       [SerializeField] private RawImage _image; //用于显示的图片
       //引入在oc中定义的那两个方法
       [DllImport("__Internal")]
       private static extern void IOS_OpenCamera();
       [DllImport("__Internal")]
       private static extern void IOS_OpenAlbum();
    
       void Awake()
       {
           //为两个button添加点击事件
           _openCamera.onClick.AddListener(IOS_OpenCamera);
           _openAlbum.onClick.AddListener(IOS_OpenAlbum);
       }
       //ios回调unity的函数
       void Message(string filenName)
       {
           Debug.Log("<<<<<<<<<<<<<<<<<<回调>>>>>>>>>>>>>>>>>>>>>>>");
           Debug.Log("fileName:     " + filenName);
           //我们传进来的只是文件名字 这里合成路径
           string filePath = Application.persistentDataPath + "/" + filenName;
           Debug.Log("filePath:         " + filePath);
           //开启一个协程加载图片
    
           double startTime = (double)Time.time;
           //创建文件读取流
           FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
           fileStream.Seek(0, SeekOrigin.Begin);
           //创建文件长度缓冲区
           byte[] bytes = new byte[fileStream.Length];
           //读取文件
           fileStream.Read(bytes, 0, (int)fileStream.Length);
           //释放文件读取流
           fileStream.Close();
           fileStream.Dispose();
           fileStream = null;
    
           //创建Texture
           int width = 300;
           int height = 372;
           Texture2D texture = new Texture2D(width, height);
           texture.LoadImage(bytes);
    
           _image.texture = texture;
    
    
    
    
           //StartCoroutine(HttpGetTexture(filePath));
       }
    
    
       IEnumerator HttpGetTexture(string url)
       {
           Debug.Log("HttpGetTexture1111111111111111111111");
           WWW www = new WWW(url);
    
           if (!www.isDone)
               yield return www;
           else
           {
               Debug.Log("2222222222222222222222222" );
               if (www.error == null)
               {
                   Debug.Log("3333333333333333333333333333333333333");
                   Texture2D texture2D = new Texture2D(128, 128);
                   texture2D.LoadImage(www.bytes);
                   _image.texture = texture2D;
               }
               else
                   Debug.LogError("Error:    " + www.error);
           }
       }
    }
    

    导出Xcode,打包真机调试。

    1.在Build的时候[图片] MapFileParser.sh: Permission denied

    [图片]错误信息

    解决方法,打开ios的终端,运行chmod +x /Users/ccc/Desktop/Album 下午10.47.06/MapFileParser.sh

    /User后面为MapFileParser.sh 所在的地方,根据自己的地方填写正确。

    2.在真机运行的时候,用www和UnityWebRequest报错,改用IO加载图片。报错的原因是iOS9对应用通讯安全策略进行了升级, 已不再支持http这种不安全的协议,新特性要求App内访问的网络必须使用HTTPS协议。当然也可以使用Http请求,但是需要Info.plist添加文件。但是还是建议跟随时代潮流。

    错误信息

    原始工程链接

    链接: https://download.csdn.net/download/qq_32141141/10988944.

    展开全文
  • 最近公司开始准备弄ios了,这里准备记录一下过程,首先...在unity切换到ios分支的时候,主要看othersetting里面的设定,我打包出iphoneX真机正常运行的设定如下图所示,红框里面是修改需要谨慎的地方。 window...

    最近公司开始准备弄ios了,这里准备记录一下过程,首先来几个比较写的详细到位的博客
    unity与原生iOS项目的整合(一)
    uniity版本更换iOS需要做的几项重复操作(二)
    unity与iOS原生交互的代码(三)
    Unity3D与iOS的交互
    2019最新 iOS Native项目集成Unity3D
    原生iOS嵌入Unity导出的Xcode工程

    这里的unity版本是2018.3 然后XCode版本是11.3.1,自测到Unity2019.1为止,unity出包的ios程序结构都不变,对于ios开发人员来说不需要其他的方法,2019.2之后结构改变了,对于整合到XCode中有些不一样 但是目前的unity版本是2019.3.1f1 ios那边依然是可以放进去做正常运行的
    在unity切换到ios分支的时候,主要看othersetting里面的设定,我打包出在iphoneX真机正常运行的设定如下图所示,红框里面是修改需要谨慎的地方。

    在这里插入图片描述

    在这里插入图片描述

    在windowsPC机上出来的unity工程发给ios开发机,然后当然遇到了一点错误,总的来说按照上面的设置unity打出来的ios工程是没有任何问题的。

    • xcode第一次打开unity的build出来的ios工程的时候,要等xcode对里面的每个文件链接完才能执行在真机创建app的命令,虽然说一般没有链接完直接运行也没什么影响,但是如果工程里面有某些第三方文件的时候,没链接直接运行会导致说某些文件找不到的报错。
    • MapFileParser.sh: Permission denied,其实在unix系统里面MapFileParser.sh这个脚本文件没有赋予权限,需要ios工程师通过cmd命令或者其它方式去赋予这个文件权限。

    tips:
    unity打出来的包分为在真机和在模拟的,真机的包在模拟器运行会出错,模拟器的包在真机运行会出错。
    在othersettings里面的这个地方可以进行更改。在这里插入图片描述
    参考链接:

    Unity3D打包后iOS如何使用模拟器


    交互

    参考链接
    Unity3D与iOS的交互

    unity主动传值给ios的方法和上面的文章是一样的。
    有些特别的地方写一下

    • 返回值没写对没关系 方法名对就可以了
     [DllImport("__Internal")]
     	//这里返回值即使和函数声明不一致,在ios也能找到对应的函数,但是在webgl里面和外界交互写错返回值就会出错了
        private static extern string outputAppendString(string str1, string str2);
    
    • 生成的.m文件在xcode里面改内容是可以正常执行更改后的内容的,不是只能在unity里面的.m里面改好代码
    • 如果在xcode里面的.m里面用c的方式去申请装载字符串的内存,返回字符串给unity后,要进行一下内存的释放,不然会报错。参考链接:Unity 调用oc报错:malloc: *** error for object 0x1ecc0eb0: pointer being freed was not allocated下面的代码是能够正常返回字符串给unity的.m里面的c语言的写法
    • .h和.m文件不一定要在unity里面写好,这点很重要。 因为.h和.m里面本身主要是ios的逻辑,每次在unity里面进行更改的话,都需要重新建xcode工程重新编译耗时耗力,以后就在放好unity打包好的ios工程之后,只需要在xcode里面改了.h和.m文件直接重新运行就可以了
    #import <Foundation/Foundation.h>
    
    char* outputAppendString (char *str1, char *str2)
    {
      NSString *string1 = [[NSString alloc] initWithUTF8String:str1];
      NSString *string2 = [[NSString alloc] initWithUTF8String:str2];
      NSLog(@"###%@", [NSString stringWithFormat:@"%@ %@", string1, string2]);
        
        NSString *sl = @"from ios 1234";
        //内存释放
        char* ret;
        ret = (char*) malloc([sl length] + 1);
        memcpy(ret,[sl UTF8String],([sl length] + 1));
        
        return ret;
    }
    

    ios主动传值给unity的使用方式也是和文章是一样的
    要注意的就是使用UnitySendMessage的时候 参数只能是字符串形式
    要注意就是UnitySendMessage的第二个参数方法名字不能是静态类型的方法不然不起作用


    最后
    发现Strip Engine Code没什么影响,只是勾选后会剔除一些用不到的代码,强制保留的都在Asset下新建的link.xml里面保存了,所以勾选后节省了大约1M的包大小

    展开全文
  • 要实现游戏SDK的接入,首先要解决的是Unity3D与原生IOS代码之间的相互调用问题。Unity使用C#作为开发语言,而IOS采用...为了简化两者之间的接口调用和数据传递,设计UnityIOS SDK之间的接口时,Unity调用SDK只有...

    要实现游戏SDK的接入,首先要解决的是Unity3D与原生IOS代码之间的相互调用问题。Unity使用C#作为开发语言,而IOS采用Objective-C作为开发语言,如何让C#调用OC代码,或者让OC调用C#代码。所幸OC和C#都支持直接嵌入C/C++代码,这里使用C作为两者之间的桥梁。 为了简化两者之间的接口调用和数据传递,在设计Unity与IOS SDK之间的接口时,Unity调用SDK只有一个接口,而SDK调用Unity也只有一个接口。由于平台方的SDK差异性较大,如何保证一个接口可以解决问题?这里我们开发了一个通用SDK层,游戏只会与通用SDK层交互,而由通用SDK层再与具体的平台SDK对接。

    1. 新建xcode工程,导入创建好的AppVest.framework
    2. 创建工具类文件AppVestManager(因为framework中含有c++源码所以需要更改为AppVestManager.mm)
    3. AppVestManager工具类中用c代码实现桥连,使SDK中方法能在unity3d工程中调用 具体代码如下:
    #import "AppVestManager.h"
    #import <AppVest/AppVest.h>
    
    //固定代码
    #if defined(__cplusplus)
    extern "C"{
    #endif
        extern void UnitySendMessage(const char *, const char *, const char *);
        extern NSString* _CreateNSString (const char* string);
    #if defined(__cplusplus)
    }
    #endif
    
    
    @implementation AppVestManager
    // SDK中初始化方法
    -(void)initAppVest{
        [[AppVest new] initAppVest];
    }
    // SDK中启动代理方法(有参数均可以传递参数)
    -(void)startProxy{
        [[AppVest new] startProxy];
    }
    
    #if defined(__cplusplus)
    extern "C"{
    #endif
        
        //字符串转化的工具函数
        
        NSString* _CreateNSString (const char* string)
        {
            if (string)
                return [NSString stringWithUTF8String: string];
            else
                return [NSString stringWithUTF8String: ""];
        }
        
        char* _MakeStringCopy( const char* string)
        {
            if (NULL == string) {
                return NULL;
            }
            char* res = (char*)malloc(strlen(string)+1);
            strcpy(res, string);
            return res;
        }
        
        static AppVestManager *myManager;
        
        //供u3d调用的c函数 ( 因测试的sdk调用初始化为不传参方法,如果调用的sdk需要传参调用,此处应相应修改为含参数方法)
        void initAppVestAndStartIt()
        {
            if(myManager==NULL)
            {
                myManager = [[AppVestManager alloc]init];
            }
            [myManager initAppVest];
            [myManager initAppVest];
        }
        
    #if defined(__cplusplus)
    }
    #endif
    
    @end
    复制代码
    1. 在创建的unity3d工程文件夹下面的Assets文件夹下面新建名为Plugins的新文件夹,并将创建好的AppVestManager工具类拷贝过来

    5.打开unity 3d工程 (1)选择左下方的Assets—>create—>c#Script新建文件名为bridgeProject文件

    (2)创建好之后,点击工程左上角的Main Camera,然后在右下角的Add Component中搜索BridgeProject文件进行添加,实现与Main Canera进行绑定,这样游戏启动起来可以调用该文件中方法,进行测试调用sdk情况

    (3)然后使用MonoDevelop工具打开并编写如下代码,下载Unity3D时候会连带安装(这里为了测试写了一个小按钮)

    代码如下:

    using UnityEngine;
    using System.Collections;
    public class bridgeProject : MonoBehaviour {	
    // Use this for initialization	
    void Start () {		
              print ("this is start");
    // 调用AppVestManager初始化方法,进而调用ocAppVestManager中方法实现Unity3d调用ios SDK		
            AppVestManager.InitSDK ();	
    }		
    // Update is called once per frame	
    void Update () {	
    	}	
    public void OnGUI()  	{   		
    //开始按钮  		
    if(GUI.Button(new Rect(100,100,100,100),"button"))  		
    {   			
             //System.Console.WriteLine("hello world");			
             print("check button to start the appvest !");			
    	    }   
    	}  
     }
    复制代码
    1. 创建unity3d中调用oc代码工具类AppVestManager文件的 AppVestManager文件 (1)选择左下方的Assets—>create—>c#Script新建文件名为AppVestManager文件 (2) AppVestManager中编写代码调用oc方法 (3)initAppVestAndStartIt()该方法为无参数方法,若sdk中需要传参调用,此处应修改为相应含有参数方法
    using UnityEngine;
    using System.Runtime.InteropServices;
    public class AppVestManager : MonoBehaviour {	
    [DllImport("__Internal")]	
    private static extern void initAppVestAndStartIt();
    	//定义接口函数供游戏逻辑调用  	
    public static void InitSDK()  {   	
    if (Application.platform == RuntimePlatform.IPhonePlayer){   			                   initAppVestAndStartIt();	
    	  }   
         } 
      }
    复制代码
    1. 全部文件创建好之后,Assets目录结构如下
      8.按照上篇文章《Unity3D导出为Xcode工程》进行导出为xocde工程,测试调用结果
      9.打开导出后的xcode工程,把AppVest.framework添加进来,然后运行,打断点调试结合log日志显示结果成功调用SDK (其中Plugins文件夹为以C为桥连,实现在unity3d调用ios sdk)

    转载于:https://juejin.im/post/5c88e48ae51d4563c9444cca

    展开全文
  • Unity3d 调用Ios相册,对图片进行剪彩,然后加载图片到Unity3d RawImage上面,为unity3d 2018.3.0工程
  • 项目的要求如下:APP点击3D场景的列表,打开并进入Unity的3D场景页面,然后在Unity中可以点击返回按钮退出Unity页面再次返回到IOS原生应用,前提是同一个APP进行 实现概要如下: 1.从Unity导出IOS工程,...
  • 这里简单,实现一个 Unity for iOS 打开相册、相机及保存图片到相册的功能。主要有两个方面:1、unityios的交互、ios下的objective-c的相关api。具体的看代码吧,有些注释。 以后有时间,再弄一个android版的...
  • 在Unity中新建一个项目,进行如下设置: 新建脚本文件,如下所示: using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class GPSTest : ...
  • 用于Unity打包移动设备的调试,能够简单快速的查看报错等信息 Unity 安卓IOS等移动设备环境下的log查看解决方案
  • 实现Unity界面跳转到iOS界面功能: 第一步,创建C#脚本 using System.Collections; using System.Collections.Generic; using UnityEngine; using System.Runtime.InteropServices; using UnityEngine.UI; public ...
  • 最近需要实现这样一个功能,Unity中打开相机拍照并显示在Unity中。 Android Android部分,参见雨松MOMO的这篇文章: https://www.xuanyusong.com/archives/1480 iOS iOS部分,参见雨松MOMO的这篇文章: ...
  • 最近做一个Unity调用IOS/Android调用原生相机以及相册的项目时,Xcode提示ARC forbids explicit message sendof 'retain' 'retain' is unavailable: not available inautomatic reference counting mode 从字面...
  • 本参考文档将分为两部分,一部分介绍整体流程,一部分参考@ 灵思致远Leansmall 博主的“Unity 发布到IOS的注意事项”,介绍了打包时的须知项。请务必通读须知项。 步骤一:Unity配置Player settings 首先需要编辑...
  • 前言 现在的需求是合并IOS工程和...1.unity导出工程包含几个类库,脚本,需要修改一部分配置,如果ios原生工程是个空项目或者就几个简单页面,那么毫无疑问,是把原生的ios工程导入unity工程,这个非常简单,下一篇...
  • Unity的软键盘输入框IphoneX上第一次打开时,有一半会飞到屏幕外面,研究后发现是因为软键盘输入框计算高度时候没将整个游戏的frame的偏移设置进去,而第一次打开输入框的时候偏移较大,所以飞到界面外面了。...
  • 主要源码摘抄至网上,由于在unity5.1.4上使用不了,于是经过一番调试,使用成功了,大家可以看看调试单元,以及出错内容,注释里。
1 2 3 4 5 ... 20
收藏数 6,425
精华内容 2,570
关键字:

在unity中打开ios