Git Product home page Git Product logo

referencefinder's Introduction

Unity 引用查找

简介

  这是一个用来查找资源引用和依赖的插件,通过缓存来保存资源间的引用信息,通过树状结构直观的展示。
  由于是通过缓存进行实现的,所以在希望的到精确的引用信息时需要刷新缓存。不过由于缓存的存在,在资源改动较少的情况下,刷新速度较快,对使用影响较小。
  直接将文件夹拖到项目中即可使用。

环境

  • Unity 2018.4.0f1
  • Unity 2017.4.35f1
  • Unity 5.6.6f2

使用示例

  右键需要查找引用的文件或文件夹,点击 Find References In Project 进行查找。

按钮含义:
Refresh Data:刷新缓存 Model:切换引用和依赖 NeedUpdateState:是否需要根据当前文件的状态更新State栏。
Expand:展开列表 Collapse:折叠列表

  第三列的State为Changed代表这个资源被修改了,Missing代表资源被删除了,No Data代表缓存中没有该资源的信息。

实现方案

方案选择

  1.在每次需要查找时进行一次全局查找,保证查找的正确性。但是进行全局查找会很慢,因为查找资源依赖信息的接口GetDependencies本质上其实是对文本的查找(比如prefab中会以文本的形式记录prefab所引用资源的guiid和fileid),在不进行多线程查询优化的情况下这是一个很慢的过程,存储在机械硬盘上时会更慢。
  2.进行一次全局查找生成缓存,在进行查找时直接读取缓存(在资源改动时会出现引用信息不准确的问题),在资源变动时需要更新缓存,保持查找的正确性,不过由于缓存的存在,在资源没有太大的改动的情况下,刷新速度较快。

  这里选择了方案二。

查找及缓存

引用信息的生成:
  通过AssetDatabase.GetAllAssetPaths()获取项目中所有的资源路径。
  通过AssetDatabase.GetDependencies()获取每一个资源所依赖资源的信息。
  经过这两步之后就有了所有资源的依赖信息了。
  通过资源的依赖信息,我们就可以生成所有资源的引用信息了。
缓存:
  为了让缓存尽量的小,所以缓存只保存每个资源的guid、引用资源哈希值、依赖资源的信息。   其中引用资源哈希值时用于判断这个资源依赖的资源是否有修改,若有修改,则在刷新资源引用信息的时候需要重新读取这个资源的依赖信息,否则继续使用该信息。这个判断就是在资源改动较少时减少刷新时间的关键。
  在记录依赖时,没有直接记录依赖资源的guid,而是记录了资源在缓存中下标的位置,从而进一步缩小缓存的大小。

界面实现

  主要使用了Unity自带的TreeView实现树形界面的展示。

referencefinder's People

Contributors

blueberryzzz avatar jwhitecat avatar networm avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

referencefinder's Issues

serialzation error

System.Runtime.Serialization.SerializationException: Type UnityEngine.Hash128 is not marked as Serializable.
at System.Runtime.Serialization.Formatters.Binary.BinaryCommon.CheckSerializable (System.Type type, ISurrogateSelector selector, StreamingContext context) [0x0002c] in /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/BinaryCommon.cs:119
at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.GetObjectData (System.Object obj, System.Runtime.Serialization.Formatters.Binary.TypeMetadata& metadata, System.Object& data) [0x00054] in /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectWriter.cs:386
at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteObject (System.IO.BinaryWriter writer, Int64 id, System.Object obj) [0x00000] in /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectWriter.cs:306
at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteObjectInstance (System.IO.BinaryWriter writer, System.Object obj, Boolean isValueObject) [0x00062] in /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectWriter.cs:293
at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteValue (System.IO.BinaryWriter writer, System.Type valueType, System.Object val) [0x0006b] in /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectWriter.cs:748
at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteGenericArray (System.IO.BinaryWriter writer, Int64 id, System.Array array) [0x000e3] in /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectWriter.cs:519
at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteArray (System.IO.BinaryWriter writer, Int64 id, System.Array array) [0x00085] in /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectWriter.cs:471
at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteObjectInstance (System.IO.BinaryWriter writer, System.Object obj, Boolean isValueObject) [0x0004f] in /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectWriter.cs:290
at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteQueuedObjects (System.IO.BinaryWriter writer) [0x00005] in /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectWriter.cs:271
at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteObjectGraph (System.IO.BinaryWriter writer, System.Object obj, System.Runtime.Remoting.Messaging.Header[] headers) [0x0001f] in /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectWriter.cs:256
at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize (System.IO.Stream serializationStream, System.Object graph, System.Runtime.Remoting.Messaging.Header[] headers) [0x000a4] in /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/BinaryFormatter.cs:232
at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize (System.IO.Stream serializationStream, System.Object graph) [0x00000] in /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/BinaryFormatter.cs:211
at ReferenceFinderData.WriteToChache () [0x00143] in D:\WorkProjects\EditShot\Assets\Editor\ReferenceFinder\ReferenceFinderData.cs:173
at ReferenceFinderData.CollectDependenciesInfo () [0x0009e] in D:\WorkProjects\EditShot\Assets\Editor\ReferenceFinder\ReferenceFinderData.cs:39
UnityEngine.Debug:LogError(Object)
ReferenceFinderData:CollectDependenciesInfo() (at Assets/Editor/ReferenceFinder/ReferenceFinderData.cs:47)
ReferenceFinderWindow:InitDataIfNeeded() (at Assets/Editor/ReferenceFinder/ReferenceFinderWindow.cs:63)
ReferenceFinderWindow:FindRef() (at Assets/Editor/ReferenceFinder/ReferenceFinderWindow.cs:38)

