Editor编辑器扩展开发之2个常用遍历gameobject和判断预制体方法

网上转载

判断是否预制体

 /// <summary>
    /// 获取预制体资源路径。
    /// </summary>
    /// <param name="gameObject"></param>
    /// <returns></returns>
    public string GetPrefabAssetPathAfter2017(GameObject gameObject)
    {
        /* Unity中一个预制体对象可能处于3种状态:
            位于Project中,是PrefabAsset;
            位于Scene中,是PrefabInstance;
            位于PrefabMode Scene中,既不是PrefabAsset也不是Prefab Instance。
         */
        // Project中的Prefab是Asset不是Instance
        if (UnityEditor.PrefabUtility.IsPartOfPrefabAsset(gameObject))
        {
            // 预制体资源就是自身
            return UnityEditor.AssetDatabase.GetAssetPath(gameObject);
        }

        // Scene中的Prefab Instance是Instance不是Asset
        if (UnityEditor.PrefabUtility.IsPartOfPrefabInstance(gameObject))
        {
            // 获取预制体资源
            var prefabAsset = PrefabUtility.GetCorrespondingObjectFromOriginalSource(gameObject);
            return UnityEditor.AssetDatabase.GetAssetPath(prefabAsset);
        }

        // PrefabMode中的GameObject既不是Instance也不是Asset
        var prefabStage = UnityEditor.Experimental.SceneManagement.PrefabStageUtility.GetPrefabStage(gameObject);
        if (prefabStage != null)
        {
            // 预制体资源:prefabAsset = prefabStage.prefabContentsRoot
            return prefabStage.prefabAssetPath;
        }

        // 不是预制体
        return null;
    }

遍历场景中所有GameObject

   /// <summary>
    /// 方法 1:获取这个场景的所有对象
    /// </summary>
    /// <returns></returns>
    List<GameObject> GetAllGo()
    {
        List<GameObject> allGOs = new List<GameObject>();
     //   GameObject[] rootGOs = gameObject.scene.GetRootGameObjects();
        GameObject[] rootGOs = SceneManager.GetActiveScene().GetRootGameObjects();
 
        for (int i = 0; i < rootGOs.Length; i++)
            GetAllChildren(rootGOs[i].transform, allGOs);
        return allGOs;
    }
    void GetAllChildren(Transform current, List<GameObject> arrayToFill)
    {
        arrayToFill.Add(current.gameObject);
 
        for (int i = 0; i < current.childCount; i++)
            GetAllChildren(current.GetChild(i), arrayToFill);
    }
    //方法 2
    private List<GameObject> GetAllSceneObjectsWithInactive()
    {
        var allTransforms = Resources.FindObjectsOfTypeAll(typeof(Transform));
        var previousSelection = Selection.objects;
        Selection.objects = allTransforms.Cast<Transform>()
            .Where(x => x != null)
            .Select(x => x.gameObject)
            .Where(x => x != null && !x.activeInHierarchy)
            .Cast<UnityEngine.Object>().ToArray();
 
        var selectedTransforms = Selection.GetTransforms(SelectionMode.Editable | SelectionMode.ExcludePrefab);
        Selection.objects = previousSelection;
 
        return selectedTransforms.Select(tr => tr.gameObject).ToList();
    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

avi9111

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值