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

Posted

技术标签:

【中文标题】如何旋转我单击的立方体而不是所有立方体同时旋转?【英文标题】:How to rotate the cube I click instead of all cubes rotating at the same time? 【发布时间】:2021-10-31 21:48:28 【问题描述】:

所以我正在实例化立方体,我想旋转一个单击的立方体,但是当我单击立方体时,所有实例化的立方体同时旋转,我一直尝试使用布尔值但没有成功。任何帮助,将不胜感激。 UNITY 2D


    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());
        
        
    

【问题讨论】:

条件判断一个立方体是否被点击,但需要判断当前立方体是否被点击。我不知道团结,但也许if (hit.collider != null &amp;&amp; hit.collider.tag == "colourBox" &amp;&amp; hit.collider.attachedRigidbody == this &amp;&amp; noRotation == false). 我将光线投射更改为 OnMouseDown 并解决了问题。但是我仍然想知道如果我使用上面的代码会有什么解决方案!private void OnMouseDown() RotateCube(); 【参考方案1】:

如果我理解正确的话,这个脚本出现在所有立方体上。

问题在于,当您用鼠标单击时,每个立方体都会创建自己的光线投射实例。之后每个立方体将检查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 语句中返回true,从而运行RotateCube 方法。

【讨论】:

【参考方案2】:

使用它而不是 RayCastHit2D ....删除了 Update 中的所有内容并创建了一个新的 void。

private void OnMouseDown()
    
        RotateCube();
    

【讨论】:

请添加更多详细信息以扩展您的答案,例如工作代码或文档引用。

以上是关于如何旋转我单击的立方体而不是所有立方体同时旋转?的主要内容,如果未能解决你的问题,请参考以下文章

如何避免 OpenGL 中的光旋转?

如何按中心旋转立方体

搅拌机轴在其中心点旋转

使用纯CSS3实现一个3D旋转的书本

三个JS围绕轴旋转

侧面带有可点击区域的 3D 可旋转立方体