我在一个新项目,使用了您的项目,出现了上述错误,向您请教一下。

重复显示

image
查找引用模式下,会有一些资源重复出现

error in unity 2019.4.40

System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary.
at System.Collections.Generic.Dictionary`2[TKey,TValue].get_Item (TKey key) [0x0001e] in :0
at ReferenceFinderData.UpdateReferenceInfo () [0x00037] in **\Assets\Editor\ReferenceFinder\ReferenceFinderData.cs:60
at ReferenceFinderData.CollectDependenciesInfo () [0x000c0] in **\Assets\Editor\ReferenceFinder\ReferenceFinderData.cs:43
UnityEngine.StackTraceUtility:ExtractStackTrace ()
UnityEngine.DebugLogHandler:LogFormat (UnityEngine.LogType,UnityEngine.Object,string,object[])
UnityEngine.Logger:Log (UnityEngine.LogType,object)
UnityEngine.Debug:LogError (object)

to resolve:
in ReferenceFinderData.UpdateReferenceInfo()

 foreach(var assetGuid in asset.Value.dependencies)
 {
    if (assetDict.ContainsKey(assetGuid))
       assetDict[assetGuid].references.Add(asset.Key);
 }

我们项目刷新以后的错误

System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary.
at System.ThrowHelper.ThrowKeyNotFoundException () [0x00000] in :0
at System.Collections.Generic.Dictionary2[TKey,TValue].get_Item (TKey key) [0x0001e] in <cfc149f8218b496788d8493c87de777a>:0 at ReferenceFinderData+<WriteToChache>c__AnonStorey1.<>m__0 (System.String s) [0x00007] in C:\S1\S1_Client_PC\S1\Assets\AliothEditor\Editor\ReferenceFinder\ReferenceFinderData.cs:167 at System.Linq.Enumerable+SelectListIterator2[TSource,TResult].ToArray () [0x00034] in <389a581424f249b6bfedc5bb6d85fb6d>:0
at System.Linq.Enumerable.ToArray[TSource] (System.Collections.Generic.IEnumerable`1[T] source) [0x0001f] in <389a581424f249b6bfedc5bb6d85fb6d>:0
at ReferenceFinderData.WriteToChache () [0x000fe] in C:\S1\S1_Client_PC\S1\Assets\AliothEditor\Editor\ReferenceFinder\ReferenceFinderData.cs:167
at ReferenceFinderData.CollectDependenciesInfo () [0x0009e] in C:\S1\S1_Client_PC\S1\Assets\AliothEditor\Editor\ReferenceFinder\ReferenceFinderData.cs:39

KeyNotFoundException on first use

The first time I use ReferenceFinder in a project, I get "KeyNotFoundException: The given key was not present in the dictionary."

If you comment out the try/catch, you can see that it's from ReferenceFinder\ReferenceFinderData.cs:60

            assetDict[assetGuid].references.Add(asset.Key);

Probably just needs to use TryGetValue instead of [].

Seen on Unity 2019.4.16.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.