Unity脚本ID查看

做了个小工具用来查看脚本的file ID和guid。有什么用呢?比如重构代码后prefab上的组件missing了,可以直接改prefab的yaml文件里的相应file ID和guid,就能重新关联好了。

附上代码,做个备忘。

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

namespace YX
{
    public class ScriptIDViewer : EditorWindow
    {
        [MenuItem("Debug/ScriptIDViewer")]
        public static void Open()
        {
            var wnd = GetWindow<ScriptIDViewer>("ScriptIDViewer");
            wnd.Show();
            wnd.minSize = new Vector2(600, 400);
            wnd.maxSize = new Vector2(600, 400);
        }

        private void Awake()
        {
            m_material = new Material(Shader.Find("Hidden/Internal-Colored"));
            m_material.hideFlags = HideFlags.HideAndDontSave;
        }

        private void OnGUI()
        {
            EditorGUILayout.BeginVertical();
            EditorGUILayout.Space();
            GetId();
            DrawLine();
            GetScriptId();
            DrawLine();
            GetAssetFromId();
            DrawLine();
            GetDllScriptId();
            EditorGUILayout.Space();
            EditorGUILayout.EndVertical();
        }

        private MonoBehaviour _mono;
        void GetId()
        {
            _mono = EditorGUILayout.ObjectField(_mono, typeof(MonoBehaviour), true) as MonoBehaviour;
            if (_mono)
            {
                string guid;
                long fid;
                var script = MonoScript.FromMonoBehaviour(_mono);
                var path = AssetDatabase.TryGetGUIDAndLocalFileIdentifier(script, out guid, out fid);
                EditorGUILayout.TextField("fileID", fid.ToString());
                EditorGUILayout.TextField("guid", guid);
            }
        }

        private MonoScript _script;
        void GetScriptId()
        {
            _script = EditorGUILayout.ObjectField(_script, typeof(MonoScript), true) as MonoScript;
            if (_script)
            {
                string guid;
                long fid;
                var path = AssetDatabase.TryGetGUIDAndLocalFileIdentifier(_script, out guid, out fid);
                EditorGUILayout.TextField("fileID", fid.ToString());
                EditorGUILayout.TextField("guid", guid);
            }
        }

        string _guid, _fid;
        string _result;
        void GetAssetFromId()
        {
            EditorGUILayout.BeginHorizontal();
            _fid = EditorGUILayout.TextField("fileID", _fid);
            _guid = EditorGUILayout.TextField("guid",_guid);
            if (GUILayout.Button("find"))
            {
                _result = "未找到";
                var path = AssetDatabase.GUIDToAssetPath(_guid);
                var assets = AssetDatabase.LoadAllAssetsAtPath(path);
                string guid;
                long fid;

                for (int i = 0; i < assets.Length; i++)
                {
                    var asset = assets[i];
                    var s = AssetDatabase.TryGetGUIDAndLocalFileIdentifier(asset, out guid, out fid);
                    if (s && _fid == fid.ToString())
                    {
                        var script = asset as MonoScript;
                        string name;
                        if (script != null)
                            name = script.GetClass().FullName;
                        else
                            name = asset.name;
                        _result = string.Format("{0}->{1}", path, name);
                        break;
                    }
                }
            }
            EditorGUILayout.EndHorizontal();
            GUILayout.TextField(_result);
        }


        private DefaultAsset _dll;
        string _dll_guid;
        long _dll_fid;
        Object[] _dllAssets;
        private float _scrollValueX = 0;
        private float _scrollValueY = 0;
        private Vector2 _scroll;
        void GetDllScriptId()
        {
            _dll = EditorGUILayout.ObjectField(".dll",_dll, typeof(DefaultAsset), true) as DefaultAsset;
            GUILayout.BeginHorizontal();
            EditorGUILayout.TextField("fileID", _dll_fid.ToString());
            EditorGUILayout.TextField("guid", _dll_guid);
            GUILayout.EndHorizontal();
            if (GUILayout.Button("Open") && _dll != null)
            {
                var path = AssetDatabase.GetAssetPath(_dll);
                if (path.EndsWith(".dll"))
                    _dllAssets = AssetDatabase.LoadAllAssetsAtPath(path);
                else
                    _dllAssets = null;
            }

            if (_dllAssets != null && _dllAssets.Length > 0)
            {
                _scroll = EditorGUILayout.BeginScrollView(_scroll, GUILayout.Width(600));
                for (int i = 0; i < _dllAssets.Length; i++)
                {
                    EditorGUILayout.BeginHorizontal();
                    GUILayout.TextField(_dllAssets[i].name);
                    if (GUILayout.Button("view",GUILayout.Width(100)))
                    {
                        var s = AssetDatabase.TryGetGUIDAndLocalFileIdentifier(_dllAssets[i], out _dll_guid, out _dll_fid);
                    }
                    EditorGUILayout.EndHorizontal();
                }
                EditorGUILayout.EndScrollView();
            }
        }

        Material m_material;
        void DrawLine()
        {
            EditorGUILayout.Space(20);
            if (Event.current.type == EventType.Repaint)
            {
                var lastRect = GUILayoutUtility.GetLastRect();
                var rect = new Rect(0, lastRect.y, 600, 20);
                GL.PushMatrix();
                m_material.SetPass(0);
                GL.LoadPixelMatrix();
                GL.Begin(GL.QUADS);
                GL.Color(new Color32(78, 201, 176, 255));
                GL.Vertex3(rect.x, rect.y, 0);
                GL.Vertex3(rect.x + rect.width, rect.y, 0);
                GL.Vertex3(rect.x + rect.width, rect.y + rect.height, 0);
                GL.Vertex3(rect.x, rect.y + rect.height, 0);
                GL.End();
                GL.PopMatrix();
            }
        }
    }
}

另外的,这个博主讲得很好了:https://blog.csdn.net/gz_huangzl/article/details/52486509

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值