lyh916

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  201 随笔 :: 0 文章 :: 12 评论 :: 21万 阅读

参考链接:

https://blog.csdn.net/qq_37776196/article/details/85324348

 

DebugCodeLocation.cs

复制代码
 1 using System.Reflection;
 2 using UnityEngine;
 3 
 4 public class DebugCodeLocation
 5 {
 6 #if UNITY_EDITOR
 7     // 处理asset打开的callback函数
 8     [UnityEditor.Callbacks.OnOpenAssetAttribute(0)]
 9     static bool OnOpenAsset(int instance, int line)
10     {
11         string stack_trace = GetStackTrace();
12         if (!string.IsNullOrEmpty(stack_trace))
13         {
14             Debug.LogError("DebugCodeLocation:" + stack_trace);
15             return true;
16         }
17         return false;
18     }
19 
20     static string GetStackTrace()
21     {
22         // 找到UnityEditor.EditorWindow的assembly
23         var assembly_unity_editor = Assembly.GetAssembly(typeof(UnityEditor.EditorWindow));
24         if (assembly_unity_editor == null) return null;
25 
26         // 找到类UnityEditor.ConsoleWindow
27         var type_console_window = assembly_unity_editor.GetType("UnityEditor.ConsoleWindow");
28         if (type_console_window == null) return null;
29         // 找到UnityEditor.ConsoleWindow中的成员ms_ConsoleWindow
30         var field_console_window = type_console_window.GetField("ms_ConsoleWindow", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic);
31         if (field_console_window == null) return null;
32         // 获取ms_ConsoleWindow的值
33         var instance_console_window = field_console_window.GetValue(null);
34         if (instance_console_window == null) return null;
35 
36         // 如果console窗口时焦点窗口的话,获取stacktrace
37         if ((object)UnityEditor.EditorWindow.focusedWindow == instance_console_window)
38         {
39             // 通过assembly获取类ListViewState
40             var type_list_view_state = assembly_unity_editor.GetType("UnityEditor.ListViewState");
41             if (type_list_view_state == null) return null;
42 
43             // 找到类UnityEditor.ConsoleWindow中的成员m_ListView
44             var field_list_view = type_console_window.GetField("m_ListView", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
45             if (field_list_view == null) return null;
46 
47             // 获取m_ListView的值
48             var value_list_view = field_list_view.GetValue(instance_console_window);
49             if (value_list_view == null) return null;
50 
51             // 找到类UnityEditor.ConsoleWindow中的成员m_ActiveText
52             var field_active_text = type_console_window.GetField("m_ActiveText", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
53             if (field_active_text == null) return null;
54 
55             // 获得m_ActiveText的值,就是我们需要的stacktrace
56             string value_active_text = field_active_text.GetValue(instance_console_window).ToString();
57             return value_active_text;
58         }
59 
60         return null;
61     }
62 }
63 #endif
复制代码

 

效果如下(双击log就会打印其内容):

 

核心在于OnOpenAssetAttribute,其API介绍如下:

https://docs.unity3d.com/ScriptReference/Callbacks.OnOpenAssetAttribute.html

当在unity中双击打开一个资源就会回调方法,当返回true时表示已经对打开资源进行了处理;当返回false时表示会用一个外部工具打开资源(例如双击log打开调用脚本)

这个属性可以传入一个int型参数(起始为0),表示调用先后,例如OnOpenAssetAttribute(0)比OnOpenAssetAttribute(1)先调用

posted on   艰苦奋斗中  阅读(679)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示