zoukankan      html  css  js  c++  java
  • u3d动态加入模型

    楼层一层一层的加,把模型分开,弄成prefab放到Resourse文件夹里,在代码里用Instantiate(Resources.Load("模型名字") as GameObject);

    不同的按钮用Resources.Load加载不同的物体。加载其中一个prefab的时候如何把之前加载的Prefab销毁呢?因为prefab后面会加(clone),所以可以用destroy(XXX(clone));

    文章转载:http://www.j2megame.com/html/xwzx/ty/2623.html

    动态加载FBX文件 方法1(已测试过) 1 将模型拖动到场景中,调整好位置。(制作prefab需要) 2 新建Resources(如果工程中有的话就不用新建了,Resource.Load调用的就是该文件夹下的资源),在该文件夹下建一个prefab,将上面的模型拖动到这个prefab上 3 删除场景中的该物体模型 4 编写脚本,把它仍随便一个GameObject 主要代码如下
    using UnityEngine; using System.Collections;
    public class LoadFBX : MonoBehaviour {
        // Use this for initialization     void Start () {     GameObject gFbx=(GameObject)Instantiate( Resources.Load("che"));     }          // Update is called once per frame     void Update () {          } } 搞定
    方法2:(没测试过,应该可以,因为之前能成功加载GameObject对象)
    1 按方法1 制作prefab 注意调整好位置
    2 然后使用AssetBundle导出包选项 create single AssetBundle(这之前需要在工程文件夹中新建一个叫做“Dynamic_Asset”的文件夹)
    3 这时可以看到导出的.AssetBundle文件了 4 编写代码
    如下             public string url;     void Start () {         string Scname = "scene1_part2.assetbundle";         url = "file://F:/EZGUI/Dynamic_Asset/";         StartCoroutine(DLAsset(url,Scname));     }     void Update () {
        }         public IEnumerator DLAsset (string url,string Scname) {         WWW www = new WWW(url+Scname);         yield return www;         GameObject GO = (GameObject)Instantiate(www.assetBundle.mainAsset);     }     

    ========================================================================================

    下面部分来自:http://www.unity3d8.com/content/如何动态加载模型-0

    如何动态加载模型   1,加载封装好的内部文件。 var aaa : Material;//空材质    var bbb : GameObject;//要绑定材质的模型    function Start()    {            aaa.mainTexture = Resources.Load("你的资源名,例如“pic1”不需要文件扩展名");           bbb.renderer.material = aaa;    }  2,加载磁盘文件 var bbb : GameObject;    function Start () {           var www = new WWW ("file://D:\pic1.jpg"这里也可以是网络图片地址);           yield www;           bbb.renderer.material.SetTexture("_MainTex", www.texture);   

     

    最近做的项目是一个iphone的u3d项目,会用到需要动态加载模型的地方。简单总结一下。

     
    1,如果模型是项目工程里面的模型, 可以将模型放到Resources文件夹下面,然后再用Resource.Load("") 方法来加载;
    GameObject modelResource = Resource.Load("xxx") as GameObject;//加载资源文件
    GameObject obj = Object.Instantiate(modelResource) as GameObject;//
    当然之后还可以设定obj的Material等。(注意一定要将资源放到Resources文件夹中)
     
    2,如果模型是远程下载下来的,就最好将模型和相关资源打包成.unity文件,再用WWW进行加载。
    WWW www = new WWW("url");
    yield return www;
    GameObject obj = Object.Instantiate(www.assetBundle.Load("ModelName")) as GameObject;
     
    需要注意的是,如果模型是直接从比如3dmax导出的fbx文件,这样加载就会导致每次物体的Material都会被新建,也就是导致即使是相同的模型,也无法使用同一个draw call,如果会重复加载多次同样的模型,最好存成prefab进行处理,这样可以规避draw call的问题。
     
    为了方便将fbx处理成prefab,我大体写了一个editor的工具,可以将fbx的model转化成prefab。有需要的话可以我和进行联系。这个转化比较简单,主要是用了这个方法(当然要大体知道U3D的Editor如何来写):
    Object prefab = EditorUtility.CreateEmptyPrefab("Assets/Resources/Model/" + obj.name + ".prefab");
    EditorUtility.ReplacePrefab(obj, prefab);
  • 相关阅读:
    uni-app-数据缓存
    uni-app-网络请求
    uni-app-上拉加载
    uni-app-下拉刷新
    uni-app-生命周期
    uni-app字体图标
    uni-app-样式
    [Python] ValueError: Unknown resampling filter
    [Python]列表复制以及切片[:][::]解析
    LeetCode 29. 两数相除
  • 原文地址:https://www.cnblogs.com/runfeng/p/3403776.html
Copyright © 2011-2022 走看看