Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

901
Visualizações
Unity 2D - Keep Player Object in Boundary of it's Parent Panel

In Unity i have a UI Panel which has a player object (an UI Image object).

I moving player object into planel with user inputs (keyboard or touch)

I can't keep player object in it's parent panel,

Please check below image, I want to keep player inside of Red Panel

Here is my Tried Code

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

enter image description here

over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

I'd say it's not very usual having the player implemented as a UI element, and instead you should be implementing it outside the UI/Canvas system.

The UI/Canvas system uses a set of rules of placing and scaling to deal with responsive design. You have at least 4 values (excluding rotation) to place something on the screen: anchor, pivot, position and scale.

For example: if you want to create a square you can either set it's size in absolute pixel values or relative values (to parent). If you're using absolute values, your UI Scale Mode, defined on the Canvas object, should affect the visual results.

UI absolute vs relative

This means the UI/Canvas is for elements that should adapt to the screen, such as buttons, dialogs, labels, etc. Taking advantage of device parameters to improve the UX.

Outside the UI/Canvas system, things are directly based on Linear Algebra: you have a 3D vector space (a "World") where everything exists with an absolute size and position. Then, your Camera stretches and twists the whole world to match what your current perspective. That means your object will always have the same size, regardless of screen size.

Camera size

Now, assuming you have a very specific reason to implement your game into UI, there are a few ways you can do it. I'll assume you're using absolute values. Please note all the units used here are pixels, and the effect should be different for devices with different resolutions and sensible to the UI Scale Mode parameter. Also, please note I've set both anchors min and max to (0,0), the bottom left corner (default is screen center, (0.5,0.5)), in order to avoid negative coordinates.

The following script is attached to the player's UI Image.

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

UI Movement Clamping

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda