unity3d 加载3d模型_本地加载不出unity3d 模型 - CSDN
  • [unity3d]加载模型资源

    2013-10-31 22:26:16
    模型资源加载到场景中显示 1.从本地加载 void OnGUI() { if (GUILayout.Button("click")) { StartCoroutine(getmodel()); } } IEnumerator getmodel() { WWW w =

    将模型资源加载到场景中显示

    1.从本地加载

    void OnGUI()
        {
            if (GUILayout.Button("click"))
            {
                StartCoroutine(getmodel());
            }
        }
    
    
        IEnumerator getmodel()
        {
            WWW w = new WWW("file://"+Application.dataPath+"/ok.unity3d");
            yield return w;
            Instantiate(w.assetBundle.mainAsset);
           
        }


    2.从服务器端加载

    这里我已经将资源模型加载到百度云盘上,然后获取一个url下载地址:(直接模型就是ok.unity3d格式的)

    中间是搭建的sqlserver服务器和asp.net服务器:

    using UnityEngine;
    using System.Collections;
    using System.Text;
    
    public class NewBehaviourScript : MonoBehaviour
    {
    
        string s;
        private GameObject obj;
        private WWW www;
        private string url = @"http://192.168.1.6/plusFile/Test.aspx";
        private string url1 = @"http://114.92.247.6/xiaowei/ok.unity3d";
    
        void Start()
        {
    
        }
    
        private bool isCompleted = false;
    
        void Update()
        {
    
            if (www == null)
            {
                return;
            }
            if (!isCompleted && www.isDone)
            {
                print("Download completed");
                isCompleted = true;
                print("6");
                obj = GameObject.Instantiate(www.assetBundle.mainAsset) as GameObject;
                obj.transform.position = new Vector3(0, 1, 20);
                print("7");
            }
    
    
        }
    
        void OnGUI()
        {
            if (GUI.Button(new Rect(20, 20, 100, 40), "加载"))
            {
                StartCoroutine(getHtml(url));
                print("2");
            }
        }
    
        IEnumerator getHtml(string url)
        {
            print("3");
            WWW web = new WWW(url);
            yield return web;
            print("1");
            //Encoding e1 = new ASCIIEncoding();  
            //this.s = e1.GetString(web.bytes);  
            //print("web" + e1.GetString(web.bytes));  
            this.s = web.text;
            StartCoroutine(getModel(s));
        }
    
    
        IEnumerator getModel(string str)
        {
            print("s:" + str);
            this.www = new WWW(str);
            yield return www;
            print("5");
        }
    }


    同样的效果:



    直接从网上获取资源:

    using UnityEngine;
    using System.Collections;
    
    public class NewBehaviourScript : MonoBehaviour {
    
        string url1 = @"http://114.92.247.6/xiaowei/ok.unity3d";
        GameObject obj;
    	void Start () {
    	
    	}
    	
    	void Update () {
    	
    	}
    
        void OnGUI()
        {
            if (GUI.Button(new Rect(20, 20, 100, 40), "加载"))
            {
                StartCoroutine(getHtml(this.url1));
                print("2");
            }
        }
    
        IEnumerator getHtml(string url)
        {
            print("3");
            WWW web = new WWW(url);
            yield return web;
            obj = Instantiate(web.assetBundle.mainAsset) as GameObject;
            obj.transform.position = new Vector3(0,1,20);
            print("1");
            
        }
    }
    



    展开全文
  • Unity3d网络加载模型和导出unity3d格式文件
  • 本文通过一个在Android中展示3D模型的实例,介绍如何将Unity3d以View的形式嵌入到Android应用中。并提供Deom和代码下载。

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持!

    效果展示:


     

                 


    开篇废话:

    我现在所在的Team每周需要一个人给大家介绍一个知识点,或者新技术。这礼拜正好轮到我了,由于我工作才一年,面对那帮老鸟讲知识点感觉有点作死。所以我就准备选个新技术介绍一下。

    由于我在大学里自学过一段时间Unity3D,所以我想介绍的技术就是它,但我现在做的是应用开发,不能做个小游戏去给大家演示。所以我想到比较简单,直观,而且有可能真正能用到的就是在Android应用中展示3D模型。比如在产品展示时直接把这个产品的3D模型展示出来而不是个图片,效果应该非常棒(OpenGL应该也可以做)。

    思路定下以后就发现大学时学的Unity3D的内容基本忘光了,虽然偶尔有Unity3D的文章都会点开看看,但还是得重新学。记得当时学Unity3D的时候看过一个叫雨松MOMO的博客。那时年轻,懵懂,找不到方向的我还给雨松大神发了一封邮件去请教大学应该怎么学习和做游戏相关的问题,结果人家没回,导致我更加失落于是接着学android去了。。。又扯远了。。。于是我又找到他的博客,把Unity3D基础部分的相关文章都看了一遍。

    但是他博客里有介绍如何在Unity3D中调用Android,而我想做的是在Android中调用Unity3D,而且是把Unity3D嵌套在ANDROID的视图里面。最后费了九牛二虎之力才把这个Demo做出来。


    准备工作:

    下面是我总结的流程,目的是使本文思路更加清晰一些:

    1.Android端代码可以在Eclipse中开发(AndroidStudio没有试,应该也可以)

    2.Unity3D端代码要在Unity中开发

    3.Android和Unity3D端,两边都需要加入一些代码从而可以使之关联交互。

    4.将Android端代码编译成jar文件以插件形式放入到Unity端中

    5.在Unity中将整个项目Build成apk文件,然后安装到手机或模拟器里运行

    本文主要讲解1,2,3。对于4,5建议大家去看雨松MOMO的Unity博客的第17篇和第18篇。


    UnityPlay:

    在编写Android端和Unity3d端代码前,有必要先了解一下可以使两部分交互的类UnityPlay。

    个人理解UnityPlay是个Unity提供给外部交互的一个接口类。

    为什么是“个人理解”?这我不得不爆粗口了,TMD官网根本就没有相关的API和文档(如果大家有谁找到一定给我来一份,就当我骂自己了)。

    热心的网友已经找到了:http://docs.unity3d.com/Manual/PluginsForAndroid.html。。。。


    在关联Android时,想拿到UnityPlay以及相关类的jar包可以从下面的地址找到:Unity安装路径\Editor\Data\PlaybackEngines\androidplayer\bin在bin文件夹下有一个classes.jar的jar文件,它就是我们想要的。

    而在bin同目录下有一个src文件,点击到最后有3个类,分别是UnityPlayerActivity.java,UnityPlayerProxyActivity.java,UnityPlayerNativeActivity.java。前两个打开个后只有一行代码,说的是UnityPlayerActivity和UnityPlayerProxyActivity都继承自UnityPlayerNativeActivity。而打开UnityPlayerNativeActivity中居然有代码,而且我估计这应该是UnityPlayerNativeActivity的源码。

    由于关于UnityPlay的资料我只找到这么一个,所以我把UnityPlayerNativeActivity中的代码都贴出来,如果我注解有不对的地方希望大家指正。

    /**
     * UnityPlayerActivity,UnityPlayerProxyActivity都继承自UnityPlayerNativeActivity
     * 而UnityPlayerNativeActivity继承自NativeActivity
     * 在该类里定义了一些和ANDROID生命周期相同的回调方法,留给自定义的Activity子类重写。
     */
    public class UnityPlayerNativeActivity extends NativeActivity
    {
    	//UnityPlayer的引用,并且我们不能改变这个引用变量的名字,它被native code所引用
    	protected UnityPlayer mUnityPlayer;
    
    	protected void onCreate (Bundle savedInstanceState)
    	{
    		requestWindowFeature(Window.FEATURE_NO_TITLE);
    		super.onCreate(savedInstanceState);
    		// 设置显示窗口参数
    		getWindow().takeSurface(null);
    		setTheme(android.R.style.Theme_NoTitleBar_Fullscreen);
    		getWindow().setFormat(PixelFormat.RGB_565);
    
    		// 创建一个UnityPlayer对象,并赋值给全局的引用变量
    		mUnityPlayer = new UnityPlayer(this);
    		//为UnityPlayer设置一些参数
    		if (mUnityPlayer.getSettings ().getBoolean ("hide_status_bar", true))
    			getWindow ().setFlags (WindowManager.LayoutParams.FLAG_FULLSCREEN,
    			                       WindowManager.LayoutParams.FLAG_FULLSCREEN);
    
    		int glesMode = mUnityPlayer.getSettings().getInt("gles_mode", 1);
    		boolean trueColor8888 = false;
    		// UnityPlayer.init()方法需要在将view附加到layout之前调用。它将会调用native code
    		mUnityPlayer.init(glesMode, trueColor8888);
    		
    		// 从UnityPlayer中获取到Unity的View视图
    		View playerView = mUnityPlayer.getView();
    		// 将Unity视图加载到根视图上
    		setContentView(playerView);
    		// 使Unity视图获取焦点
    		playerView.requestFocus();
    	}
    	protected void onDestroy ()
    	{
    		// 当Activity结束的时候调用UnityPlayer.quit()方法,它会卸载之前调用的native code
    		mUnityPlayer.quit();
    		super.onDestroy();
    	}
    
    	// 下面几个方法都是ANDROID相关回调方法,确保在ANDROID执行相应方法时UnityPlayer也需调用相应方法
    	protected void onPause()
    	{
    		super.onPause();
    		mUnityPlayer.pause();
    	}
    	protected void onResume()
    	{
    		super.onResume();
    		mUnityPlayer.resume();
    	}
    	 
    	public void onConfigurationChanged(Configuration newConfig)
    	{
    		super.onConfigurationChanged(newConfig);
    		mUnityPlayer.configurationChanged(newConfig);
    	}
    	public void onWindowFocusChanged(boolean hasFocus)
    	{
    		super.onWindowFocusChanged(hasFocus);
    		mUnityPlayer.windowFocusChanged(hasFocus);
    	}
    	public boolean dispatchKeyEvent(KeyEvent event)
    	{
    		if (event.getAction() == KeyEvent.ACTION_MULTIPLE)
    			return mUnityPlayer.onKeyMultiple(event.getKeyCode(), event.getRepeatCount(), event);
    		return super.dispatchKeyEvent(event);
    	}
    }
    
    看完这个类后就知道了为什么在自定义的Activity中继承了UnityPlayerActivity等类以后,只要重写了onCreate并调用super.onCreate()方法后不需要任何其他的代码就会自动的显示出Unity3D的视图。因为初始化Unity视图的代码都在UnityPlayerNativeActivity父类中实现了。

    ANDROID端代码:

    在写ANDROID代码的时候,一定要导入Unity3D提供给我们的jar包,jar包的位置我在上面说了。引入jar包加入到buildpath中这些最基本的我就不多说了。

    要想和Unity交互,我们就不能继承ANDROID提供给我们的Activity,我们需要继承刚才jar包中引入的Unity提供的Activity类,一共有这么3个:

    UnityPlayerActivity,UnityPlayerProxyActivity,UnityPlayerNativeActivity。具体区别不知道,因为没有文档,没有API,没有源码(这里再次鄙视一下)。刚才我们看过UnityPlayerNativeActivity的代码(虽然很短,但我觉得这个就是源码),知道UnityPlayerActivity,UnityPlayerProxyActivity都是它的子类,而且最终父类为NativeActivity。所以我们继承Unity提供的最外层的子类是最好的选择,我这里选择的是UnityPlayerActivity,因为名字最简单,觉得该封装的都应该封装好了。

    public class MainActivity extends UnityPlayerActivity {
    	
    	private Button topButton;
    	private Button bottomButton;
    	
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		
    		// 设置test为我们的根布局
    		setContentView(R.layout.test);
    		
    		// 通过刚才的源码分析,知道mUnityPlayer为一个全局的引用变量,而且已经在父类中设置好了,所以直接拿来用就可以了
    		View playerView = mUnityPlayer.getView();
    		// 将Unity的视图添加到我们为其准备的父容器中
    		LinearLayout ll = (LinearLayout) findViewById(R.id.unityViewLyaout);
    		ll.addView(playerView);
    		
    		// 上面的button设置监听器
    		topButton = (Button) findViewById(R.id.topButton);
    		topButton.setOnClickListener(new View.OnClickListener() {
    
    			@Override
    			public void onClick(View v) {
    				//发送消息给Unity端,该函数第一个参数为接受消息的类对象,第二个该类对象用接受消息的方法,第三个参数为传递的消息
    				//所以下面的意思就为:调用Main Camera下面的Previous方法,传送的消息为空
    				UnityPlayer.UnitySendMessage("Main Camera","Previous",""); 
    			}
    		});
    		
    		// 为下面的button设置监听器
    		bottomButton = (Button) findViewById(R.id.bottomBtn);
    		bottomButton.setOnClickListener(new View.OnClickListener() {
    			
    			@Override
    			public void onClick(View v) {
    				//调用Main Camera下面的Next方法,传送的消息为空
    				UnityPlayer.UnitySendMessage("Main Camera","Next","");   
    			}
    		});
    	}
    }

    最后看一下Android端的布局文件,布局很简单,上下各有一个button按钮,两个按钮中间是Unity的视图。

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
    
        <Button
            android:id="@+id/topButton"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:text="PREVIOUS" />
    
        <LinearLayout
            android:id="@+id/unityViewLyaout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_above="@+id/bottomBtn"
            android:layout_below="@+id/topButton"
            android:orientation="horizontal" >
        </LinearLayout>
    
        <Button
            android:id="@+id/bottomBtn"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:text="NEXT" />
    
    </RelativeLayout>
    Android端的代码就介绍完了,很简单。唯一的难点就是UnityPlayerActivity和UnityPlayer的使用,就这两个破玩意花了我好几天的时间,很简单的东西不知道为什么官方不给个文档或者API(也可能我太挫没找到。。。)

    Unity3D端代码:

    先看一下我的项目结构:


    JavaScript存放的是脚本

    Models存放的是我在Assert Store中下载的免费的一些模型文件

    Plugins下是我的Android工程,具体做法参考网上教程(这里推荐雨松大神的第17篇)

    Prefab我是调整模型后定义的预制体

    在场景中,我只有一个摄像机,和一个直射光。将脚本绑定到摄像机上,然后将之前调整好的5个预设模型添加到脚本的相应对象中。


    下面是脚本的代码,关于模型的旋转缩放是直接用了雨松MOMO的一篇文章中的代码,然后再加上了本例中的一些逻辑而组成的。

    #pragma strict
    
    //5个模型,从外部传入
    var car : GameObject;
    var helicopter : GameObject;
    var suv : GameObject;
    var plane : GameObject;
    var tank : GameObject;
    
    //模型数组下标
    private var index : int;
    //模型数组
    private var models : GameObject[];
    //当前模型对象
    private var mCurrentGameObject : GameObject;
    
    /******************************************/
    /*分割线之下的变量用于触摸手势镜头控制旋转和缩放*/
    /******************************************/
    
    //缩放系数
    var distance = 10.0;
    //左右滑动移动速度
    var xSpeed = 250.0;
    var ySpeed = 120.0;
    //缩放限制系数
    var yMinLimit = -20;
    var yMaxLimit = 80;
    //摄像头的位置
    var x = 0.0;
    var y = 0.0;
    //记录上一次手机触摸位置判断用户是在左放大还是缩小手势
    private var oldPosition1 : Vector2;
    private var oldPosition2 : Vector2;
    
    
    function Start () {
    	//初始化模型数组
    	index = 0;
    	models = new GameObject[5];
    	models[0] = car;
    	models[1] = helicopter;
    	models[2] = suv;
    	models[3] = plane;
    	models[4] = tank;
    	//克隆一个初始模型对象
    	mCurrentGameObject = Instantiate(models[index], Vector3(0,0,0), Quaternion.Euler(-20,0,0));	
    	
    	//初始化镜头参数
    	var angles = transform.eulerAngles;
        x = angles.y;
        y = angles.x;
    }
    
    function Update () {
    
    	//判断触摸数量为单点触摸
        if(Input.touchCount == 1)
        {
            //触摸类型为移动触摸
            if(Input.GetTouch(0).phase==TouchPhase.Moved)
            {
                //根据触摸点计算X与Y位置
                x += Input.GetAxis("Mouse X") * xSpeed * 0.02;
                y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02;
     
            }
        }
     
        //判断触摸数量为多点触摸
        if(Input.touchCount > 1 )
        {
            //前两只手指触摸类型都为移动触摸
            if(Input.GetTouch(0).phase==TouchPhase.Moved||Input.GetTouch(1).phase==TouchPhase.Moved)
            {
                    //计算出当前两点触摸点的位置
                        var tempPosition1 = Input.GetTouch(0).position;
                    var tempPosition2 = Input.GetTouch(1).position;
                    //函数返回真为放大,返回假为缩小
                    if(isEnlarge(oldPosition1,oldPosition2,tempPosition1,tempPosition2))
                    {
                        //放大系数超过3以后不允许继续放大
                        //这里的数据是根据我项目中的模型而调节的,大家可以自己任意修改
                           if(distance > 3)
                           {
                               distance -= 0.5;
                           }
                       }else
                    {
                        //缩小洗漱返回18.5后不允许继续缩小
                        //这里的数据是根据我项目中的模型而调节的,大家可以自己任意修改
                        if(distance < 18.5)
                        {
                            distance += 0.5;
                        }
                    }
                //备份上一次触摸点的位置,用于对比
                oldPosition1=tempPosition1;
                oldPosition2=tempPosition2;
            }
        }
    }
    
    //函数返回真为放大,返回假为缩小
    function isEnlarge(oP1 : Vector2,oP2 : Vector2,nP1 : Vector2,nP2 : Vector2) : boolean
    {
        //函数传入上一次触摸两点的位置与本次触摸两点的位置计算出用户的手势
        var leng1 =Mathf.Sqrt((oP1.x-oP2.x)*(oP1.x-oP2.x)+(oP1.y-oP2.y)*(oP1.y-oP2.y));
        var leng2 =Mathf.Sqrt((nP1.x-nP2.x)*(nP1.x-nP2.x)+(nP1.y-nP2.y)*(nP1.y-nP2.y));
        if(leng1 < leng2)
        {
             //放大手势
             return true;
        }else
        {
            //缩小手势
            return false;
        }
    }
     
    //Update方法一旦调用结束以后进入这里算出重置摄像机的位置
    function LateUpdate () {
     
        //mCurrentGameObject为我们当前模型对象,缩放旋转的参照物
        if (mCurrentGameObject.transform) {        
     
            //重置摄像机的位置
             y = ClampAngle(y, yMinLimit, yMaxLimit);
            var rotation = Quaternion.Euler(y, x, 0);
            var position = rotation * Vector3(0.0, 0.0, -distance) + mCurrentGameObject.transform.position;
     
            transform.rotation = rotation;
            transform.position = position;
        }
    }
     
    static function ClampAngle (angle : float, min : float, max : float) {
        if (angle < -360)
            angle += 360;
        if (angle > 360)
            angle -= 360;
        return Mathf.Clamp (angle, min, max);
    }
    
    // 当android中按下next,显示下一个模型
    function Next () {
    	index = index+1;
    	if (index > models.Length-1) {
    		index = 0;
    	}
    	Debug.Log("next");
    	// 摧毁当前对象
    	Destroy(mCurrentGameObject);
    	// 建立新的模型对象
    	mCurrentGameObject = Instantiate(models[index]);
    }
    
    // 当android中按下previous,显示上一个模型
    function Previous () {
    	index = index-1;
    	if (index < 0) {
    		index = models.Length-1;
    	}
    	Debug.Log("previous");
    	// 摧毁当前对象
    	Destroy(mCurrentGameObject);
    	// 建立新的模型对象
    	mCurrentGameObject = Instantiate(models[index]);
    }
    

    最后就是在Unity3D中将工程Build成APK文件,然后再手机或模拟器中运行(如果手机或模拟器连着Eclipse则可以打出log方便调试找错)。

    最后附上代码Demo:

    Unity端代码太大了,所以我就把Android端和Unity端代码还有而apk文件上传到百度云了。

    代码点击下载


    结束语:

    我在刚上大学的时候就梦想着毕业以后去做游戏,但是报志愿的时候选的是java相关,后来才知道java并不适合做游戏,后来自学c++,openGL,再后来又看Unity3D但全都没有坚持下来,而且大学时候天天和同学打wow,结果毕业发现其实游戏相关的东西根本等于一点也没学会,而且大连没有游戏开发的工作,虽然很想去北京试试,但是当时去北京实习太麻烦,而且不一定能找到,所以就在大连直接找了一个Android开发就这么把当初的梦想放弃了。但是我还是想明年去北京试试能不能找到游戏开发的工作,这中间一年我还是会主要学习Android和Java,剩余时间看看图形学和数学知识,不会像大学的时候看到什么热就学什么,因为现在懂得渐渐多了后发现编程基本都是通用的,所以还是先把一个东西学透学明白吧。



    展开全文
  • Unity动态加载3D模型

    2020-07-16 10:47:36
    Unity动态加载3D模型Unity中创建游戏对象的方法有 3 种: 第一种是将物体模型资源由 Project 视图直接拖曳到 Hierarchy 面板中; 第二种是在 Unity 3D 菜单 GameObject 中创建 Unity 3D 自带的游戏对象,如 ...

    https://recomm.cnblogs.com/blogpost/12196362?page=2

     

    Unity动态加载3D模型

    在Unity中创建游戏对象的方法有 3 种:

    • 第一种是将物体模型资源由 Project 视图直接拖曳到 Hierarchy 面板中;
    • 第二种是在 Unity 3D 菜单 GameObject 中创建 Unity 3D 自带的游戏对象,如 Cube、Camera、Light 等;
    • 第三种是利用脚本编程,动态创建或删除游戏对象。

    本文尝试采用第三种方法,即利用脚本动态加载3D模型文件,从而创建游戏对象。
    网上搜索“Unity3d 动态加载fbx模型文件”,大部分都是对文章https://blog.csdn.net/ldkcumt/article/details/51098206的转载,先亲身做一下实践。
    Unity版本:Unity 2018.3.7f1 (64-bit)  随VS2017一起安装。
    方法一
    1 将模型拖动到场景中 ,调整好位置。(制作prefab预制体需要)
    2 新建Resources(如果工程中有的话 就不用新建了,Resources.Load调用的就是该文件夹下的资源),在该文件夹下建一个prefab,将上面的模型拖动到这个prefab上
    3 删除场景中的该物体模型
    4 编写脚本,把它随便扔给一个GameObject

     1 using System.Collections;
     2 using System.Collections.Generic;
     3 using UnityEngine;
     4 
     5 public class LoadFBX : MonoBehaviour
     6 {
     7     public string url;
     8     // Start is called before the first frame update
     9     void Start()
    10     {
    11         GameObject gFbx = (GameObject)Instantiate(Resources.Load("che"));
    12     }
    13 
    14     // Update is called once per frame
    15     void Update()
    16     {
    17         
    18     }
    20 }

    方法二
    1 按方法1 制作prefab (注意调整好位置)
    2 然后使用AssetBundle导出包
    3 这时可以看到导出的.AssetBundle文件了
    4 编写代码
    第2步详解:参考https://www.jianshu.com/p/f4c685cf487a

     1 using UnityEngine;
     2 using System.Collections;
     3 using UnityEditor;
     4 using System.IO;
     5 public class AssetBundleBuilder
     6 {
     7     [MenuItem("Assets/Build AssetBundle")]
     8     static public void BuildAssetBundle()
     9     {
    10         Caching.ClearCache();
    11         string path = Application.streamingAssetsPath + "/" + "AssetBundles" + "/" + "Windows";
    12         if (!Directory.Exists(path))
    13         {
    14             Directory.CreateDirectory(path);
    15         }
    16         BuildPipeline.BuildAssetBundles(path, 0, EditorUserBuildSettings.activeBuildTarget);
    17         AssetDatabase.Refresh();
    18     }
    19 }

    加载代码修改:

     1 using System.Collections;
     2 using System.Collections.Generic;
     3 using UnityEngine;
     4 
     5 public class LoadFBX : MonoBehaviour
     6 {
     7     public string url;
     8     // Start is called before the first frame update
     9     void Start()
    10     {
    11         //GameObject gFbx = (GameObject)Instantiate(Resources.Load("che"));
    12         string name = "che.first";
    13         url = "file://C:/Users/yakong/Documents/FirstUnity3d/Assets/StreamingAssets/AssetBundles/Windows/";
    14         StartCoroutine(LoadAsset(url, name));
    15     }
    16 
    17     // Update is called once per frame
    18     void Update()
    19     {
    20         
    21     }
    22 
    23     // LoadAssert 
    24     public IEnumerator LoadAsset(string url, string Scname)
    25     {
    26         WWW www = new WWW(url + Scname);
    27         yield return www;
    28         AssetBundle bundle = www.assetBundle;
    29         foreach (var name in bundle.GetAllAssetNames())
    30         {
    31             Debug.Log(name);
    32             if (name != "")
    33             {
    34                 GameObject go = (GameObject)Instantiate(bundle.LoadAsset(name));
    35             }     
    36         }  
    37     }
    38 }

    PS:直接使用www.assetBundle.mainAsset时运行为null,参考https://stackoverflow.com/questions/42775797/cannot-load-an-asset-bundle解决!

    最终的启动运行加载效果:

    希望大家能把自己的所学和他人一起分享,不要去鄙视别人索取时的贪婪,因为最应该被鄙视的是不肯分享时的吝啬。

    展开全文
  • Unity3D平台动态加载调度倾斜摄影数据,利用多线程动态加载瓦片数据,可以顺畅加载海量的瓦片数据,目前加载60G的瓦片数据没有出现卡顿现象。 倾斜摄影数据的金字塔结构,可直接加载osgb数据 加载Unity3d...

       在Unity3D平台动态加载调度倾斜摄影数据,利用多线程动态加载瓦片数据,可以顺畅加载海量的瓦片数据。目前测试可流畅加载100G左右数据,支持加载本地数据,数据可不放在Unity工程内,也可以将数据放置在服务器上实现网络加载。

       倾斜摄影数据的金字塔结构,可直接加载osgb数据

    加载到Unity3d中的瓦片数据

    可根据相机位置以及视点朝向动态加载新的瓦片以及卸载过期的瓦片,这样可以保证内存足够

    可以在Unity编辑器下直接加载工程外部osgb数据,运行后根据分页LOD算法根据视距动态加载卸载数据

     

    展开全文
  • Unity3d加载场景方法

    2017-12-18 14:09:14
    //通过场景索引号异步加载场景,异步加载即后台加载加载过程显示的依旧是原场景,也可以设置一个加载场景+进度条之类的过渡。 前提:按File - Build Settings -将需转换的场景全部放进去(原场景也要),看见场景名...
  • 今天想和大家交流的是解析obj模型并将其加载Unity3D场景中,虽然我们知道Unity3D是可以直接导入OBJ模型的,可是有时候我们并不能保证我们目标客户知道如何使用Unity3D的这套制作流程,可能对方最终提供给我们的...
  • Unity3D开发:向Unity3D中导入外部模型 转载 2014年04月09日 14:00:07 49677 Unity3D支持多种外部导入的模型格式,这里列出了它支持的外部模型的属性,并且以3D MAX为例,导出FBX文件给Unity...
  • Unity3D平台动态加载调度倾斜摄影数据,利用多线程动态加载瓦片数据,可以顺畅加载海量的瓦片数据。目前测试可流畅加载100G左右数据,支持加载本地数据,数据可不放在Unity工 程内,也可以将数据放置在服务器上...
  • 1、几经折腾终于把osgb的外片文件加载unity场景了,并实现了分级加载,并用FPSController进行第一人称漫游。 2、效果如下:
  • Android中展示Unity3D模型
  • 1 将模型拖动到场景中 ,调整好位置。(制作prefab需要) 2 新建Resources(如果工程中有的话 就不用新建了,Resource.Load调用的就是该文件夹下的资源),在该文件夹下建一个prefab,将上面的模型拖动到这个prefab...
  • Unity3D加载外部资源

    2015-06-26 10:42:28
    Unity 3D里有两种动态加载机制:  一是Resources.Load;  一是通过AssetBundle;  其实两者本质上没有什么区别。Resources.Load就是从一个缺省打进程序包里的AssetBundle里加载资源,而一般AssetBundle文件...
  • 从网上找的相关动态加载的资料,然后自己又稍微整理整理,分了分类而已。
  • 今天想和大家交流的是解析obj模型并将其加载Unity3D场景中,虽然我们知道Unity3D是可以直接导入OBJ模型的,可是有时候我们并不能保证我们目标客户知道如何使用Unity3D的这套制作流程,可能对方最终提供给我们的...
  • 众所周知在Unity3D游戏开发过程中,因为受到游戏容量、平台性能和热更新等诸多因素的限制,我们可能无法将所有的游戏场景打包到项目中然后相对”静态”地加载,那么这个时候就需要我们使用动态加载的方式来将游戏...
1 2 3 4 5 ... 20
收藏数 5,548
精华内容 2,219
关键字:

unity3d 加载3d模型