Unity入门FBX模型和资源打包

Posted Lampard猿奋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity入门FBX模型和资源打包相关的知识,希望对你有一定的参考价值。

【Unity入门】FBX模型和资源打包

    大家好,我是Lampard~~

    欢迎来到Unity入门系列博客,所学知识来自B站阿发老师~感谢

(一)FBX模型

(1)导入FBX模型

    上一篇文章我们学习了,在Unity编译器中创建3D物体,并且修改其材质。今天我们学习下使用Unity中常用的3D模型FBX模型

FBX格式是由Autodesk开发的一种通用的三维文件格式,支持储存更加复杂的3D数据和动画信息,适用于不同的3D软件之间的数据交换和共享

    虽然Unity支持在编译器中创建3D模型,但是那都是比较简单的无法满足目前游戏项目的需求。一般情况下,我们都是由美术同学输出模型资源,然后导入到编译器中去,如下图

   这里是一个设计好的铅笔形状的FBX模型,我们先不管三七二十一,先把它导入到项目中去。而导入的方式也很简单,只需要拖动至assert目录下即可

(2)FBX模型组成

    FBX模型有一个小箭头,我们点击它展开就可以看到:一个简单的FBX文件包含了一个mesh网格文件,一个materials材质文件一个psd纹理,嗯这就和我们上节课的内容对上了

     

(3)使用FBX模型创建3D Object

    模型已经导入至编译器中了,那么怎么样利用它创建3d对象呢?很简单又是拖...只需要拖到Scene界面就可以了,也可以拖到层级管理器下,学到这里我感觉这个场景编辑器和cocos的UI编辑器其实也没多差

    使用FBX创建的3D模型,我们会发现它的材质是不可以直接修改的,因为它是一个只读文件,所以在编译器中选中铅笔的材质是灰色一片:

 

    如果我们需要修改其材质要怎么做呢?当然我们可以使用上一节课的方法,直接发一个新的材质拖动到这个物体中,但是更多情况下,我们可能只想微调一下这个材质的效果,这是我们就需要先把原有的模型材质数据给读取出来,我们选中这个FBX文件,点击其material选项,利用Location选框就可以到处这个材质数据

     导出之后,可以看到多了一个铅笔的材质信息,选中之后就可以修改其详细数据了

好啦今天就到这里,感谢阅读!!!
点赞,关注!!!

Unity3D之Mecanim动画系统学习笔记:Mecanim动画的资源加载相关

资源加载是必备的知识点,这里就说说Mecanim动画的资源如何打包及加载。

注意,Unity4.x和Unity5.x的AssetBundle打包策略不一样,本笔记是基于Unity4.x的AssetBundle进行打包的。

我们一般使用FBX类型的模型及动画文件,而动画文件的储存一般有两种情况,一是所有的动画和模型都一起存放到一个文件中,还有一种情况是模型单独一个文件而动画单独一个文件。这里我们就两种情况都看一下。

使用的资源是Unity3D自带的以及从一本教材中取出的两种类型的动画资源,同时需要对其动画创建对应的Animator Controller。

模型动画都存放在一个文件中的情况

一个FBX文件保存了模型、骨骼和动画,如下图:

下面是配置的Animator Controller:

需要注意的是,官方并没有提供为Animator设置Animator Controller的接口,所以我们必须将配置好的GameObject制作为一个预制件进行加载。

Resources加载

复制代码
 1 using UnityEngine;
 2 using System.Collections;
 3 
 4 public class AllInOneResourcesLoad : MonoBehaviour
 5 {
 6     private Animator _animator;
 7 
 8     void Start()
 9     {
10         GameObject go = Resources.Load<GameObject>("AllInOne/ConstructorPrefab");
11 
12         GameObject man = Instantiate(go) as GameObject;
13         _animator = man.GetComponent<Animator>();
14     }
15     
16     void OnGUI()
17     {
18         if(GUI.Button(new Rect(0, 0, 100, 30), "idle"))
19         {
20             _animator.SetBool("walk", false);
21             _animator.SetBool("run", false);
22         }
23         if(GUI.Button(new Rect(100, 0, 100, 30), "walk"))
24         {
25             _animator.SetBool("walk", true);
26             _animator.SetBool("run", false);
27         }
28         if(GUI.Button(new Rect(200, 0, 100, 30), "run"))
29         {
30             _animator.SetBool("walk", false);
31             _animator.SetBool("run", true);
32         }
33         if(GUI.Button(new Rect(300, 0, 100, 30), "jump"))
34         {
35             _animator.SetTrigger("jump");
36         }
37     }
38 }
复制代码

AssetBundle加载

打包

复制代码
 1 using UnityEngine;
 2 using UnityEditor;
 3 
 4 public class CreateAllInOneAB
 5 {
 6     [MenuItem("Tool/CreateAllInOneAB")]
 7     private static void Create()
 8     {
 9         BuildPipeline.BuildAssetBundle(null, new[]
10             {
11                 AssetDatabase.LoadAssetAtPath("Assets/Resources/AllInOne/ConstructorPrefab.prefab", typeof(GameObject))
12             },
13             Application.streamingAssetsPath + "/AllInOne.assetbundle",
14             BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.CompleteAssets | BuildAssetBundleOptions.UncompressedAssetBundle,
15             BuildTarget.StandaloneWindows64);
16     }
17 }
复制代码

加载

