我有一个非常具体的问题。在我的场景中,我有一堆彼此相邻的立方体。
当我点击其中一个该多维数据集变为红色(或我的阵列中的其他颜色之一)时,该脚本将应用于我的所有多维数据集。
现在我想要发生的是只要其中一个立方体是红色的,其他立方体是不可访问的(当我点击它们时它们不会改变颜色)。 < / p>
这是我的立方体的代码:
private renderer render;
void Start()
{
render = GetComponent<renderer>();
}
private Color[] colors = {Color.red, Color.green, color.yellow);
void Update(){}
void OnMouseDown()
{
render.material.color = colors[Random.Range(0, colors.Lenght)];
}
答案 0 :(得分:2)
您需要设置class
级别Boolean
来控制其中一个多维数据集是否为红色,例如:
static bool _bBlockMouseDown;
void OnMouseDown()
{
Color color = colors[Random.Range(0, colors.Lenght)];
if (color == Color.Red)
{
_bBlockMouseDown = true;
render.material.color = color; //Force the color to be set here
}
if (!_bBlockMouseDown)
{
render.material.color = color;
}
}
此代码将多维数据集更改为随机颜色,如果为红色,则将Boolean
设置为true,以阻止任何其他多维数据集设置其颜色。所有这些需求就是当立方体不再是红色时,只需将_bBlockMouseDown
变量更改为true。
注意:_bBlockMouseDown
变量是静态的,因此它在所有多维数据集中包含相同的值。
另一种解决方案是使用System.Linq
命名空间并拥有多维数据集列表。如下所示:
void OnMouseDown()
{
if (!listOfCubes.Any(c => c.material.color == Color.Red))
{
render.material.color = colors[Random.Range(0, colors.Lenght)];
}
}
这种方法的缺点是,如果有很多立方体,它会稍微慢一些。
答案 1 :(得分:0)
哎呀......我以为我发了答案,但没有通过。无论哪种方式,代码已经编写,我不能扔掉它。
此方法使用数组。将数组大小从编辑器更改为5并为其分配5个多维数据集。红色立方体只会改变颜色,其余部分不会,除非场景中没有红色立方体。
public GameObject[] cubes;
void Start()
{
}
private Color[] colors = { Color.red, Color.green, Color.yellow };
void Update()
{
checkMouseClick();
}
void checkMouseClick()
{
MeshRenderer tempMR;
//Check if mouse button is pressed
if (Input.GetMouseButtonDown(0))
{
RaycastHit hitInfo = new RaycastHit();
if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hitInfo))
{
tempMR = hitInfo.collider.gameObject.GetComponent<MeshRenderer>();
int cubeSize = cubes.Length;
//Loop through all the cubes in in cubes array
for (int i = 0; i < cubeSize; i++)
{
//Check if any of them have a red color
if (cubes[i].GetComponent<MeshRenderer>().material.color == Color.red)
{
//if the cube we clicked is alread read, go ahead and generate a new color for it, else DONT CHANGE THE COLOR
if (cubes[i] == hitInfo.collider.gameObject)
{
}
else
{
return; //Exit if any cube has the red color
}
}
}
//No cube has a red color, change the color of clicked cube to a random color
tempMR.material.color = colors[Random.Range(0, colors.Length)];
}
}
}