查看: 915|回复: 1
打印 上一主题 下一主题

[其他] Unity3D技术之资源数据库 (AssetDatabase)详解

[复制链接]

2722

主题

42

听众

3万

积分

资深设计师

Rank: 7Rank: 7Rank: 7

纳金币
38266
精华
111

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2015-1-31 19:39:12 |只看该作者 |倒序浏览
资源数据库 (AssetDatabase)
资源数据库 (AssetDatabase) 是允许您访问工程中的资源的 API。此外,其提供方法供您查找和加载资源,还可创建、删除和修改资源。Unity 编辑器 (Editor) 在内部使用资源数据库 (AssetDatabase) 追踪资源文件,并维护资源和引用资源的对象之间的关联。Unity 需要追踪工程文件夹发生的所有变化,如需访问或修改资源数据,您应始终使用资源数据库 (AssetDatabase) API,而非文件系统。 资源数据库 (AssetDatabase) 接口仅适用于编辑器,不可用于内置播放器。和所有其他编辑器类一样,其只适用于置于编辑器 (Editor) 文件夹中的脚本(只在主要的资源 (Assets) 文件夹中创建名为“编辑器”的文件夹(不存在该文件夹的情况下))。

导入资源
通常,Unity 只在需要时自动导入已拖放至该工程的资源,但也可能在脚本控制下导入这些资源。为此,您可以使用以下示例中的 AssetDatabase.ImportAsset 类函数。
  1. using UnityEngine;
  2. using UnityEditor;

  3. public class ImportAsset {
  4.         [MenuItem ("AssetDatabase/ImportExample")]
  5.         static void ImportExample ()
  6.         {
  7.                 AssetDatabase.ImportAsset("Assets/Textures/texture.jpg", ImportAssetOptions.Default);
  8.         }
  9. }
复制代码
您也可将额外的 AssetDatabase.ImportAssetOptions 类型参数传递至资源数据库 (AssetDatabase) 。脚本参考手册页面记录了不同的选项及其对函数行为的影响。

加载资源
如果将资源添加至场景或在检视 (Inspector) 面板中编辑这些资源,则编辑器仅在需要时加载资源。但是,您可以使用以下脚本加载和访问资源:AssetDatabase.LoadAssetAtPath、AssetDatabase.LoadMainAssetAtPath、AssetDatabase.LoadAllAssetRepresentationsAtPath 和 AssetDatabase.LoadAllAssetsAtPath。有关更多详细信息,请参阅脚本文档。
  1. using UnityEngine;
  2. using UnityEditor;

  3. public class ImportAsset {
  4.         [MenuItem ("AssetDatabase/LoadAssetExample")]
  5.         static void ImportExample ()
  6.         {
  7.                 Texture2D t = AssetDatabase.LoadAssetAtPath("Assets/Textures/texture.jpg", typeof(Texture2D)) as Texture2D;
  8.         }
  9. }
复制代码
使用 AssetDatabase 操作文件
Unity 将保留资源文件的元数据,您决不可使用文件系统创建、移动或删除它们。相反,您应使用 AssetDatabase.Contains、AssetDatabase.CreateAsset、AssetDatabase.CreateFolder、AssetDatabase.RenameAsset、AssetDatabase.CopyAsset、AssetDatabase.MoveAsset、AssetDatabase.MoveAssetToTrash 和 AssetDatabase.DeleteAsset 进行上述操作。
  1. public class AssetDatabaseIOExample {
  2.         [MenuItem ("AssetDatabase/FileOperationsExample")]
  3.         static void Example ()
  4.         {
  5.                 string ret;

  6.                 // Create
  7.                 Material material = new Material (Shader.Find("Specular"));
  8.                 AssetDatabase.CreateAsset(material, "Assets/MyMaterial.mat");
  9.                 if(AssetDatabase.Contains(material))
  10.                         Debug.Log("Material asset created");

  11.                 // Rename
  12.                 ret = AssetDatabase.RenameAsset("Assets/MyMaterial.mat", "MyMaterialNew");
  13.                 if(ret == "")
  14.                         Debug.Log("Material asset renamed to MyMaterialNew");
  15.                 else
  16.                         Debug.Log(ret);

  17.                 // Create a Folder
  18.                 ret = AssetDatabase.CreateFolder("Assets", "NewFolder");
  19.                 if(AssetDatabase.GUIDToAssetPath(ret) != "")
  20.                         Debug.Log("Folder asset created");
  21.                 else
  22.                         Debug.Log("Couldn't find the GUID for the path");

  23.                 // Move
  24.                 ret = AssetDatabase.MoveAsset(AssetDatabase.GetAssetPath(material), "Assets/NewFolder/MyMaterialNew.mat");
  25.                 if(ret == "")
  26.                         Debug.Log("Material asset moved to NewFolder/MyMaterialNew.mat");
  27.                 else
  28.                         Debug.Log(ret);

  29.                 // Copy
  30.                 if(AssetDatabase.CopyAsset(AssetDatabase.GetAssetPath(material), "Assets/MyMaterialNew.mat"))
  31.                         Debug.Log("Material asset copied as Assets/MyMaterialNew.mat");
  32.                 else
  33.                         Debug.Log("Couldn't copy the material");
  34.                 // Manually refresh the Database to inform of a change
  35.                 AssetDatabase.Refresh();
  36.                 Material MaterialCopy = AssetDatabase.LoadAssetAtPath("Assets/MyMaterialNew.mat", typeof(Material)) as Material;

  37.                 // Move to Trash
  38.                 if(AssetDatabase.MoveAssetToTrash(AssetDatabase.GetAssetPath(MaterialCopy)))
  39.                         Debug.Log("MaterialCopy asset moved to trash");

  40.                 // Delete
  41.                 if(AssetDatabase.DeleteAsset(AssetDatabase.GetAssetPath(material)))
  42.                         Debug.Log("Material asset deleted");
  43.                 if(AssetDatabase.DeleteAsset("Assets/NewFolder"))
  44.                         Debug.Log("NewFolder deleted");

  45.                 // Refresh the AssetDatabase after all the changes
  46.                 AssetDatabase.Refresh();
  47.         }
  48. }
复制代码
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

100

主题

3

听众

7683

积分

高级设计师

Rank: 6Rank: 6

纳金币
2378
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

沙发
发表于 2015-1-31 20:48:51 |只看该作者
不错的教程耶。。。。。。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

关闭

站长推荐上一条 /1 下一条

手机版|纳金网 ( 闽ICP备08008928号

GMT+8, 2024-5-2 20:12 , Processed in 0.085010 second(s), 28 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部