2017-10-26 10:13:23 FF_1221 阅读数 1665

截取360全景图


1、运行到你所要截取的游戏场景或画面,例如,VR游戏运行在电脑上按下空格键截取所需要的

void Update(){

   if (Input.GetKeyDown(KeyCode.Space))
        {
            GameStart();
        }

}

2、在游戏运行时,在游戏中创建一个空物体,上面挂载RenderTest的脚本(在这步之前要将capture的文件夹导入Assets中)


3、在Game界面点击,按下P键,所要截取的全景图的路径会出现在Console中


Unity中浏览360全景图


1、新建一个场景、将所要浏览的全景图导入项目中,设置属性如下:



2、新建Material



3、Window -->  Lighting --> Settings 将刚刚创建的Material给天空球

2019-02-25 16:05:35 qq_37122437 阅读数 544

基于Unity的全景图制作伪3D场景的测试

前言:

公司想用拍照设备拍出的全景图,在Unity中制作成VR的场景,先抛开VR不谈,如果想用图片来实现3D场景的感觉,就必须得先创建一个3D模型,然后把全景图无缝衔合上去。想必大家都想到了Unity中天空盒的原理,话不多说,直接上实现过程。

一、在Unity中创建一个Sphere,这也将是我们全景图的载体。创建Sphere

二、为Sphere赋予shader,此shader是整个demo的核心,它实现了把全景图无缝贴合到球体表面的功能。

此shader网上的案例有很多,为防止侵权大家可自行百度,具体效果以实际项目为准。

三、把全景图导入Unity,并赋值到shader的贴图参数上,赋值上之后,我们就可以看到效果了。

全景图效果展示

注意事项

图片的质量会直接导致场景效果的好坏,在Unity中,图片的质量是可调的,如果你看到的3D场景很模糊,那么可能的原因之一是,在Unity中没有调节图片质量。点击图片,查看Inspector面板,即可修改相应图片的参数配置。
在这里插入图片描述

2016-12-09 16:49:28 aiyan1111111 阅读数 7048

目的:

  • 1:在Unity中浏览全景图
  • 2:利用移动端陀螺仪浏览全景图
  • 3:在移动端没有陀螺仪情况下通过手指滑动浏览全景图

在Unity中如何创建全景图:

  1. 在Untiy中导入一个球体,用作承载全景图,将球体的位置设置为坐标原点;
  2. 然后在Unit中创建一个Camera,作为查看全景图的视觉;
  3. 最后为方便管理,为球体及Camera创建一个父物体panorama;
如下所示:




基本效果如下所示:

移动端处理:

代码及注释如下所示
using UnityEngine;
using System.Collections;
/// <summary>
///  Made by Bruce
/// </summary>
public class Gyro : MonoBehaviour
{
    Quaternion quatMult;
    protected void Start()
    {
        if (Application.platform == RuntimePlatform.WindowsEditor || Application.platform == RuntimePlatform.OSXEditor)
            this.enabled = false;

        //设置设备陀螺仪的开启/关闭状态,使用陀螺仪功能必须设置为 true,
        Input.gyro.enabled = true;
        //判断移动设备是否有陀螺仪————亲自测试OPPO R9手机并没有陀螺仪
        if (Input.gyro.enabled)
        {
            //获取设备重力加速度向量
            Vector3 deviceGravity = Input.gyro.gravity;
            //设备的旋转速度,返回结果为x,y,z轴的旋转速度,单位为(弧度/秒)
            Vector3 rotationVelocity = Input.gyro.rotationRate;
            //获取更加精确的旋转
            Vector3 rotationVelocity2 = Input.gyro.rotationRateUnbiased;
            //设置陀螺仪的更新检索时间,即隔 0.1秒更新一次
            Input.gyro.updateInterval = 0.1f;
            //获取移除重力加速度后设备的加速度
            Vector3 acceleration = Input.gyro.userAcceleration;
            quatMult = new Quaternion(0, 0, 1, 0);
        }
        else
        {
            //提示用户使用手指滑动查看全景图——Toast.ShowText("请单指滑动查看全景图", 5);
        }
    }

