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;它工作正常。我需要更改什么才能从我的资产/资源/材料文件夹中获取材料?
一般来说:
来自 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)
两者都错了:
第一次缺少文件夹路径
该路径是相对于命名的任何文件夹
Resources内Assets项目的文件夹
第二个文件结尾太多了。
注意:必须省略扩展名。
所以为了加载带有路径的文件
[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)
| 归档时间: |
|
| 查看次数: |
1154 次 |
| 最近记录: |