En Unity tengo un panel de interfaz de usuario que tiene un objeto de reproductor (un objeto de imagen de interfaz de usuario).
Muevo el objeto del jugador al plano con las entradas del usuario (teclado o toque)
No puedo mantener el objeto del jugador en su panel principal,
Verifique la imagen a continuación, quiero mantener al jugador dentro del Panel rojo
Aquí está mi código probado
public Camera MainCamera; //be sure to assign this in the inspector to your main camera private Vector2 screenBounds; private float objectWidth; private float objectHeight; private RectTransform pnlBackgroundTransform; private void Start() { pnlBackgroundTransform = GameObject.Find("PnlBackground").GetComponent<RectTransform>(); screenBounds = MainCamera.ScreenToWorldPoint(new Vector3(pnlBackgroundTransform.rect.width , pnlBackgroundTransform.rect.height , MainCamera.transform.position.z)); objectWidth = transform.GetComponent<SpriteRenderer>().bounds.extents.x; //extents = size of width / 2 objectHeight = transform.GetComponent<SpriteRenderer>().bounds.extents.y; //extents = size of height / 2 } void LateUpdate() { Vector3 viewPos = transform.position; viewPos.x = Mathf.Clamp(viewPos.x, screenBounds.x * -1 + objectWidth, screenBounds.x - objectWidth); viewPos.y = Mathf.Clamp(viewPos.y, screenBounds.y * -1 + objectHeight, screenBounds.y - objectHeight); Debug.Log(screenBounds); Debug.Log(viewPos); transform.position = viewPos; }Diría que no es muy habitual que el reproductor se implemente como un elemento de la interfaz de usuario y, en cambio, debería implementarlo fuera del sistema de UI/Canvas .
El sistema UI/Canvas utiliza un conjunto de reglas de ubicación y escala para manejar el diseño receptivo. Tienes al menos 4 valores (excluyendo la rotación) para colocar algo en la pantalla: ancla , pivote , posición y escala .
Por ejemplo: si desea crear un cuadrado, puede establecer su tamaño en valores de píxel absolutos o valores relativos (al padre). Si usa valores absolutos, su UI Scale Mode , definido en el objeto Canvas , debería afectar los resultados visuales.
Esto significa que la UI/Canvas es para elementos que deben adaptarse a la pantalla, como botones, diálogos, etiquetas, etc. Aprovechando los parámetros del dispositivo para mejorar la UX.
Fuera del sistema UI/Canvas , las cosas se basan directamente en el álgebra lineal: tiene un espacio vectorial 3D (un "Mundo") donde todo existe con un tamaño y una posición absolutos. Luego, su cámara estira y tuerce el mundo entero para que coincida con su perspectiva actual. Eso significa que su objeto siempre tendrá el mismo tamaño, independientemente del tamaño de la pantalla.
Ahora, suponiendo que tiene una razón muy específica para implementar su juego en la interfaz de usuario, hay algunas formas en que puede hacerlo. Asumiré que estás usando valores absolutos. Tenga en cuenta que todas las unidades utilizadas aquí son píxeles, y el efecto debe ser diferente para dispositivos con diferentes resoluciones y sensible al parámetro UI Scale Mode de usuario. Además, tenga en cuenta que configuré ambos anclajes mínimo y máximo en (0,0), la esquina inferior izquierda (el valor predeterminado es el centro de la pantalla, (0.5,0.5)), para evitar coordenadas negativas.
El siguiente script se adjunta a la imagen de la interfaz de usuario del reproductor.
public class UIMovementController : MonoBehaviour { public float speed = 5.0f; new private RectTransform transform; private Rect canvasRect; private void Start() { transform = GetComponent<RectTransform>(); canvasRect = GetComponentInParent<Canvas>().pixelRect; } void Update() { // Keyboard Input (Arrows) Vector2 move = new Vector2(0,0); if (Input.GetKey(KeyCode.UpArrow)) { move.y += speed; } if (Input.GetKey(KeyCode.DownArrow)) { move.y -= speed; } if (Input.GetKey(KeyCode.LeftArrow)) { move.x -= speed; } if (Input.GetKey(KeyCode.RightArrow)) { move.x += speed; } transform.anchoredPosition += move; // Position clamping Vector2 clamped = transform.anchoredPosition; clamped.x = Mathf.Clamp(clamped.x, transform.rect.width / 2, canvasRect.width - transform.rect.width / 2); clamped.y = Mathf.Clamp(clamped.y, transform.rect.height / 2, canvasRect.height - transform.rect.height / 2); transform.anchoredPosition = clamped; } }