    protected void Update()
    {
        //如果可以使用陀螺仪
        if (Input.gyro.enabled)
        {
            transform.rotation = Input.gyro.attitude * quatMult;
        }
        else
        {
            #region  单点触发旋转(真实模型旋转)
            if (Input.touchCount == 1)
            {
                //触摸为移动类型
                if (Input.GetTouch(0).phase == TouchPhase.Moved)
                {
                    float XX = Input.GetAxis("Mouse X");
                    float YY = Input.GetAxis("Mouse Y");
                    #region
                    if (Mathf.Abs(XX) >= Mathf.Abs(YY))
                    {
                        if (XX < 0)
                        {
                            transform.Rotate(Vector3.up, 60 * Time.deltaTime, Space.Self);
                        }
                        if (XX > 0)
                        {
                            transform.Rotate(-Vector3.up, 60 * Time.deltaTime, Space.Self);
                        }
                    }
                    else
                    {
                        if (YY < 0)
                        {
                            transform.Rotate(Vector3.left, 60 * Time.deltaTime, Space.Self);
                        }
                        if (YY > 0)
                        {
                            transform.Rotate(-Vector3.left, 60 * Time.deltaTime, Space.Self);
                        }
                    }
                    #endregion
                }
            }
            #endregion
        }
    }

    void OnDestory()
    {
        Input.gyro.enabled = false;
    }
}


注:

以上代码处理了存在陀螺仪情况已经设备没有陀螺仪的情况(没有的情况下,使用的是单指滑动屏幕查看全景图,具体的查看方式可以自己写。)

2015-11-05 01:08:03 yuxikuo_1 阅读数 3188

转载自:http://www.cnphp6.com/archives/62868?utm_source=tuicool&utm_medium=referral

Unity游戏开发中,单个Scene解决所有问题似乎不可能,那么多个Scene之间的切换是必然存在。如果仅仅是切换,似乎什么都好说,但是在场景比较大的时候不想让玩家等待加载或者说场景与场景之间想通过一些画面、动画表现出一些让玩家期待的东西,大家就要去认真考虑。这篇文章主要介绍两种增加切换中如何播放画面或者动画等等,提高玩家的浸入感,当然你也可以做成无缝的场景

1 操作基础函数

LoadLevel Loads the level by its name or index.  
加载场景,加载之前你需要把场景在Build Settings添加,场景加载后,场景中的激活物体会调用MonoBehavior:OnLevelWasLoaded().使用该方法的时候,之前场景中的物体将会被直接删除。
LoadLevelAdditive Loads a level additively.  
该方法不销毁当前场景中的物体,新场景中的物体将会被添加进来,这个方法在一些连续加载的场景中非常有用哈。
LoadLevelAdditiveAsync Loads the level additively and asynchronously in the background.  
在后台异步记载场景  
unity会在后台线程中加载所有的场景资源,这就允许你在加载新场景过程中播放一个进度条或者通过异步加载为玩家创造一个流程的世界  
该方法会返回AsyncOperation结构,结构中isDone表示是否完成,progress给出当前的播放进度。注意的是在编辑器中后台线程的性能要低于游戏中。
LoadLevelAsync Loads the level asynchronously in the background.  
在后台异步记载场景  
unity会在后台线程中加载所有的场景资源,这就允许你在加载新场景过程中播放一个进度条或者通过异步加载为玩家创造一个流程的世界  
该方法会返回AsyncOperation结构,结构中isDone表示是否完成,progress给出当前的播放进度。注意的是在编辑器中后台线程的性能要低于游戏中。

是否销毁

LoadLevel和LoadLevelAsync,在加载完成后之后将会立刻销毁原先场景中的物体,而LoadLevelAdditive和LoadLevelAdditiveAsync加载后将会保留原先的场景中的物体,这种方式可以实现无缝融合的场景,只需要你在适当的位置加载后面的场景,不过你还是要考虑资源的释放问题。

同步还是异步

     异步加载能够获得加载过程的进度和是否加载完成,通过这种方式你可以在切换中增减进度条或者其他表现,这种方式一般通过协程完成:
public class ExampleClass : MonoBehaviour 
{
    IEnumerator Start() 
    {
        AsyncOperation async = Application.LoadLevelAsync("MyBigLevel");
        yield return async;
        Debug.Log("Loading complete");
    }
}
需要注意的是:在使用之前需要在Build Settings添加Scene。

2 切换画面实现方法

场景切换中实现画面或者动画的方式有很多种,我现在看到的主要有两种,这里大致做下两种方式:

第一种方式:增加新场景

增加新场景的方式可以参考雨松的博客:Unity3D研究院之异步加载游戏场景与异步加载游戏资源进度条(三十一),增加新场景的优点是增加了很多的灵活性,你在中间过渡场景中增加视频播放、图片或者是GUI,缺点就是如果你想在实现通用性,就需要顶层做一些数据辅助,比如加载前的场景中设置好切换时播放的图片到顶层数据管理模块中,在浸入切换场景后在获取这些数据,根据这些数据来切换播放的动画等等。

左图为测试工程中三个场景,Pre为当前场景,Middle为切换场景,Next是需要加载的场景。右图为middle场景中的存在的物体,挂有实现脚本。案例逻辑:Pre场景中直接进入middle场景,在middle场景中预先加载Next场景,确保新场景加载完之后不会立刻显示Next的场景,而是等待用户的触摸或者点击操作

                    3             4

