Unity调用AssetDatabase.GetAssetPath获取材质路径返回空问题
问题原因
AssetDatabase.GetAssetPath 仅能查询项目Assets目录下已存在资源的对应路径。你代码中调用的Renderer.material属性被访问时,Unity会自动生成一份该材质的运行时克隆实例,这个实例是内存中临时生成的对象,没有对应项目内的本地资源文件,因此接口返回结果为空。
修复方法
将代码中访问的.material替换为.sharedMaterial即可。.sharedMaterial返回的是Renderer引用的原始材质资产,不是运行时生成的克隆对象,可以被AssetDatabase正常识别路径。
修复后代码:
using UnityEditor; using UnityEngine; public class MaterialPathTool : MonoBehaviour { public GameObject obj; public void Start() { // 注意:AssetDatabase是UnityEditor命名空间下的API,仅能在编辑器环境运行,打包后无法使用 Debug.Log(AssetDatabase.GetAssetPath(obj.GetComponent<Renderer>().sharedMaterial)); } }
注意点
- 如果是写纯编辑器工具逻辑,不要把查询逻辑放在
Start、Update这类运行时生命周期函数中,避免误访问.material生成冗余的克隆材质文件,污染本地资源库。 - 日常开发中不要随意修改
sharedMaterial的参数,修改会直接改动本地原始材质文件,所有引用该材质的对象显示效果都会被同步更改。如果是运行时需要修改单个对象的材质,再用.material拿克隆实例修改。
内容的提问来源于stack exchange,提问作者Vika
相关产品推荐
相关产品推荐

