【问题标题】:Get material from assets从资产中获取材料
【发布时间】:2020-02-25 16:19:58
【问题描述】:

在我的 Unity 项目中,我尝试使用一些自制材料突出显示某些对象。 不幸的是,我找到的代码不起作用。

以下脚本被添加到三个不同的游戏对象中:

Renderer[] rend_ThisObject;
Material white, red;

void Start()
{
    // I tried the following two code parts:
    white = Resources.Load<Material>("White");
    white = Resources.Load("Material/White.mat", typeof(Material)) as Material;

    red = Resources.Load<Material>("Red");
    red = Resources.Load("Material/Red.mat", typeof(Material)) as Material;           
}

void Update()
{
    foreach (var child in rend_ThisObject)
    {
        child.material = blinkObject ? white : red;
    }
}

如果我运行该项目,带有脚本的游戏对象会显示为粉红色并且不会闪烁。

如果我将 Material white, red; 更改为 public Material white, red; 它工作正常。我必须更改哪些内容才能从我的 assets/resources/material 文件夹中获取材料?

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    一般:

    来自 Unity 自己的Best practise for Resources

    不要使用它。

    仅使用您的 public 字段并通过 Inspector 设置它们有什么问题?

    如果您不喜欢他们成为public,那么只需使用[SerializeField]

    [SerializeField] private Material white;
    [SerializeField] private Material red;
    

    而是通过 Inspector 分配它们!


    然后假设您的路径不是assets/resources/material,而是Assets/Resources/Material,请参阅Resources.Load

    你试过了

    white = Resources.Load<Material>("White");
    white = Resources.Load("Material/White.mat", typeof(Material)) as Material;
    

    都错了:

    • 第一次找不到文件夹路径

      该路径相对于您项目的Assets 文件夹中名为Resources 的任何文件夹

    • 第二个文件结尾太多了。

      注意:必须省略扩展名。

    所以为了加载带有路径的文件

    Assets/Resources/Material/White.mat
    

    应该是

    white = Resources.Load<Material>("Material/White");
    

    现在是另一个一般说明:

    每帧基础上进行这种闪烁并不是一个好主意!

    宁可使用某种延迟,例如

    // adjust via the Inspector as well
    [Tooltip("Color changes per second")]
    [SerializeField] private float blinkFrequency = 2f;
    
    private float timer;
    
    void Update()
    {
        timer -= Time.deltaTime;
        if(timer <= 0)
        {
            timer = 1 / blinkFrequency;
    
            blinkObject = !blinkObject;
            foreach (var child in rend_ThisObject)
            {
                child.material = blinkObject ? white : red;
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-03
      相关资源
      最近更新 更多