复制代码
 1 using UnityEngine;
 2 using System.Collections;
 3 
 4 public class AllInOneAssetBundleLoad : MonoBehaviour
 5 {
 6     private Animator _animator;
 7 
 8     void Start()
 9     {
10         AssetBundle assetBundle = AssetBundle.CreateFromFile(Application.streamingAssetsPath + "/AllInOne.assetbundle");
11 
12         GameObject go = assetBundle.Load("ConstructorPrefab", typeof(GameObject)) as GameObject;
13 
14         GameObject man = Instantiate(go) as GameObject;
15         _animator = man.GetComponent<Animator>();
16     }
17 
18     void OnGUI()
19     {
20         if(GUI.Button(new Rect(0, 0, 100, 30), "idle"))
21         {
22             _animator.SetBool("walk", false);
23             _animator.SetBool("run", false);
24         }
25         if (GUI.Button(new Rect(100, 0, 100, 30), "walk"))
26         {
27             _animator.SetBool("walk", true);
28             _animator.SetBool("run", false);
29         }
30         if (GUI.Button(new Rect(200, 0, 100, 30), "run"))
31         {
32             _animator.SetBool("walk", false);
33             _animator.SetBool("run", true);
34         }
35         if (GUI.Button(new Rect(300, 0, 100, 30), "jump"))
36         {
37             _animator.SetTrigger("jump");
38         }
39     }
40 }
复制代码

模型动画分开存放的情况

还有一种情况是模型和动画是分为多个FBX文件存放的,比如下面是模型文件:

虽然有一个Take 001的动画,但是实际上我们并不使用该动画,而是使用下面仅保存了动画的FBX文件:

下面是配置的Animator Controller:

除了没有提供设置Animator Controller的接口,也无法在运行时对动画剪辑进行增加删除的操作,所以我们一般打包时就收集所有的依赖项一起打包,归根结底还是只需要一个制作好的预制件即可。

从这个角度看,其实是否将动画进行拆分最终的使用方式都是一样的。

Resources加载

复制代码
 1 using UnityEngine;
 2 using System.Collections;
 3 
 4 public class ResourcesLoad : MonoBehaviour
 5 {
 6     private Animator _animator;
 7 
 8     void Start()
 9     {
10         GameObject go = Resources.Load<GameObject>("ZombieNurse/ZombieNursePrefab");
11 
12         GameObject man = Instantiate(go) as GameObject;
13         _animator = man.GetComponent<Animator>();
14     }
15 
16     void OnGUI()
17     {
18         if(GUI.Button(new Rect(0, 0, 100, 30), "idle"))
19         {
20             _animator.SetBool("run", false);
21         }
22         if(GUI.Button(new Rect(100, 0, 100, 30), "run"))
23         {
24             _animator.SetBool("run", true);
25         }
26         if(GUI.Button(new Rect(200, 0, 100, 30), "attack"))
27         {
28             _animator.SetTrigger("attack");
29         }
30         if(GUI.Button(new Rect(300, 0, 100, 30), "dead"))
31         {
32             _animator.SetTrigger("dead");
33         }
34     }
35 }
复制代码

AssetBundle加载

打包

复制代码
 1 using UnityEditor;
 2 using UnityEngine;
 3 
 4 public class CreateAB
 5 {
 6     [MenuItem("Tool/CreateAB")]
 7     private static void Create()
 8     {
 9         BuildPipeline.BuildAssetBundle(null, new[]
10             {
11                 AssetDatabase.LoadAssetAtPath("Assets/Resources/ZombieNurse/ZombieNursePrefab.prefab", typeof(GameObject))
12             },
13             Application.streamingAssetsPath + "/AB.assetbundle",
14             BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.CompleteAssets | BuildAssetBundleOptions.UncompressedAssetBundle,
15             BuildTarget.StandaloneWindows64);
16     }
17 }
复制代码

加载

复制代码
 1 using UnityEngine;
 2 using System.Collections;
 3 
 4 public class AssetBundleLoad : MonoBehaviour
 5 {
 6     private Animator _animator;
 7 
 8     void Start()
 9     {
10         AssetBundle assetBundle = AssetBundle.CreateFromFile(Application.streamingAssetsPath + "/AB.assetbundle");
11 
12         GameObject go = assetBundle.Load("ZombieNursePrefab", typeof(GameObject)) as GameObject;
13 
14         GameObject man = Instantiate(go) as GameObject;
15         _animator = man.GetComponent<Animator>();
16     }
17 
18     void OnGUI()
19     {
20         if(GUI.Button(new Rect(0, 0, 100, 30), "idle"))
21         {
22             _animator.SetBool("run", false);
23         }
24         if(GUI.Button(new Rect(100, 0, 100, 30), "run"))
25         {
26             _animator.SetBool("run", true);
27         }
28         if(GUI.Button(new Rect(200, 0, 100, 30), "attack"))
29         {
30             _animator.SetTrigger("attack");
31         }
32         if(GUI.Button(new Rect(300, 0, 100, 30), "dead"))
33         {
34             _animator.SetTrigger("dead");
35         }
36     }
37 }
复制代码

以上是关于Unity入门FBX模型和资源打包的主要内容,如果未能解决你的问题,请参考以下文章

游戏开发实战下载原神模型,PMX转FBX,导入到Unity中,卡通渲染,绑定人形动画(附Demo工程)

游戏开发实战下载原神模型,PMX转FBX,导入到Unity中,卡通渲染,绑定人形动画(附Demo工程)

Unity3D之Mecanim动画系统学习笔记:Mecanim动画的资源加载相关

Unity打包好的游戏可以反编译得到源码和资源吗

Unity如何打包Apk能压缩资源

如何从 Unity 导出带有纹理的 fbx?