您的位置:首页 > 移动开发 > Unity3D

unity3d 依赖关系获取预制件任意资源

2015-09-11 11:14 435 查看
前段时间策划们想知道UI预制件中使用了哪些音效

N多预制件、N多音效!!

如果纯人工整理的话这还不累成狗?

累成狗不说,还容易出错

所以获取音频剪辑小工具就诞生了,将策划从死亡边缘拉了回来

我们先看一下相关API手册:http://game.ceeger.com/Script/EditorUtility/EditorUtility.CollectDependencies.html

这玩意可好用了,之前也用它做过获取预制件公共资源工具

看看名字:“收集依赖关系”

那还不简单明了了,有依赖关系的东西都能获取过来嘛

我写了个方法,支持获取任意类型

这个方法你可以直接copy去用,不用自己写的。

使用方法也很简单,在这里我提供一个完整的获取预制件音频剪辑的例子。上代码咯

#region HeadComments
/* ========================================================================
* Copyright (C) 2015 Arthun
*
* 作    者:Arthun
* 文件名称:ArthunTools
* 功    能:升哥哥工具包
* 创建时间:2015/09/11 2:15:20
* 版    本:v1.0.0
*
* [修改日志]
* 修改者: 时间: 修改内容:
*
* =========================================================================
*/
#endregion

using System.Collections.Generic;
using UnityEditor;
using UnityEngine;

public class ArthunTools : EditorWindow
{
/// 音频剪辑信息 <summary>
///
/// </summary>
public class AudioClipInfo
{
public string prefab = "";
public string audio = "";
}

/// 选中预制件(可多选)后按 Alt + G 键获取 <summary>
///
/// </summary>
[MenuItem("Arthun Tools/Get Select Prefabs Info &G")]
static void GetSelectPrefab()
{
GameObject[] gos = Selection.gameObjects;

Debug.Log("getCount:" + gos.Length.ToString());

if (gos.Length == 0)
return;

List<AudioClipInfo> audioClipsInfo = new List<AudioClipInfo>();
foreach (GameObject go in gos)
{
#region 依赖关系获取音频
List<AudioClip> audioClips = GetPrefabDepe<AudioClip>(go);

foreach (AudioClip ac in audioClips)
{
if (ac != null)
{
AudioClipInfo info = new AudioClipInfo();
info.prefab = go.name;
info.audio = ac.name;
audioClipsInfo.Add(info);
}
}
#endregion
}

foreach (AudioClipInfo info in audioClipsInfo)
{
Debug.Log(string.Format("prefab:{0}    audio:{1}", info.prefab, info.audio));
}

Debug.Log("soundCount:" + audioClipsInfo.Count.ToString());
}

/// 获取预制件依赖 <summary>
///
/// </summary>
/// <typeparam name="T">欲获取的类型</typeparam>
/// <param name="go"></param>
/// <returns></returns>
static List<T> GetPrefabDepe<T>(GameObject go)
{
List<T> results = new List<T>();
Object[] roots = new Object[] { go };
Object[] dependObjs = EditorUtility.CollectDependencies(roots);
foreach (Object dependObj in dependObjs)
{
if (dependObj != null && dependObj.GetType() == typeof(T))
{
results.Add((T)System.Convert.ChangeType(dependObj, typeof(T)));
}
}

return results;
}
}


文中不足之处欢迎批评指正

本文链接:http://www.cnblogs.com/shenggege/p/4799801.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: