首页 > 其他分享 >AssetDatabase.LoadAssetAtPath 获取FBX资源空指针问题

AssetDatabase.LoadAssetAtPath 获取FBX资源空指针问题

时间:2023-10-01 18:12:54浏览次数:55  
标签:prefab tar GameObject FBX LoadAssetAtPath AssetDatabase path Enemy2b

问题一  LoadAssetAtPath 返回空

public class ProcessModel : AssetPostprocessor
{
    
    private void OnPostprocessModel(GameObject input)
    {
        if (input.name != "Enemy2b") return;

        //取得导入模型相关信息
        ModelImporter importer = assetImporter as ModelImporter;

        //将该模型从工程中读取出来
        string path = "Assets/airplane/Enemy2b.FBX";
        path = importer.assetPath;

        GameObject tar = AssetDatabase.LoadAssetAtPath<GameObject>(path);

        Debug.Log(importer.assetPath);
        Debug.Log(tar);
    }
}

  如上所示的代码,这是从一本书《Unity 3D/2D手机游戏开发 从学习到产品》中看到的一段代码。

  书中最后写到在工程窗口中选择Enemy2b,然后右键选择Reimport重新导入Enemy2b.FBX,上述代码会运行。

  但是经过试验后,发现上述代码 tar 是一个空对象,也就是说 AssetDatabase.LoadAssetAtPath方法返回的是空,也就是说这个path是找不到FBX资源,所以自然返回空对象。

  我在Project窗口中,将Enemy2b.FBX删除,没有触发OnPostprocessModel方法,然后Import New Assets后触发了OnPostprocessModel方法,依旧tar是空。

 

  我将上述代码注释掉if后,然后在Enemy.FBX上Reimport,结果tar不为空,那么也就是说,LoadAssetAtPath只能获取已经加载了的FBX资源,Reimport应该是删除再导入的操作咯?

public class ProcessModel : AssetPostprocessor
{
    
    private void OnPostprocessModel(GameObject input)
    {
        // if (input.name != "Enemy2b") return;

        //取得导入模型相关信息
        ModelImporter importer = assetImporter as ModelImporter;

        //将该模型从工程中读取出来
        string path = "Assets/airplane/Enemy2b.FBX";
        // path = importer.assetPath;

        GameObject tar = AssetDatabase.LoadAssetAtPath<GameObject>(path);

        Debug.Log(importer.assetPath);
        Debug.Log(tar);
    }
}

 

 然后我去unity手册里面查了下,如下网址

https://docs.unity.cn/cn/2020.2/ScriptReference/AssetPostprocessor.OnPostprocessModel.html

 我对标红的地方理解就是,这个OnPostprocessModel是用于模型导入后调用的,模型的话也就是FBX文件。

 关于创建prefab这段我觉得还是看英文好一点,从英文来看,当模型导入后,所有对游戏对象和网格的引用将失效,因此当fbx模型有mesh信息时,无法使用OnPostprocessModel方法从导入的fbx文件去创建一个预制体。

 而如下图这个模型,拥有col,enemy2两个mesh信息,大概是不能创建预制体。

  但是这里有个疑问,为啥我在Enemy2b导入完成后,Reimport  Enemy.FBX可以获取到Enemy2b.FBX的信息呢,不应该无法获取信息么?

  

问题二 创建预制体失败

  在第二步中,根据资源创建预制体,当返回unity界面,Reimport  Enemy.FBX来创建Enemy2b.FBX的预制体时,会发现预制体文件创建了, 但代码中prefab是空对象。

//将这个模型创建为Prefab
//GameObject prefab = PrefabUtility.SaveAsPrefabAsset(tar, "Assets/Prefabs/Enemey2b_0.prefab");
GameObject prefab = PrefabUtility.CreatePrefab("Assets/Prefabs/Enemey2b_0.prefab",tar);

prefab.tag = "Enemy";

  当我有了Enemey2b_0.prefab文件时,再Reimport Enemy.FBX时会运行成功,没有任何报错。

  也就是说此时prefab不是空对象了。

  那么上述操作其实是异步操作?

 

一段代码两个问题点没搞明白,我也是服了我自己了。

  

完整代码

using UnityEngine;
using UnityEditor;

public class ProcessModel : AssetPostprocessor
{
    
    private void OnPostprocessModel(GameObject input)
    {
        //if (input.name != "Enemy2b") return;

        //取得导入模型相关信息
        ModelImporter importer = assetImporter as ModelImporter;

        //将该模型从工程中读取出来
        string path = "Assets/airplane/Enemy2b.FBX";
        //path = importer.assetPath;

        GameObject tar = AssetDatabase.LoadAssetAtPath<GameObject>(path);

        //Debug.Log(importer.assetPath);
        Debug.Log(tar);
        //return;

        //将这个模型创建为Prefab
        //GameObject prefab = PrefabUtility.SaveAsPrefabAsset(tar, "Assets/Prefabs/Enemey2b_0.prefab");
        GameObject prefab = PrefabUtility.CreatePrefab("Assets/Prefabs/Enemey2b_0.prefab",tar);

        prefab.tag = "Enemy";

        foreach (Transform obj in prefab.GetComponentInChildren<Transform>())
        {
            if (obj.name == "col")
            {
                //取消碰撞模型的显示
                MeshRenderer r = obj.GetComponent<MeshRenderer>();
                r.enabled = false;

                //添加Mesh 碰撞体
                if (obj.gameObject.GetComponent<MeshCollider>() == null)
                {
                    obj.gameObject.AddComponent<MeshCollider>();
                }
                obj.tag = "Enemy";
            }
        }

        //设置刚体
        Rigidbody rigid = prefab.AddComponent<Rigidbody>();
        rigid.useGravity = false;
        rigid.isKinematic = true;

        //为prefab 添加音乐组件
        prefab.AddComponent<AudioSource>();

        //获取子弹prefab
        GameObject rocket = AssetDatabase.LoadAssetAtPath<GameObject>("Assets/Prefabs/EnemyRocket.prefab");

        //取得爆炸效果prefab
        GameObject fx = AssetDatabase.LoadAssetAtPath<GameObject>("Assets/FX/Explosion.prefab");

        //添加敌人脚本
        SuperEnemy enemy = prefab.AddComponent<SuperEnemy>();
        enemy.m_life = 5;
        enemy.m_point = 5;
        enemy.m_rocket = rocket.transform;
        enemy.m_explosionFx = fx.transform; 
    }
}

 

标签:prefab,tar,GameObject,FBX,LoadAssetAtPath,AssetDatabase,path,Enemy2b
From: https://www.cnblogs.com/weiyanei/p/17739076.html

相关文章

  • FBX模型解析与格式转换
    FBX格式简介FBX格式是一种3D通用模型文件格式。FBX格式是Autodesk公司收购Kaydara以后,研发的一种3D通用模型文件。包含动画、材质特性、贴图、骨骼动画、灯光、摄像机等信息。FBX格式用于在诸如3dsMax、Maya、Softimage等软件间进行模型、材质、动作和摄影机信息的互导。FBX最大的......
  • Unity FBX导入后,材质灰显不可编辑
    导入后要编辑材质的话,需要修改一个地方location这里表示材质的选择方式,embeddedmaterials(内嵌材料)修改成ExternalMaterials(外部材料)点apply,unity会自动帮你新建Materials文件夹,你就会获得对应材质贴图的材质球了......
  • Blender如何给fbx模型添加材质贴图并导出带有材质贴图的模型
    推荐:使用NSDT场景编辑器快速助你搭建可二次编辑的3D应用场景此教程适合新手用户,专业人士直接可直接绕路。  本教程中介绍了利用Blender建模软件,只需要简单几步就可以为模型添加材质贴,图,并且导出带有材质的模型文件。1、第一步,打开Blender软件,导入模型:(本教程使用一个简单立方......
  • Unity 在AssetPostprocessor内使用AssetDataBase是不安全的行为(尤其在Build前进行Lib
    https://docs.unity3d.com/Manual/AssetDatabaseCustomizingWorkflow.html在Build前进行Library的删除,读取Asset是不安全的行为,需要使用C#的IOSystem进行操作AssetImportOrderIfyouarescriptingusingtheAssetDatabaseclass,it’simportanttounderstandhowtheor......
  • Unity转出FBX模型(Exporter插件)
    Unity转出FBX模型为了解决在Unity场景修改过导出的模型,以后给美工修改不了预制体的问题Unity版本要求:2021.3.6f1c1(包括但不限于此版本以上)下载插件场景中选中模型任意模型点击导出FBX导出模型设置路径......
  • Ubuntu下,已经编译了OSG,如何增加OsgFbx插件,支持读取.fbx格式文件[转]
    最近在搞OSG相关的东西,美术给了个.fbx格式的模型,但死活无法加载,在网上搜了一圈,发现需要增加个插件才能支持这种格式的模型读取。一、osg支持的文件格式列表可以参看下这篇博文[原][资料整理][osg]osgDB文件读取插件,工作机制,支持格式,自定义插件-南水之源-博客园二、在fbx官......
  • threejs加载带材质的fbx格式模型
    threejs加载带材质的fbx格式模型loadFBX(){letmanager=newLoadingManager();manager.addHandler(/\.tga$/i,newTGALoader());......
  • 解决Revit导出FBX模型材质丢失的问题
    初次使用Revit导出fbx格式模型,在导出模型后发现模型材质丢失了,上网查询之后也没到具体原因是什么,不过倒是找到了解决方式:在Revit中安装naviswork插件,然后从revit中导出nwc......
  • 38、blender的fbx导出,以及fbx重新导入寻找材质贴图
    -z向前,y向上。  “应用变换”选项要勾选。 选择“useembedded materials""by base texturename""projectwide"然后点击“search andremap"可以根......
  • threejs FBXLoader 加载动画
    functioncreateObject(){constloader=newTHREE.FBXLoader();loader.load("Fish.fbx",function(object){object.mixer=newTHREE.AnimationMixer(obj......