如何从Assets文件夹中获取所有预制件?在编辑器中获取无效的强制转换异常

时间:2018-12-29 11:06:03

标签: c# unity3d

GameObject[] prefabs = (GameObject[])Resources.LoadAll("Assets/Animations/Test");

主要目标是获取所有预制件,并在Test下有子文件夹的情况下进行递归。

3 个答案:

答案 0 :(得分:1)

资产/资源中创建目录动画/测试

$usersTeamsResult = $getUsersTeams->fetchAll(PDO::FETCH_ASSOC);
            $myArray = $usersTeamsResult[0];
            $usersTeams = json_decode(array_shift($myArray), true);

它将在 Test 及其子文件夹中获取所有类型为 GameObject 的文件。

答案 1 :(得分:0)

Resourcess.LoadAll在Resources文件夹中寻找。如果要在资产中查找某些内容,则应使用AssetDatabase.FindAssets。

AssetDatabase.FindAssets("t:prefab", new string[] {"Assets/Animations/Test"});

如果您想过滤掉其他资产,还应该检查其docs

答案 2 :(得分:0)

对于 Unity 编辑器端代码,为某事自动化编辑器脚本。 可能是这样的:

string[] guids = AssetDatabase.FindAssets( "t:Prefab" );

foreach( var guid in guids )
{
    var path = AssetDatabase.GUIDToAssetPath( guid );
    GameObject go = AssetDatabase.LoadAssetAtPath<GameObject>( path );

    // For example: searching for broken prefab 
    // recursively go through all Transform(s) and check 
    // name.Contains( "Missing Prefab" )

    // Or maybe find certain type of script using GetComponent API family
    // Or maybe find a missing (broken) MonoBehaviour script using GameObjectUtility.GetMonoBehavioursWithMissingScriptCount
    // etc

用于编辑和修改

请注意,像上述方法一样迭代预制件有利于读取但不适用于保存,您将不得不通过另一个箍使其变脏,保存并刷新到磁盘等。

直接编辑“源资产”预制件的一种方法是使用 PrefabUtility API。

对于 2020.1+,请参阅 https://docs.unity3d.com/2020.1/Documentation/ScriptReference/PrefabUtility.EditPrefabContentsScope.html

老年人请参阅https://forum.unity.com/threads/how-do-i-edit-prefabs-from-scripts.685711/ (解决方案大约在中后期)