如何旋转我单击的立方体而不是同时旋转所有立方体?

How to rotate the cube I click instead of all cubes rotating at the same time?

所以我正在实例化多维数据集,我想旋转我单击的单个多维数据集,但是当我单击多维数据集时,所有实例化的多维数据集同时旋转,我一直尝试使用布尔值但没有成功。任何帮助,将不胜感激。统一二维

{
    public int rotationDirection = -1; //-1 for clockwise
    public int rotationStep = 5; //Should be less than 90

    public bool noRotation;

    // public GameObject cubeBox;
    private Vector3 currentRotation, targetRotation;

    // Update is called once per frame
    void Update()
    {
       
        if (Input.GetMouseButtonDown(0))
        {
            RaycastHit2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector2.zero);

            if (hit.collider != null && hit.collider.tag == "colourBox" && noRotation == false)
            {
                Debug.Log("object clicked: " + hit.collider.tag);
                
                RotateCube(); 
            }
        }
    }
    void RotateCube()
    {
        currentRotation = gameObject.transform.eulerAngles;
        targetRotation.z = (currentRotation.z + (90 * rotationDirection));
        StartCoroutine(objectRotationAnimation());
    }

    IEnumerator objectRotationAnimation()
    {
        currentRotation.z += (rotationStep * rotationDirection);
        gameObject.transform.eulerAngles = currentRotation;

        yield return new WaitForSeconds(0);

        if (((int)currentRotation.z > (int)targetRotation.z && rotationDirection < 0))
        {
            StartCoroutine(objectRotationAnimation());
        }
        
    }
}

使用它代替 RayCastHit2D ....删除了 Update 中的所有内容并创建了一个新的空隙。

private void OnMouseDown()
    {
        RotateCube();
    }

如果我对你的理解正确的话,这个脚本存在于所有多维数据集上。

问题是当您用鼠标单击时每个立方体 都会创建自己的光线投射实例。在那之后 每个立方体 将检查 hit.collider 是否不是 null,如果它的标签是 colourBox 并且 noRotation 是否等于 false.

您实际上并没有在任何地方检查您刚刚单击的是哪个多维数据集。您可以通过比较光线投射所碰撞的游戏对象的实例 ID 和运行脚本的游戏对象的实例 ID 来简单地添加此检查。

if (hit.collider != null && hit.collider.tag == "colourBox" && noRotation == false)
{
    // Check if the cube that was clicked was this cube
    if (hit.collider.gameObject.GetInstanceID() == gameObject.GetInstanceID())
    {
        Debug.Log("object clicked: " + hit.collider.tag);

        RotateCube();
    }
}

这样每个立方体都会将其实例 ID 与单击对象的实例 ID 进行比较。只有被点击的对象才会在这个if语句中returntrue,从而运行RotateCube方法。