#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. Пожалуйста, добавьте дополнительные сведения, чтобы расширить свой ответ, например, ссылки на рабочий код или документацию.