我在C#中使用Unity3D,正在尝试一个简单的脚本来改变一个对象的材质。我知道这是基本的,而且这里已经有很多关于这个主题的问题,但我看到的所有问题,我都已经尝试过了,但没有工作。程序没有返回任何错误,材料根本没有变化。在if语句上,我尝试了==和=。
请帮我找到我做错了什么,即使是一个小的错别字,我似乎也看不到。
这是我的代码。
using UnityEngine;
using System.Collections;
public class tilechange : MonoBehaviour {
public Material Grey;
public Material Black;
void Start()
{
renderer.material = Grey;
}
void OnMouseDown () {
if (renderer.material = Grey)
{
renderer.material = Black;
}
if (renderer.material = Black)
{
renderer.material = Grey;
}
}
}
任何帮助将被感激:)
更新
我已经添加了很多debug.logs,似乎颜色会改变,然后又变回来。你知道如何才能阻止这种情况发生吗?
这里是一个从灰色开始点击的gif。http:/gyazo.com7c556ea79bb9b7277ae23d14ee44f8d2。
这里是一个从黑色开始点击的gif。http:/gyazo.comc6e00d858ab8d47436e689dd124bd762。
他们都有不同的行为,这似乎可能与问题有关。
进一步更新
我试着添加了第三个材质,并试验了if语句的顺序,程序会运行所有的材质,即使材质没有被使用。
你更新的代码使用的是赋值,而不是测试等价性。
if (renderer.material = Grey)
{
renderer.material = Black;
}
if (renderer.material = Black)
{
renderer.material = Grey;
}
应该是这样的。
if (renderer.material == Grey)
{
renderer.material = Black;
}
if (renderer.material == Black)
{
renderer.material = Grey;
}
我认为你没有正确地分配材料的颜色 因为你已经创建了材料 但还没有为这些材料设置任何属性 详见:
(编辑:确保从右上方选择 "C#")
(编辑2)根据你更新的问题,我相信它正在改变->改变回来,因为它正在注册多个mousedown事件。试着在变回颜色之前添加一个tick作为最小的延迟。
见 与团结相关的主题
我知道这是老问题了,但为了让大家登陆这里,我还是回答一下。 问题是两个if语句。 它们都会被执行,所以它们会互相抵消。 你需要在第二个语句中使用 "else if",这样只有在第一个语句不被执行时才会被执行。 这应该能达到你想要的目的,切换材料。
if (renderer.material == Grey) {
renderer.material = Black;
} else if (renderer.material == Black) {
renderer.material = Grey;
}