使对象在运行时无法访问

时间:2016-03-08 12:02:55

标签: c# unity3d

我有一个非常具体的问题。在我的场景中,我有一堆彼此相邻的立方体。

当我点击其中一个该多维数据集变为红色(或我的阵列中的其他颜色之一)时,该脚本将应用于我的所有多维数据集。

现在我想要发生的是只要其中一个立方体是红色的,其他立方体是不可访问的(当我点击它们时它们不会改变颜色)。 < / 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)];
}

2 个答案:

答案 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)];
        }
    }
}