You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PlayerPrefs存储材质资源路径失败,代码无输出且功能异常求解决

问题根源与解决方案

核心问题分析

  1. rend.material生成运行时实例:访问rend.material时,Unity会自动创建材质的运行时实例副本,这个副本不属于Project窗口中的原始资源,因此AssetDatabase.GetAssetPath()无法识别,返回空字符串。
  2. AssetDatabase是编辑器专属API:代码引用了UnityEditor命名空间,AssetDatabase仅能在Unity编辑器环境中使用,打包后的游戏完全无法调用,且打包时会直接报错。
  3. 不必要的重复操作:Update中每帧重复获取Renderer、执行PlayerPrefs存储,既浪费性能,也会导致无效数据被反复写入。

解决方案

方案1:编辑器调试专用(仅开发阶段使用)

如果只是在编辑器内测试获取原始材质路径,将rend.material替换为rend.sharedMaterial,它指向Project中的原始材质资源:

void Update()
{
    rend = GetComponent<Renderer>();
    // 使用sharedMaterial获取原始资源路径
    matpath = AssetDatabase.GetAssetPath(rend.sharedMaterial);
    Debug.Log(matpath);
    PlayerPrefs.SetString(MatKey, matpath);
    PlayerPrefs.Save();
}

⚠️ 注意:修改sharedMaterial会影响所有使用该材质的对象,需谨慎操作。

方案2:通用打包兼容方案

由于AssetDatabase无法在打包后使用,改用材质名称+Resources加载的方式实现跨环境兼容:

  1. 创建Resources/Materials文件夹,将需要的材质放入其中;
  2. 修改代码如下:
using UnityEngine;

// 移除UnityEditor命名空间,避免打包报错
public class CustomData : MonoBehaviour
{
    const string MatKey = "material";
    Renderer rend;

    void Awake()
    {
        // 仅初始化一次Renderer,优化性能
        rend = GetComponent<Renderer>();
    }

    void Start()
    {
        // 读取存储的材质名称,默认值填你的默认材质名
        string matName = PlayerPrefs.GetString(MatKey, "DefaultMaterial");
        // 从Resources加载材质
        Material targetMat = Resources.Load<Material>($"Materials/{matName}");
        if (targetMat != null)
        {
            rend.material = targetMat;
        }
    }

    // 改为触发式保存,比如在材质切换完成后调用
    public void SaveMaterial()
    {
        // 存储材质名称而非路径,避免路径变动失效
        string matName = rend.sharedMaterial.name;
        PlayerPrefs.SetString(MatKey, matName);
        PlayerPrefs.Save();
        Debug.Log($"已保存材质:{matName}");
    }
}

额外注意事项

  • 禁止在Update中频繁调用PlayerPrefs.Save(),这会频繁写入磁盘,严重影响性能,应在材质实际变化时触发保存;
  • 大型项目推荐使用Addressable Assets替代Resources,资源管理更灵活;
  • 运行时修改rend.material会生成材质实例,若需修改全局材质,使用rend.sharedMaterial,但会影响所有使用该材质的对象。

内容的提问来源于stack exchange,提问作者A_ PRSN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 16:20:30