Как повернуть куб, который я нажимаю, вместо того, чтобы все кубы вращались одновременно?

#c# #unity3d #rotation

Вопрос:

Итак, я создаю экземпляры кубов и хочу повернуть один куб, на который я нажимаю, однако, когда я нажимаю на куб, все экземпляры кубов вращаются одновременно, я продолжаю пытаться с помощью логического, но безуспешно. Любая помощь будет признательна. ЕДИНСТВО 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 amp;amp; hit.collider.tag == "colourBox" amp;amp; 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 amp;amp; rotationDirection < 0))
        {
            StartCoroutine(objectRotationAnimation());
        }
        
    }
}
 

Комментарии:

1. Условие проверяет, нажат ли куб, но ему нужно проверить, нажат ли текущий куб. Я не знаю единства, но может if (hit.collider != null amp;amp; hit.collider.tag == "colourBox" amp;amp; hit.collider.attachedRigidbody == this amp;amp; noRotation == false) быть .

2. Я изменил слепок луча на OnMouseDown, и это решило проблему. Но я все еще хочу знать, каким было бы решение, если бы я использовал приведенный выше код! private void OnMouseDown() { RotateCube(); }

Ответ №1:

Если я вас правильно понимаю, этот скрипт присутствует на всех кубах.

Проблема в том, что при щелчке мыши каждый отдельный куб создаст свой собственный экземпляр raycast. После этого каждый куб проверит , является ли hit.collider это не null так, является ли его тег colourBox и noRotation равен ли false он .

На самом деле вы нигде не проверяете, на какой куб вы только что нажали. Вы можете просто добавить эту проверку, сравнив идентификатор экземпляра игрового объекта, с которым столкнулась передача raycast, и идентификатор экземпляра игрового объекта, в котором выполняется скрипт.

 if (hit.collider != null amp;amp; hit.collider.tag == "colourBox" amp;amp; 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();
    }
}
 

Таким образом, каждый куб будет сравнивать свой идентификатор экземпляра с идентификатором экземпляра выбранного объекта. Только щелкнутый объект будет возвращен true в этом if операторе и, таким образом, запускает RotateCube метод.

Ответ №2:

Использовал это вместо RayCastHit2D ….Удалил все внутри обновления и создал новую пустоту.

 private void OnMouseDown()
    {
        RotateCube();
    }
 

Комментарии:

1. Пожалуйста, добавьте дополнительные сведения, чтобы расширить свой ответ, например, ссылки на рабочий код или документацию.