如何在自定义Unity3D Inspector中“ ping”文本文件?

时间:2018-07-18 11:45:05

标签: c# unity3d

我试图在Unity3D的自定义编辑器中“ ping”文本文件,例如使用EditorGUIUtility.PingObject(在“层次结构”中显示文件,并在其上方闪烁黄色选择字段)。
文件位于Assets/StreamingAssets/Example.csv

enter image description here

enter image description here

最简单的解决方案(我认为)是简单地在ObjectField中显示它->如果单击该字段,资产也会被“ ping”。 所以我正在尝试:

// For debug, later the filename will be dynamic
var path = "Assets/StreamingAssets/" + "Example" + ".csv";
TextAsset file = (TextAsset)AssetDatabase.LoadAssetAtPath(path, typeof(TextAsset));
EditorGUILayout.PrefixLabel("CSV File", EditorStyles.boldLabel);
EditorGUILayout.ObjectField(file, typeof(TextAsset), false);

但是尽管文件存在并且path正确,但是file总是null

enter image description here

2 个答案:

答案 0 :(得分:1)

不幸的是,您的代码很好,这是一个错误。

将资产放置在StreamingAssets文件夹中的Assets文件夹中时,会发生错误。这会导致AssetDatabase.LoadAssetAtPath函数失败。我确实对此进行了搜索,但只有一个post出现了,没有任何解决方法。我的意思是,您可以使用System.IO命名空间中的一种API来读取文件,但是您将无权访问引用该文件的Object

可能的解决方法:

1 。重新启动Unity。

2 。在Assets文件夹中创建一个名为“ Test”的文件夹。

3 。将StreamingAssets文件夹拖到该“测试”文件夹。

4 。将代码中的路径更改为var path = "Assets/Test/StreamingAssets/" + "Example" + ".csv";,然后单击“播放”。它不能为空。如果不再为空,请将StreamingAssets文件夹移回Assets文件夹,并将代码中的路径更改为旧路径。

上述步骤是我将其固定在一边的方法,现在可以正常工作。如果这不起作用,建议您将"Example.csv"文件移到Assets文件夹,然后使用var path = "Assets/" + "Example" + ".csv";进行读取。如果可行,请将其移回StreamingAssets文件夹,然后将路径更改为旧路径。

我建议您执行的另一件事是调用AssetDatabase.Refresh()刷新项目。 我也建议您提交此问题的错误报告。

答案 1 :(得分:0)

我的错误是向TextAsset进行类型转换并使用LoadAssetAtPath,这需要一个Type参数。

将其保留为“ {cast}” object(资产)并使用LoadMainAssetAtPath而不需要Type参数现在可以正常工作:

// For debug, later the filename will be dynamic
var path = "Assets/StreamingAssets/" + "Example" + ".csv";
var file = AssetDatabase.LoadMainAssetAtPath(path);
EditorGUILayout.PrefixLabel("CSV File", EditorStyles.boldLabel);
EditorGUILayout.ObjectField(file, typeof(object), false);