Como dice el título, tengo una escena con tres objetos, un cubo, una esfera y un cilindro que puedes ver en la imagen de abajo.
Lo que estoy tratando de lograr es que cuando presiono el botón "Rotar", los tres objetos giren en sentido contrario a las agujas del reloj, por lo que el cilindro va donde estaba el cubo, el cubo va donde estaba la esfera y la esfera va donde estaba el cilindro. Si vuelvo a hacer clic en el botón, giran una vez más y así sucesivamente. Hasta ahora, logré hacerlos girar alrededor de un objeto vacío en el centro del "triángulo" que forman con su posición inicial.
Esto es lo que sucede cuando hago clic por primera vez en el botón "Rotar":
Como pueden ver, el objeto gira, pero no mantienen la misma coordenada del objeto que estaba antes en esa posición, así que estaba pensando en que intercambiaran coordenadas. ¿Cómo puedo lograr eso o hacerlos rotar como quiero?
Aquí está el código que escribí hasta ahora:
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class RotateObject : MonoBehaviour { //rotating objects [SerializeField] private GameObject cube; [SerializeField] private GameObject sphere; [SerializeField] private GameObject cylinder; private Renderer cubeRenderer; private Renderer sphereRenderer; private Renderer cylinderRenderer; //rotation target public GameObject target; private void Start() { cubeRenderer = cube.GetComponent<Renderer>(); sphereRenderer = sphere.GetComponent<Renderer>(); cylinderRenderer = cylinder.GetComponent<Renderer>(); gameObject.GetComponent<Button>().onClick.AddListener(Rotate); } void Rotate() { //rotate objects by 120 degrees cube.transform.RotateAround(target.transform.position, Vector3.up, -120); sphere.transform.RotateAround(target.transform.position, Vector3.up, -120); cylinder.transform.RotateAround(target.transform.position, Vector3.up, -120); } }¡Gracias de antemano por ayudarme!
La forma más fácil de hacer que un objeto (s) gire alrededor de un punto es tenerlo como hijo del punto y luego rotar el punto en sí.
Rotator Script que se colocará en el objeto principal:
public class RotateObjects : MonoBehaviour { [SerializeField] Button rotateButton; // Start is called before the first frame update void Start() { rotateButton.onClick.RemoveAllListeners(); rotateButton.onClick.AddListener(RotateClockwise); } void RotateClockwise() { float newRotation = (360 / transform.childCount); transform.Rotate(new Vector3(0, newRotation, 0)); } }Estás girando alrededor de un objeto. Como la tierra gira alrededor del sol; eso significa que cambiará su posición. Usar
transform.rotation = new Quaternion(rotx, roty, rotz, rotw);o
transform.Rotate(rotx, roty, rotz);En lugar de rotar sobre un punto, rota la forma, es ella misma.