• Jobs
  • About Us
  • Jobs
    • Home
    • Jobs
    • Courses and challenges
  • Businesses
    • Home
    • Post vacancy
    • Our process
    • Pricing
    • Assessments
    • Payroll
    • Blog
    • Sales
    • Salary Calculator

0

787
Views
Unity 2D: mantener el objeto del jugador dentro de los límites de su panel principal

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; }

ingrese la descripción de la imagen aquí

over 3 years ago · Santiago Trujillo
1 answers
Answer question

0

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.

IU absoluta vs relativa

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.

Tamaño de la cámara

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; } }

Sujeción de movimiento de interfaz de usuario

over 3 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Our process Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.

Andres GPT

Show me some job opportunities
There's an error!