• Unity3D 使用备忘(二) 我实现了相机自动漫游功能,在这一节中,我将实现如何进行相机按预设的位置进行角度切换。 (1)将Main Camera游戏物体附加给SceneManager的MainSceneManager(Script)组件下的...

        在Unity3D 使用备忘(二) 我实现了相机自动漫游功能,在这一节中,我将实现如何进行相机按预设的位置进行角度切换。

    (1)将Main Camera游戏物体附加给SceneManager的MainSceneManager(Script)组件下的doToweenPath属性(可通过点选doTweenPath在Scene中选择Main Camera 或者直接将Main Camera 拖拽到doToweenPath属性中)。

                                                             

    (2)我们先将MainSceneManager.cs脚本文件进行完善。

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
    using DG.Tweening;  //DOTween的命名空间
    using System;
    
    public class MainSceneManager : MonoBehaviour {
    
        //初始化按轨迹移动的游戏物体
        public DOTweenPath doTweenPath;
       
        //初始化当前相机
        public GameObject currCamera;   
        //创建开始/暂停自动漫游、停止自动漫游及改变界面的按钮,stopButton表示开始、暂停交替变化;
        public Button stopButton;
        public Button exitButton;
        public Button viewButton;
        //创建改变界面时相机的位置和旋转角度
        private Vector3 position = new Vector3(-3.37f, 10f,2.9f);
        private Quaternion qu = Quaternion.Euler(90f, -90f, 0);
        //创建是否点击了改变界面的按钮
        public bool isClickViewButton = false;
        //MainSceneManager管理对象
        public static MainSceneManager Instance;
    
        private void Awake()
        {
            //初始化MainSceneManager管理对象,方便其他cs脚本文件调用时使用。
            MainSceneManager.Instance = this;
        }
    
        void Start () {
            //游戏物体按轨迹开始移动,这里相当于启动自动漫游路径。
            doTweenPath.DORestart();
    
            //这里绑定两个按钮的点击事件
            stopButton.onClick.AddListener(StopAuto);
            exitButton.onClick.AddListener(ExitAuto);
            viewButton.onClick.AddListener(ChangeView);
        }
    
        //创建停止/开始自动漫游、退出自动漫游和改变界面的方法
        private void StopAuto()
        {
            //重新给isClickViewButton赋值为false,然后传值到CameraManager.cs脚本文件中,否则相机无法看向(0,0,0)坐标
            isClickViewButton = false;
            //在变化过程中执行该方法,停止、开始、停止、开始 
            doTweenPath.DOTogglePause();
           
        }
        private void ExitAuto()
        {
            //重新给isClickViewButton赋值为false,然后传值到CameraManager.cs脚本文件中,否则相机无法看向(0,0,0)坐标
            isClickViewButton = false;
            //变化过程中执行该方法,回到原始位置
            doTweenPath.DORewind();   
        }
        private void ChangeView()
        {
            //点击了ViewButton将isClickViewButton设置为true;然后传值到CameraManager.cs脚本文件中。
            isClickViewButton = true;
            //1f 秒内 currCamera的坐标变化到position1
            currCamera.transform.DOMove(position, 1f);
            //1f 秒内 currCamera的旋转角度变化到qu1 
            currCamera.transform.DORotateQuaternion(qu, 3f);
        }
        void Update () {
    		
    	}
    }
        上面背景为黄色的部分为本次添加的代码,注意下面和CameraManager.cs脚本文件的联系;

    (3)将CameraManager.cs脚本文件进行完善:

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using DG.Tweening; //DOTween的命名空间
    
    public class CameraManager : MonoBehaviour {
    
        public static CameraManager Instance; //相机管理对象     
        void Awake()
        {
            CameraManager.Instance = this;   //在这里初始化CameraManager
        }
    
        // Use this for initialization
        void Start () {        
    
        }
    	
    	// Update is called once per frame
    	void Update () {
            //实时接收MainSceneManager中的isClickViewButton属性
            bool isClickViewButton = MainSceneManager.Instance.isClickViewButton;
            //判断是否点击了ViewButton,这一步很重要,否则MainCamera一直看向(0,0,0)坐标,无法完成角度的变化
            if (isClickViewButton==false) {
                //使相机始终看向坐标(0,0,0)
                this.transform.DOLookAt(new Vector3(0, 0, 0), 0.0001f);
            }
            
        }
    }
        从代码中可以看出,这里判断了MainSceneManager中的isClickViewButton的值,然后决定相机指向的位置,如果这里不进行设置,在MainSceneManger中就无法重置相机的旋转角度,相机会一直看向(0,0,0)坐标。

    (4)回到Unit3D界面。在Hierarchy视图中单击SceneManger游戏物体,其Inspector视图中如下显示:

                                                  

        上图中红色线框内的属性为SceneManager管理的游戏对象。CurrentCamera为当前相机,我们先直接将Hierarhy视图中的MainCamera拖拽到该文本框内。

    (5)在Hierarchy视图中创建3个Button,并将名字和Text中的内容进行更改,如下图:

                                                   

    (6)将新创建的3个Button游戏物体附加到SceneManager游戏物体的3个Button属性中。此时SceneManager的Inspector视图如下显示。

                                                   

        上图为将CurrCamera和3个Button附加到SceneManager后的效果。

    (7)开始进行游戏测试:

            1、点击Stop/StartButton的效果如下图所示:

                                       

            2、点击ExitAuto的效果如下图所示:

                                       

            3、点击ChangeView的效果如下图所示:

                                       
    注:上述3幅图中都是通过点击按钮发生的变化,在图里面点击按钮时按钮颜色瞬间发生了轻微的变灰,可能看的不是特别清楚。

                          


    展开全文
  • Unity3D 使用备忘(一)中 我完成了ManiScene界面游戏物体的准备,在这次博客中我将详细讲解相机如何围绕cube按照我设置的漫游路径进行自动漫游。  (1)在Project界面中导入DOTween插件。可以去Window->Asset ...

        在Unity3D 使用备忘(一)中 我完成了ManiScene界面游戏物体的准备,在这次博客中我将详细讲解相机如何围绕cube按照我设置的漫游路径进行自动漫游。

        (1)在Project界面中导入DOTween插件。可以去Window->Asset Store中进行下载免费版本的。

        当下载完成后导入到Project界面时,该界面会多出以下面两个文件夹。

                                                   

        导入DOTween后,你需要设置dotween额外的库设置基你的Unity版本。

             1、Tools->DOTween Utility Panel->点击SetupDoTween即可。

             2、DOTween只是为了对应Unity的版本不需关心更多。

                                                   

        (2)在Project界面中创建Script文件夹用于存放脚本文件。

        (3)在Script文件夹中创建MainSceneManager.cs和CameraManager.cs两个脚本文件。

        (4)编写MainSceneManager.cs脚本文件内容:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using DG.Tweening;  //DOTween的命名空间
    
    public class MainSceneManager : MonoBehaviour {
    
        //初始化按轨迹移动的游戏物体
        public DOTweenPath doTweenPath;
    
        // Use this for initialization
        void Start () {
            //游戏物体按轨迹开始移动,这里相当于启动自动漫游路径。
            doTweenPath.DORestart();  
        }
    	// Update is called once per frame
    	void Update () {
    		
    	}
    }
    让后将该脚本文件附加到(一)中创建的SceneManager游戏物体,其检视视图如下图所示:


                                    

        (5)在层级视图中选择MainCamera,其检视视图如下图所示:

                                    

                 通过点击Add Component来添加DOTweenPath组件,添加后如右图所示:

                                    

                将DOTweenPath组件展开后,下面只介绍较常用的属性:

                 Duration:动画时长;

                Ease:这是一个枚举,可以理解为动画播放速率曲线 ;

                 Loops:动画循环播放的次数;-1表示一直循环,0表示只播放一次,当该值>1时,检视面板出现

                              LoopType,顾名思义就是指循环类型:

                                         Restart:重新开始,后面的动画循环播放会从起点重新开始; 

                                         Yoyo:来回播放 

                                         Incremental:增加的,后面的path移动动画会在上一次循环的终点的基础上进行播放

                 PathType:漫游路径为直线还是曲线;

                 ClosePath:漫游路径是否封闭;

         Color:轨迹曲线的颜色;

                 Handles Type:手柄类型(指pathWayPoints的类型,选用free比较好调整)

                 PathWayPoints:移动路径的坐标值;

                                      

        (6)编写CameraManager.cs脚本文件,并附加给Main Camera游戏物体(上图显示已附加)。

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using DG.Tweening; //DOTween的命名空间
    
    public class CameraManager : MonoBehaviour {
    
        public static CameraManager Instance; //相机管理对象
    
        void Awake()
        {
            CameraManager.Instance = this;   //在这里初始化CameraManager
        }
    
        // Use this for initialization
        void Start () {        
    
        }
    	
        // 每一帧都会执行
        void Update () {
            //使相机始终看向坐标(0,0,0)
            this.transform.DOLookAt(new Vector3(0, 0, 0), 0.0001f);
        }
    }
                    下图为具体的展示效果

                                                       

                                 





    展开全文
  • unity漫游插件,在asset store 上面挂着是30美金呢,包里面有详细图片,如有问题,请留言
  • using UnityEngine; using System.Collections; public class ScemeMove : MonoBehaviour { private Vector3 rota; public float x_speed = 50f; public float y_speed = 50f;... public float m_speed = 10f;...
    using UnityEngine;
    using System.Collections;
    
    public class ScemeMove : MonoBehaviour {
    	private Vector3 rota;
    	public float x_speed = 50f;
    	public float y_speed = 50f;
    	public float m_speed = 10f;
    	public float f_speed = 10f;
    	public float h_speed = 1f;
    	public float groundDis = 5f;
    	public float skyDis = 50f;
    	public Camera camera;
    	// Use this for initialization
    	void Start () {
    		camera = Camera.main;
    		rota = camera.transform.eulerAngles;
    	}
    	
    	// Update is called once per frame
    	void Update () {
    		//鼠标右键
    		if(Input.GetMouseButton(1)){
    			rota.y += Input.GetAxis ("Mouse X") * x_speed;
    			rota.x -= Input.GetAxis ("Mouse Y") * y_speed;
    			Quaternion q = Quaternion.Euler (rota);
    			camera.transform.rotation = q;
    		}
    		//滚轮滑动
    		float middle = Input.GetAxis ("Mouse ScrollWheel");
    	
    		camera.transform.position += -Vector3.up * middle * m_speed + (Vector3.forward * middle * f_speed);
    	
    		//空格
    		if(Input.GetKey(KeyCode.Space)){
    			middle = -0.1f;
    			camera.transform.position += -Vector3.up * middle * m_speed + (Vector3.forward * middle * f_speed);
    		}
    
    		//WASD
    		float h = Input.GetAxis ("Horizontal");
    		float v = Input.GetAxis ("Vertical");
    		camera.transform.position += camera.transform.right * h * h_speed;
    		camera.transform.position += camera.transform.forward * v;
    		clamp ();
    
    	}
    
    	private void clamp(){
    		Vector3 upUp;
    		upUp = camera.transform.position;
    		upUp.y = Mathf.Clamp (upUp.y,groundDis,skyDis);
    		camera.transform.position = upUp;
    	}
    }
    

    展开全文
  • 我学习Unity3D一小段时间了,第一个制作目标就是实现一个自由漫游的摄像机。 使用WSAD键控制摄像机的上下左右移动,使用鼠标右键控制摄像机的旋转。 这个功能比较简单,代码也一目了然,不做过多解释了,直接上代码...

    我学习Unity3D一小段时间了,第一个制作目标就是实现一个自由漫游的摄像机。

    使用WSAD键控制摄像机的前后左右移动,使用鼠标右键控制摄像机的旋转。

    这个功能比较简单,代码也一目了然,不做过多解释了,直接上代码。

    这个脚本不只可以用在摄像机上,也可以用在一般的GameObject上。

    //-----------------------------------------------------------------
    //1,把本类作为一个组件,包含在 GameObject 中。
    //2,左手坐标系。
    //-----------------------------------------------------------------
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    //-----------------------------------------------------------------
    public class FiCameraControl : MonoBehaviour
    {
        public float moveSpeed = 30.0f;
        public float rotateSpeed = 0.2f;
    
    
        public static Vector3 kUpDirection = new Vector3(0.0f, 1.0f, 0.0f);
    
    
        //控制摄像机旋转的成员变量。
        private float m_fLastMousePosX = 0.0f;
        private float m_fLastMousePosY = 0.0f;
        private bool m_bMouseRightKeyDown = false;
    
    
        //-----------------------------------------------------------------
        void Start()
        {
    
    
        }
        //-----------------------------------------------------------------
        void Update()
        {
            //判断旋转
            if (Input.GetMouseButtonDown(1)) //鼠标右键刚刚按下了
            {
                if (m_bMouseRightKeyDown == false)
                {
                    m_bMouseRightKeyDown = true;
                    Vector3 kMousePos = Input.mousePosition;
                    m_fLastMousePosX = kMousePos.x;
                    m_fLastMousePosY = kMousePos.y;
                }
            }
            else if (Input.GetMouseButtonUp(1)) //鼠标右键刚刚抬起了
            {
                if (m_bMouseRightKeyDown == true)
                {
                    m_bMouseRightKeyDown = false;
                    m_fLastMousePosX = 0;
                    m_fLastMousePosY = 0;
                }
            }
            else if (Input.GetMouseButton(1)) //鼠标右键处于按下状态中
            {
                if (m_bMouseRightKeyDown)
                {
                    Vector3 kMousePos = Input.mousePosition;
                    float fDeltaX = kMousePos.x - m_fLastMousePosX;
                    float fDeltaY = kMousePos.y - m_fLastMousePosY;
                    m_fLastMousePosX = kMousePos.x;
                    m_fLastMousePosY = kMousePos.y;
    
    
                    Vector3 kNewEuler = transform.eulerAngles;
                    kNewEuler.x += (fDeltaY * rotateSpeed);
                    kNewEuler.y += -(fDeltaX * rotateSpeed);
                    transform.eulerAngles = kNewEuler;
                }
            }
    
    
            //判断位移
            float fMoveDeltaX = 0.0f;
            float fMoveDeltaZ = 0.0f;
            float fDeltaTime = Time.deltaTime;
            if (Input.GetKey(KeyCode.A))
            {
                fMoveDeltaX -= moveSpeed * fDeltaTime;
            }
            if (Input.GetKey(KeyCode.D))
            {
                fMoveDeltaX += moveSpeed * fDeltaTime;
            }
            if (Input.GetKey(KeyCode.W))
            {
                fMoveDeltaZ += moveSpeed * fDeltaTime;
            }
            if (Input.GetKey(KeyCode.S))
            {
                fMoveDeltaZ -= moveSpeed * fDeltaTime;
            }
            if (fMoveDeltaX != 0.0f || fMoveDeltaZ != 0.0f)
            {
                Vector3 kForward = transform.forward;
                Vector3 kRight = Vector3.Cross(kUpDirection, kForward);
                Vector3 kNewPos = transform.position;
                kNewPos += kRight * fMoveDeltaX;
                kNewPos += kForward * fMoveDeltaZ;
                transform.position = kNewPos;
            }
        }
    }
    //-----------------------------------------------------------------
    


    展开全文
  • Unity中经常用到第一人称漫游,比较常用的是用Unity Assets中导入的Charaters包,里面包含第一人称控制器和第三人称控制器,将第一人称控制器拖入场景中就可以用AWSD实现前后左右移动,控制器自带脚步声音效,在...

    在Unity中经常用到第一人称漫游,比较常用的是用Unity Assets中导入的Charaters包,里面包含第一人称控制器和第三人称控制器,将第一人称控制器拖入场景中就可以用AWSD实现前后左右移动,控制器自带脚步声音效,在一些游戏场景中经常使用。
    在这里插入图片描述
    在这里插入图片描述
    但是如果需要在场景中来回切换位置,第一人称似乎比较难实现,比如我们经常看到的VR看房中的样板间展示,点击房间的缩略图就会进入到该房间进行漫游,要实现这种效果,我采用的是在场景中布置了多个摄像机,放在合适的位置。
    在这里插入图片描述
    接着给这几个摄像机和鼠标添加移动的脚本,实现按AWSD可以前后左右移动,移动鼠标可以实现画面旋转查看。
    新建Mouselook脚本

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    
    public class Mouselook : MonoBehaviour
    {
        public enum RotationAxes
        {
            MouseXAndY = 0,
            MouseX = 1,
            MouseY = 2
        }
        public RotationAxes axes = RotationAxes.MouseXAndY;
        public float sensitivityHor = 1f;
        public float sensitivityVert = 1f;
    
        public float minmumVert = -45f;
        public float maxmumVert = 45f;
    
        private float _rotationX = 0;
        // Use this for initialization
        void Start()
        {
    
        }
    
        // Update is called once per frame
        void Update()
        {
            if (axes == RotationAxes.MouseX)
            {
                transform.Rotate(0, Input.GetAxis("Mouse X") * sensitivityHor, 0);
            }
            else if (axes == RotationAxes.MouseY)
            {
                _rotationX = _rotationX - Input.GetAxis("Mouse Y") * sensitivityVert;
                _rotationX = Mathf.Clamp(_rotationX, minmumVert, maxmumVert);
    
                float rotationY = transform.localEulerAngles.y;
    
                transform.localEulerAngles = new Vector3(-_rotationX, rotationY, 0);
            }
            else
            {
                _rotationX -= Input.GetAxis("Mouse Y") * sensitivityVert;
                _rotationX = Mathf.Clamp(_rotationX, minmumVert, maxmumVert);
    
                float delta = Input.GetAxis("Mouse X") * sensitivityHor;
                float rotationY = transform.localEulerAngles.y + delta;
    
                transform.localEulerAngles = new Vector3(-_rotationX, rotationY, 0);
            }
    
        }
    }
    

    新建move脚本

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class move : MonoBehaviour {
    
        public CharacterController controller;
        public Rigidbody rigidbody;
        public float speed = 1;
    
        // Use this for initialization
        void Start()
        {
            rigidbody = this.GetComponent<Rigidbody>();
            controller = this.GetComponent<CharacterController>();
        }
    
        //Move
    
    
        // Update is called once per frame
        void Update()
        {
            //Move
            if (Input.GetKey("a"))
                controller.SimpleMove(transform.right * -speed);
            if (Input.GetKey("d"))
                controller.SimpleMove(transform.right * speed);
            if (Input.GetKey("w"))
                controller.SimpleMove(transform.forward * speed);
            if (Input.GetKey("s"))
                controller.SimpleMove(transform.forward * -speed);
        }
    
    }
    
    
    
    

    把脚本挂在摄像机上,并添加Rigidbody组件和Charcter Controller组件,在move组件中选择对应的摄像机的controller和rigidbody。
    在这里插入图片描述
    接下来是实现各个相机之间的跳转,新建一个空物体来控制切换,我这里是GameObject。将下面两个脚本都挂在空物体从camera_1跳转camera_0

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Camerachange2 : MonoBehaviour
    {
    
        public GameObject camera_0;
        public GameObject camera_1;
        private Vector3 CameraOriginalPosition2;//摄像机2的初始位置
        public IEnumerator Start()
        {
            yield return new WaitForSeconds(0.1F);
            camera_1.SetActive(true);
            camera_0.SetActive(false);
            //记录摄像机2的原始位置
    
            CameraOriginalPosition2 = new Vector3(camera_1.transform.localPosition.x, camera_1.transform.localPosition.y, camera_1.transform.localPosition.z);
            print("摄像机2的原始位置的X=" + CameraOriginalPosition2.x);
            print("摄像机2的原始位置的Y=" + CameraOriginalPosition2.y);
            print("摄像机2的原始位置的Z=" + CameraOriginalPosition2.z);
        }
    
    
        // Update is called once per frame
        public void change1()
        {
            camera_1.SetActive(false);
            camera_0.SetActive(true);
            camera_1.transform.position = CameraOriginalPosition2;
        }
    }
    
    

    新建脚本从camera_0跳转camera_1:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Camerachange : MonoBehaviour {
    
        public GameObject camera_0;//设置成public可以使unity中出现如下图所示的
        public GameObject camera_1;
        private Vector3 CameraOriginalPosition; //摄像机1的原始位置
       
        public IEnumerator Start()
        {
            yield return new WaitForSeconds(0.1F);
            camera_1.SetActive(false);
            camera_0.SetActive(true);
            //记录摄像机1的原始位置
    
            CameraOriginalPosition = new Vector3(camera_0.transform.localPosition.x, camera_0.transform.localPosition.y, camera_0.transform.localPosition.z);
                print("摄像机1的原始位置的X=" + CameraOriginalPosition.x);
                print("摄像机1的原始位置的Y=" + CameraOriginalPosition.y);
                print("摄像机1的原始位置的Z=" + CameraOriginalPosition.z);
               
            
     
            
        }
        public void change()
        {
            camera_0.SetActive(false);
            camera_1.SetActive(true);
            camera_0.transform.position = CameraOriginalPosition;
        }
      
       
        // Update is called once per frame
        void Update () {
    		
    	}
    }
    

    上述代码可以实现每次跳转漫游之后都能后相机回到初始位置
    在这里插入图片描述
    然后添加按钮实现点击跳转。为按钮增加点击事件。
    在这里插入图片描述

    展开全文
  • 首先说明一下,今天将的手动漫游方式需要借助Unity的手势插件: FingerGestures具体插件如何使用,请看文章: http://blog.csdn.net/qq_15267341/article/details/51878844?locationNum=1&fps=1三步搞定手动漫游:1...
  • Unity3D关于多点移动

    2019-03-04 15:21:26
    这是关于人物多点移动的方法,同理相机跟随.很早之前写过的一个东西 ,提取一些东西分享一下 private void Move(Transform[] target,ref int count,out bool iscount) { iscount = false; var relativePos = ...
  • Unity3D 路径的编辑与跟随路径的移动脚本的编写。
  • 最近总监把之前的项目导出发现有相机乱晃动的情况,后来发现竟然是Unity版本的问题,之前的3.5的版本导入到4.0里面(因为用的是64bit的win7),导出成x64的时候竟然出现了很大的问题,于是总监建议自己写一个结合...
  • 这里主要用到steamVR的两个插件 SteamVR Plugin 和 Vive-teleporter插件地址:...删除主相机 将预设CameraRig 拖入场景 此时我们可以运行场景 可以自由挪动头盔(主摄像机) 构建寻路网格 Vive-teleporter中自带Nav
  • 资源来自网络,勿喜勿下!免费供给有用的人!这是个unity简单自由漫游摄像机控制脚本。
  • unity之VR漫游模式1、环境2、GVR 部分解析3、漫游思路及ps 1、环境 开发环境:win10 设备:创维V901+配套手柄+nolo手柄 VR开发工具包:GVR,也就是你所用VR组件源码,研究源码,才能看透VR怎么用啊 游戏引擎:Unity...
  • Unity VR全景漫游

    2020-03-01 09:58:38
    最近对三维虚拟漫游感兴趣,偶遇这篇博文,转载过来相互学习。 文章来源:Unity VR全景漫游,深表感谢! Unity VR全景漫游 前言 最近VR如火如茶,就学习就落伍啦,所以有空闲时间研究下相关知识。 本文介绍了两种...
  • unity避免相机穿墙

    2016-10-09 17:10:02
    当采用第一人称相机相机穿墙是一件很烦人的事情,避免相机穿墙有几种方法,比较常见的是采用characterController的第一人称角色控制器,但是这个比较麻烦的事情是它有3个子物体,还要有好几个的脚本,有时我们仅仅...
  • 在之前的一篇博文中描述了Unity3D应用嵌入WPF应用的具体实现方式,但仅仅是解决了最基本的技术问题,想要将其具体的应用到项目中还需要具体的细化。经过近期在项目中的实践进行了细化,现将本人最近的一些过程整理...
  • 第三人称的角色移动控制方案有很多种: 1. rigidbody.velocity() : 通过控制刚体的速度 来实现对角色的移动控制 2. rigidbody.MovePosition() : 通过调整刚体的Position 来实现对角色的移动控制 3. rigidbody....
  • Unity3d:https://unity3d.com/cn 参考百度百科:https://baike.baidu.com/item/Unity3D/3064002?fromtitle=Unity&amp;fromid=10793&amp;fr=aladdin Unity3D是由Unity Technologies开发的一个让玩家轻松创建...
1 2 3 4 5 ... 8
收藏数 148
精华内容 59