从资产中获取材料

die*_*m_L 2 c# unity-game-engine

在我的 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

如果我更改Material white, red;public Material white, red;它工作正常。我需要更改什么才能从我的资产/资源/材料文件夹中获取材料?

der*_*ugo 8

一般来说:

来自 Unity 自己的最佳实践Resources

不要使用它。

简单地使用您的public字段并通过检查器设置它们有什么问题?

如果你不喜欢它们,public那么只需使用[SerializeField]

[SerializeField] private Material white;
[SerializeField] private Material red;
Run Code Online (Sandbox Code Playgroud)

而是通过检查员分配它们!


然后假设您的路径不是assets/resources/material而是Assets/Resources/Material看到Resources.Load

你试过了

white = Resources.Load<Material>("White");
white = Resources.Load("Material/White.mat", typeof(Material)) as Material;
Run Code Online (Sandbox Code Playgroud)

两者都错了:

  • 第一次缺少文件夹路径

    该路径是相对于命名的任何文件夹ResourcesAssets项目的文件夹

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

    注意:必须省略扩展名。

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

[SerializeField] private Material white;
[SerializeField] private Material red;
Run Code Online (Sandbox Code Playgroud)

它应该只是

white = Resources.Load<Material>("Material/White");
Run Code Online (Sandbox Code Playgroud)

现在另一个一般注意事项:

每帧的基础上做这个眨眼不是一个上帝的主意!

而是使用某种延迟,例如

// 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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)