具体的操作过程:

(1)在Pre场景中使用同步加载方法直接进入middle场景,因为Middle场景非常小,所以这个过程会非常快

Application.LoadLevel("Middle");

(2)Middle场景的逻辑

public class NewBehaviourScript2 : MonoBehaviour 
{
    public     Texture BackImage = null;
    private AsyncOperation async = null;
    void Start () 
    {
        //此物体在下一个场景中不会被销毁
        DontDestroyOnLoad(this);

        //开始加载场景
        StartCoroutine("LoadScene");
    }
    
    //异步加载
    IEnumerator LoadScene()
    {
        async = Application.LoadLevelAsync("Next");
        yield return async;
        Debug.Log("Complete!");
    }

    void OnGUI()
    {
        //切换场景中的背景,可以是图片或者动画,或者~~
        GUI.DrawTexture(new Rect(0, 0, Screen.width, Screen.height), BackImage);

        //加载过程中显示进度,也可以是进度条
        if (async != null && async.isDone == false)
        {
            GUIStyle style = new GUIStyle();
            style.fontSize = 48;
            GUI.Label(new Rect(0, 200, Screen.width, 20), async.progress.ToString("F2"), style);
        }

        //在加载结束后,弹出是否下个场景,模拟手游中"触摸任意位置进入游戏"
        if (async != null && async.isDone == true)
        {
            if (GUI.Button(new Rect(100, 100, 100, 100), new GUIContent("跳起进入下一个场景")))
            {
                Destroy(this);
            }
        }


    }
}

A 场景中添加一个占满全屏的背景图,当然也可以使用动画、视频等,场景加载后马上开始加载下一个场景(异步),根据异步加载进度进行进度条、动画等等进度控制

B 注意:MiddleObj物体被设置为DontDestroyOnLoad(this),也就是在新的场景中不销毁,即使在新场景加载后也会占满全屏的背景仍然存在,直到物体被销毁

C MiddleObj物体销毁的方式有两种,一种是手动方式,就像下面代码中使用的,点击Middle场景中的按钮销毁自己 ,另外一种自动方式是在新场景(Next场景)中的MonoBehavior:OnLevelWasLoaded()函数中销毁该物体。

void OnLevelWasLoaded(int level)
   {
       GameObject obj = GameObject.Find("MiddleObj");
       if (obj != null)
       {
           GameObject.Destroy(obj);
       }
   }

雨松在实现新加载场景中先将场景中的所有物体隐藏,场景切换之后再慢慢的显示出来,而不是通过DontDestroyOnLoad的方式,也是一种办法哈。如果想要把这种方式设计为通用模式,可以增加一个数据管理器,在加载前提前设置好需要的图片、动画资源等内容,OK ,就可以在多个场合使用啦。

2

第二种方式使用prefab

这种方式和第一种方式原理上其实类似,只不过不使用新的场景,而是在Pre场景中增加类似于上面Middle场景中的MiddleObj物体中的逻辑,并且设置为DontDestroyOnLoad。这种方式中可以参考的就是SceneManager场景管理插件,SceneManager的使用可以参考:



     http://blog.csdn.net/onerain88/article/details/12303511

http://www.haogongju.net/art/2499058

5           6

具体使用我就不多说了哈,咱先看看其实现的关键原理:SceneManger使用异步加载新场景,进入加载之后,就会根据选择使用不同的屏幕效果,并且这个效果是不会在新场景中消失的,直到需要的效果目标达到,就会显出出先场景。SceneManger提供了一些列的屏幕效果Prefab以及场景管理方式,很不错的插件哈。       

测试代码下载:http://pan.baidu.com/s/1o67dAiA 密码:l976 ,内带有SceneManager 插件(花15大洋买的)


2018-09-11 10:49:16 weixin_42513339 阅读数 1422

在Unity3D中,一个场景在运行中切换到另一个场景的方法

1.  在Unity中 File->Build Settings->把要切换的场景添加到Scenes In Build下面,也可以Add Open Scenes,添加完关闭这个页面,不要点 Build 或者 Build And Run 。

2. 添加需要加转换场景的代码。

//首先要记得加上引用命名空间

using UnityEngine.SceneManagement;

//然后在需要的代码区域加上:

SceneManager.LoadScene("SceneName");//要切换到的场景名

或者

SceneManager.LoadScene(0); //数字不一定是0,括号里数字是场景的编号,这个编号就是在 File->Build Settings ,上方 Scene In Build,场景名字那行最右边的数字

没有更多推荐了,返回首页