如何旋转我单击的立方体而不是同时旋转所有立方体?
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
方法。
所以我正在实例化多维数据集,我想旋转我单击的单个多维数据集,但是当我单击多维数据集时,所有实例化的多维数据集同时旋转,我一直尝试使用布尔值但没有成功。任何帮助,将不胜感激。统一二维
{
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
方法。