• ios-3D展示图.zip

    2020-05-22 23:32:02
    以前写的一个简单的demo,用于展示类仓库的立体区域属性展示图.今天想起来了,就直接在这里展示一下吧.github访问地址: https://github.com/WYZKirk/WYZ3DView 可以的话帮忙点个星.
  • 最近公司要开发一款用于3d展示的应用,通过在网上拜读各大神的帖子,终于完美解决此类问题。(unity3d版本2017.3,xcode9.2) 前边unity3d打包iOS工程的方法在此就不做赘述,其他帖子基本可以解决,本帖直接上干货...

    最近公司要开发一款用于3d展示的应用,通过在网上拜读各大神的帖子,终于完美解决此类问题。(unity3d版本2017.3,xcode9.2)

    前边unity3d打包iOS工程的方法在此就不做赘述,其他帖子基本可以解决,本帖直接上干货。

    1、在打包好的iOS工程中,找到UnityAppController.m文件(在classes文件夹下),因为我们需要3d物体和控件同屏,所以要首先改造- (void)applicationDidBecomeActive:(UIApplication*)application;这个方法。具体代码如下:

    - (void)applicationDidBecomeActive:(UIApplication*)application
    {
        ::printf("-> applicationDidBecomeActive()\n");
            
        if(_unityAppReady)
        {
            if(UnityIsPaused())
            {
                UnityPause(0);
                UnityWillResume();
            }
            UnitySetPlayerFocus(1);
        }
        else if(!_startUnityScheduled)
        {
            _startUnityScheduled = true;
            [self performSelector:@selector(startUnity:) withObject:application afterDelay:0];
        }
        _didResignActive = false;
        
        static dispatch_once_t disOnce;
        dispatch_once(&disOnce,  ^ {
            [self performSelector:@selector(startViewC:) withObject:application afterDelay:0];
        });
        
        NSLog(@"_window22222222%@",_window.rootViewController);
    }
    -(void)startViewC:(UIApplication *)application{
        //自己的需要进入的视图
        MyViewController *root = [[MyViewController alloc] init];
        _window.rootViewController = root;
        
        GetAppController().unityView.frame = CGRectMake(0, 0, 512, 768);//我这里只对ipad进行了适配
        root.controller  = GetAppController();//controller是一个UnityAppController类型
      
    }
    

    2、在我们自己的controller中进行iOS代码处理,MyViewcontroller.h

    #import <UIKit/UIKit.h>
    #import "UnityAppController.h"
    @interface MyViewController : UIViewController
    @property(nonatomic, strong) UIView *vw;
    @property(nonatomic)UnityAppController *controller;
    
    @end
    

    MyViewcontroller.m

    #import "MyViewController.h"
    
    @interface MyViewController ()
    
    @end
    
    @implementation MyViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view.
    
    
        UIView *uview = [[UIView alloc] initWithFrame:CGRectMake(512, 0, 512, 768)];
        [self.view addSubview:uview];
        [uview addSubview:self.controller.unityView];
    
       //除了uview之外的区域,iOS的控件就可以按自己的项目需求处理了。
    
    }
    
    @end

    通过上边的操作基本上已经解决了iOS和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.

    展开全文
  • 720度3D场景展示IOS开源项目。可供开发参考
  • 我选择用手机端来展示,因为手机端浏览器对css3支持的比较好。制作这样的一个效果之前,首先要学会制作一个3d的盒模型,就跟div盒子布局一样。但是自从有了h5和css3之后,我们就有了制作3d盒子模型的能力。不多说先...

    我最终想要做一个这样的效果,如图:


    我选择用手机端来展示,因为手机端浏览器对css3支持的比较好。制作这样的一个效果之前,首先要学会制作一个3d的盒模型,就跟div盒子布局一样。但是自从有了h5css3之后,我们就有了制作3d盒子模型的能力。不多说先写为敬。

    首先我们先建立一个h5的基础结构:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">

    <!--因为是手机端,所以记得写这句-->
        <meta name="viewport"content="width=device-width,user-scalable=no"/>
        <title>Title</title>
    </head>
    <body>
    </body>
    </html>

    这个3d盒子模型呈现效果如图:


    接下来我们搭建这个盒子的html结构

    <div id="box">
        <div id="div">
            <span>前</span>
            <span>右</span>
            <span>后</span>
            <span>左</span>
            <span>上</span>
            <span>下</span>
        </div>
    </div>

    最外层为那个黑框,里面这个div为整个立方体,span为每个面。首先为最外层box写css样式。

    #box{
        width: 100px;
        height: 100px;
        border: 1px solid#000;
        padding: 100px;
        
    -webkit-perspective: 300px;
        perspective: 300px;
    }

    长宽高什么的就不说了,我们说一下这个新增属性perspectiv,它为透视深度,也就是z轴的深度,z轴在哪呢?以前我们只有二维,横着为x竖着为y,这个z轴就是垂直于我们眼睛的轴线。现在在我们眼前这个屏幕上,就有了一个xy为300(注:虽然css里面写的是100但是还有100的内边距),z也为300的立方体。只不过这个z300的深度我们无法直接看出来。3d变换样式Chrome 和 Safari 需要-webkit-前缀

    往下:
    #div {
        width: 100px;
        height: 100px;
        color: #fff;
        font-size: 50px;
        line-height: 100px;
        text-align: center;
        position: relative;
        
    -webkit-transform-style:preserve-3d;
        transform-style: preserve-3d;
        
    -webkit-transform-origin:center center -50px;
        transform-origin: center center -50px;
        
    transition: 5s;
    }

    这就是里面那个具体要做旋转的立方体的css样式,前面不多言,我们从相对定位开始说。相对定位的作用无非是为子集提供参考坐标,一会儿我们会先让所有的面全叠在最前面这个面上,然后我们在用css3旋转到它自己的位置。

    Transform-style这里需要指明它进行的变换为3d变换,因为默认是2d的变换。Transform-origin顾名思义,就是变换原点的意思,值为xyz,默认的原点是在二维平面上xy的交叉点,也就是“前”这个面的中心的,我们给z,-50px就让原点来到了这个立方体的中心。

    最后transition为我们给的过度动画时间,只有添加此值,我们才能看见它慢慢变化的效果对吧!

    下面我们来写每个面:

    div span {
        position: absolute;
        left: 0;
        top: 0;
        width: 100px;
        height: 100px;
        
    -webkit-transform-origin:center center -50px;
        transform-origin: center center -50px;
    }

    上面我们已经说过,给它绝对定位,让他们叠在一起,跟轮图似得是吧!然后一定记得也要给每个面设置变换原点。

    定位好了我们就让每个面旋转到自己该出现的位置:

    #div span:nth-of-type(1){
        background: red;
        -webkit-transform: rotateY(0deg);
        transform: rotateY(0deg);
    }
    #div span:nth-of-type(2){
        background: yellow;
        -webkit-transform: rotateY(90deg);
        transform: rotateY(90deg);
    }
    #div span:nth-of-type(3){
        background: blue;
        -webkit-transform: rotateY(180deg);
        transform: rotateY(180deg);
    }
    #div span:nth-of-type(4){
        background: green;
        -webkit-transform: rotateY(270deg);
        transform: rotateY(270deg);
    }
    #div span:nth-of-type(5){
        background: pink;
        -webkit-transform: rotateX(90deg);
        transform: rotateX(90deg);
    }
    #div span:nth-of-type(6){
        background: #000;
        -webkit-transform: rotateX(-90deg);
        transform: rotateX(-90deg);
    }

    颜色不解释了,说一下rotate,2d的时候它的值为弧度值,正值就是顺时针旋转,负值为逆时针旋转。3d的时候它便支持xy两个方向的旋转。具体旋转效果,大家在调试状态里面试一下就知道了。

    最后我们写一段js让它动起来:

    window.onload= function(){
        var div= document.querySelector('#div');
        
    div.style.WebkitTransform= div.style.transform= "rotateX(360deg)";
    };

    让这个立方体在文档加载完毕后,进行一个延x轴360的旋转,这个div还有一个5秒钟的缓动的动画,执行完便是二图我们看到的效果啦!

    第一步已经完成,下一步我们只需要进到立方体里面,再把图都贴上,就能看到我们设计好的效果啦。下篇见。

    更多请关注公众号:FE学习笔记

    展开全文
  • 之前做一个项目时,需要一个界面展示3D模型并进行交互。所以针对这个问题研究了很久,并总结了一些经验。... 一、如果项目紧紧是展示3d模型,并进行简单的手势交互,这个时候,最好不要选择使用U3D和iOS混编

         之前做一个项目时,需要一个界面展示3D模型并进行交互。所以针对这个问题研究了很久,并总结了一些经验。在论坛中总遇到相同需求的人,也有很多人问我,所以写出这篇博客供大家参考。网上资料很少,即时有也比较模糊,所以接下来我尽量说的详细些,看完之后还有不懂得可以继续问我,QQ:1414819100.

       一、如果项目紧紧是展示3d模型,并进行简单的手势交互,这个时候,最好不要选择使用U3D和iOS混编,这个样做起来会比较麻烦,逻辑关系复杂,安全隐患严重。Opengl能很好的解决这个问题,iOS封装成GLView,用起来很简单实用(可以进行交互,缩放,旋转,增删,调整透视等)。附上Demo,弄懂里面的一些主要参数,变量,实现你要的效果不难。有参数不明白可以继续联系我,这个就不多说了,接下来讲解比较棘手的。

      

       二、项目要求3D效果比较绚丽,交互复杂,GLView已经不能满足我们的需求,这个时候我们可以考虑一下U3D和iOS混编。我把自己在这个过程中遇到的问题的感悟分享给大家。

             首先,Unity3d会导出一个工程文件,这个工程文件和我们的iOS项目结构很相似。拿到之后,用打开,并运行。如果遇到报错,

             ld: warning: path '/Users/MAC/Desktop/ZiTest/Libraries/libiPhone-lib.a' following -L not a directory
             ld: library not found for -liPhone-lib
             clang: error: linker command failed with exit code 1 (use -v to see invocation)

            不要紧张,虽然错很多,但只是一个问题。U3D导出的xcode工程文件不支持模拟器运行,换成真机运行,问题就没有了。如果真机感觉每次都是真机测试很麻烦,你可以让u3d导出一份可以模拟器运行的工程文件。

            也有可能你会不能选择模拟器,找到TARGETS---Build Settings---  Supported Platforms   改成iOS。

           解决混编的方法有很多种,总结起来就两大类,一个是u3d导入iOS,一个是iOS导入u3d中。这个可以看看我之前看的一些文章,试过好多,没有成功,大家可以参考下,即时不行,了解一下原理。版本不同,方法可能有些不同,但是原理是一样的。(目前自己找到资料仅仅只有这些,大家好好参考一下)

                              http://blog.sina.com.cn/s/blog_48a8af640102vh2q.html

                              http://segmentfault.com/q/1010000000392448
                             http://www.cnblogs.com/shawn-zp/p/3225477.html

                             原文:http://alexanderwong.me/post/29949258838/building-a-ios-unity-uiview-uiviewcontroller
                              翻译:http://blog.163.com/savage_cui/blog/static/64335507201332834915876/
                             补充:http://user.qzone.qq.com/1523511691/infocenter#!app=2&via=QZ.HashRefresh&pos=1375185802
                             其他参考:http://www.scio.de/en/blog-a-news/scio-development-blog-en/entry/iphone-a-unity3d-integrating-3rd-party-static-libraries-in-unity3d-generated-    

                                             xcode-projects


           u3d导入iOS中会比较麻烦一些,u3d产生的文件很大,setting的参数也要详细设置。

           iOS导入u3d中相对简单,下面介绍这个方法。

           打开u3d导出的xcode工程文件,运行一下。

       

                                                        文件是这个样子。

       运行的时候提示(报错200+个)

    说明不支持模拟器运行,这个时候改用真机运行就可以了。最方便的办法就是让u3d导出可以真机运行的工程文件。

    好了,能运行之后,拖入或者创建我们自己的ViewController。


    打开Classes文件,找到UnityAppController(这个文件相当于我们认知的Appdelegate文件),找到这个方法,改变程序初始视图,由unityView改成我们自己的View。

    改成这个样子:

    - (void)applicationDidBecomeActive:(UIApplication*)application
    {
        ::printf("-> applicationDidBecomeActive()\n");
        
        
        static dispatch_once_t disOnce;
        dispatch_once(&disOnce,  ^ {
        [self performSelector:@selector(startViewC:) withObject:application afterDelay:0];    
        });
        
        NSLog(@"_window22222222%@",_window.rootViewController);
    //        [_snapshotView removeFromSuperview];
    //        _snapshotView = nil;
        

        if(_unityAppReady)
        {
            if(UnityIsPaused())
            {
                UnityPause(0);
                UnityWillResume();
            }
            UnitySetPlayerFocus(1);
        }
        else if(!_startUnityScheduled)
        {
    //        _startUnityScheduled = true;
    //        [self performSelector:@selector(startUnity:) withObject:application afterDelay:0];
               }

        _didResignActive = false;
    }

    -(void)startViewC:(UIApplication *)application{

     //我们自己需要进入的视图

        MyViewController *root = [[MyViewController alloc] init];
        _window.rootViewController = root;
        //[UnityGetMainWindow() makeKeyAndVisible];
    }

    现在程序启动之后,首先进入的就是我们的视图了,接下来就是怎么在我们的视图中进入到u3d界面视图。[self.UnityAC startUnity:[UIApplication sharedApplication]];方法只能调用一次,所以我们需要设置全局变量观察是第几次启动u3d界面。



    //第一次启动
    -(void)firstStarUnity{
       [self.UnityAC startUnity:[UIApplication sharedApplication]];
    }
    //再次启动
    -(void)againStarUnity{
        
        
        [self.UnityAC againStartUnity];
    }

    在UnityAppController里面实现再次启动打方法

    //再次启动
    -(void)againStartUnity{
        
       
        
        _window            = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
        _window.rootViewController = _rootController;
        _unityView        = [self createUnityView];
        
        //[DisplayManager Initialize];
        _mainDisplay    = [DisplayManager Instance].mainDisplay;
        [_mainDisplay createWithWindow:_window andView:_unityView];
        
        [self createUI];
        [self preStartUnity];
        
        UnityPause(true);
        _didResignActive = YES;
        Profiler_UninitProfiler();
        
        NSLog(@"22222%@",_window.rootViewController);
        [self showGameUI];
        [self createDisplayLink];

        
        [[[UnityGetMainWindow() rootViewController] view] setHidden:NO];
    //

        
            if (_didResignActive) {
            UnityPause(false);
            _didResignActive = NO;
        }
    }



    在UnityAppController---- (void)startUnity:(UIApplication*)application方法改成:

    - (void)startUnity:(UIApplication*)application
    {
        NSAssert(_unityAppReady == NO, @"[UnityAppController startUnity:] called after Unity has been initialized");

        _window            = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
        _unityView        = [self createUnityView];
        
        //[DisplayManager Initialize];
        _mainDisplay    = [DisplayManager Instance].mainDisplay;
        [_mainDisplay createWithWindow:_window andView:_unityView];
        
        [self createUI];
        [self preStartUnity];
        
        
        UnityInitApplicationGraphics();

        // we make sure that first level gets correct display list and orientation
        [[DisplayManager Instance] updateDisplayListInUnity];

        UnityLoadApplication();
        Profiler_InitProfiler();

        [self showGameUI];
        [self createDisplayLink];

        UnitySetPlayerFocus(1);
    }

    现在我们就可从我们的界面进入u3d界面了,现在写在u3d退出后回到我们的界面中。

    找到u3d预留的返回按钮的方法,在里面实现如何返回。在这里我没有用按钮,写在了UnityView.mm的touch的方法里。

    在UnityAppController里实现:

    //退出的方法
    -(void)exitUnity{
        _window            = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
        _unityView        = [self createUnityView];
        
        //[DisplayManager Initialize];
        _mainDisplay    = [DisplayManager Instance].mainDisplay;
        [_mainDisplay createWithWindow:_window andView:_unityView];
        
        [self createUI];
        [self preStartUnity];
        
        UnityPause(true);
        _didResignActive = YES;
        Profiler_UninitProfiler();
        NSLog(@"1111%@",_window.rootViewController);
        [[UnityGetMainWindow() rootViewController] view].hidden = YES;
    //    _window            = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
        self.myViewC = [[MyViewController alloc] init];
        _window.rootViewController = self.myViewC;
        NSLog(@"%@",self.window);
        NSLog(@"33333%@",_window.rootViewController);
        NSLog(@"%@",self.myViewC);
        
        //[UnityGetMainWindow() makeKeyAndVisible];
        
    }


    好了,现在就可以都实现了。本人目前还不是很精通,但经过好几天日夜的研究,基本的已经没有问题。欢迎各位优化,并通知我QQ:1414819100,谢谢!


    GLview Demo下载地址:http://download.csdn.net/detail/niuhailei/9463994。

    iOS,u3d混编Demo下载地址:https://yunpan.cn/cYX7fTFQXLeSc (提取码:ed6b)






    展开全文
  • 项目的首页界面要一个3D效果的,这个做个Demo,大家可以参考下。这个例子呢?是我从网上找个,不过不知道,之前写Demo的人,多么的神奇,很简单就能搞定的东西,那人弄的好神奇,我看了足足1个小时。这里传一个容易...

    项目的首页界面要一个3D效果的,这个做个Demo,大家可以参考下。这个例子呢?是我从网上找个,不过不知道,之前写Demo的人,多么的神奇,很简单就能搞定的东西,那人弄的好神奇,我看了足足1个小时。这里传一个容易看懂的,至少我觉得好懂。

    代码下载:http://download.csdn.net/detail/qqmcy/7035009

    框架类例子中有。

    ViewController.h

    #import <UIKit/UIKit.h>
    #import "FlowCoverView.h"
    
    @interface ViewController : UIViewController<FlowCoverViewDelegate>
    
    @property (strong , nonatomic) FlowCoverView* m_FlowCoverView;
    
    @end
    

    ViewController.m

    //获取屏幕高度
    #define ScreenHeight [[UIScreen mainScreen] bounds].size.height
    //获取屏幕宽度
    #define ScreenWidth [[UIScreen mainScreen] bounds].size.width
    
    
    #import "ViewController.h"
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
    	// Do any additional setup after loading the view, typically from a nib.
        
        self.m_FlowCoverView = [[FlowCoverView alloc] initWithFrame:CGRectMake(0, 0, ScreenWidth, ScreenHeight)];
        self.m_FlowCoverView.delegate = self;
        [self.view addSubview:self.m_FlowCoverView];
    }
    
    - (int)flowCoverNumberImages:(FlowCoverView *)view
    {
    	return 6;
    }
    
    - (UIImage *)flowCover:(FlowCoverView *)view cover:(int)image
    {
    	switch (image % 6) {
    		case 0:
    		default:
    			return [UIImage imageNamed:@"changmen.jpg"];
    		case 1:
    			return [UIImage imageNamed:@"changmen.jpg"];
    		case 2:
    			return [UIImage imageNamed:@"changmen.jpg"];
    		case 3:
    			return [UIImage imageNamed:@"changmen.jpg"];
    		case 4:
    			return [UIImage imageNamed:@"changmen.jpg"];
    		case 5:
    			return [UIImage imageNamed:@"changmen.jpg"];
    	}
    }
    
    - (void)flowCover:(FlowCoverView *)view didSelect:(int)image
    {
    	NSLog(@"Selected Index %d",image);
    }
    





    展开全文
  • Unity3dios插件开发

    2015-04-15 13:46:29
    这时需要我们自己编写本地插件来解决,本文主要介绍如何开发Unity3DiOS本地相册插件GlobalBrowser(能够自动扫描Documents目录,并且使用照片墙展示,其中展示功能使用了一个Objective-C的开源控件MWP
  • 做了好久Unity3DiOS结合的项目了,现把遇到过的问题罗列在次,以供大家相互解决问题,如有问题可以回复,相互探讨交流。 在Unity导出的Xcode中,UnityView是以单例的形式存在的,并且是readonly,所以请不要试图...
  • stl二进制文件的解读: //文件起始的80个字节是文件头,用于存贮文件名 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ...
  • iOS实现3D旋转

    2017-04-02 14:14:36
    最近看到了一个3D旋转的动画,就想着自己去实现以下。那么,接下来就通过这边文章记录以下学习过程,慢慢深入了解以下3D旋转。一、如何旋转每个View都在系统的坐标系中,就手机屏幕来说,左上角为 (0 , 0),向右横向...
  • iOS 载入3d模型 OpenGL ES

    2015-12-18 10:43:34
    转自:... obj2opengl:转换OBJ 3D模型到iPhone OpenGL ES兼容的数组中 标签: iphonefloatarrays脚本include工具 2012-08-13 17:22 7325人阅读 评论(1) 收藏 举
  • iOS OpenGL 加载3D模型

    2017-09-14 10:26:56
    https://www.raywenderlich.com/48293/how-to-export-blender-models-to-opengl-es-part-1 https://www.raywenderlich.com/50398/opengl-es-transformations-gestures ...Recently, we published Blender ... t
  • ![图片说明](https://img-ask.csdn.net/upload/201802/10/1518246462_938944.png) 如图,是用ios自带的三维引擎还是用unity3d之类的?不用来做游戏,要嵌入在应用里实时交互的
  • Andoid版本 微信官方文档 app端开发步骤:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5 SDK和Demo下载: ...如果你已经成功集成了微信登录和分享,那么此文将助你快速集成微信支...
  • 创建SCNView,SCNScene SceneKit可以创建一个view用来观察场景,在view的scene子对象里面设置SCNScene。 _scnView=[SCNView new]; _scnView.frame=CGRectMake(130, 10, 300, 300); _scnView.allowsCameraControl=...
  • iOS精选源码 iOS 一个异步渲染TextKit 写个女朋友的生日礼物codeGift 3D旋转 仿抖音小视频点赞动画 高德地图SDK二次封装,完美适配iOS11. iOS图表二次定制 - 波浪折线图 iOS图表二次...
  • 3D展示框架SDK全面开放 什么是SDK? SDK就是软件开发工具包(SDK全称:Software Development Kit)是应用软件时的开发工具集合。 老子云SDK技术内容介绍: 1、模型的3D展示和编辑: 产品模型可720°旋转、放大缩小、...
  • 玩转iOSARkit以及3D模型

    2019-06-23 21:50:54
    文章目录前言解析下代码planeBox换个模型推荐的3D模型网站下载模型注意事项将新模型放到项目里渲染模型两个诡异错误Scene is modified in a rendering callback of another scene.模型不出来模型大小调整 前言 学AR...
  • Unity3dIOS与安卓系统接入Admob广告教程
1 2 3 4 5 ... 20
收藏数 11,306
精华内容 4,522
热门标签