For some reason, to set UI element’s x + y coordinates, I have to add large numbers to the code. For Y, this code sets it to -450, and the x to 128*ui slot, yet the numbers I have had to input are far different. Is there any way around this?
`using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Hotbar_Selection : MonoBehaviour
{
public float hotbarSlot = 1;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
setSlot();
transform.position = new Vector3((((hotbarSlot - 5) * 128) + 960), 90);
}
private void setSlot()
{
if (Input.GetKeyDown(KeyCode.Alpha1))
{
hotbarSlot = 1;
}
else if (Input.GetKeyDown(KeyCode.Alpha2))
{
hotbarSlot = 2;
}
else if (Input.GetKeyDown(KeyCode.Alpha3))
{
hotbarSlot = 3;
}
else if (Input.GetKeyDown(KeyCode.Alpha4))
{
hotbarSlot = 4;
}
else if (Input.GetKeyDown(KeyCode.Alpha5))
{
hotbarSlot = 5;
}
else if (Input.GetKeyDown(KeyCode.Alpha6))
{
hotbarSlot = 6;
}
else if (Input.GetKeyDown(KeyCode.Alpha7))
{
hotbarSlot = 7;
}
else if (Input.GetKeyDown(KeyCode.Alpha8))
{
hotbarSlot = 8;
}
else if (Input.GetKeyDown(KeyCode.Alpha9))
{
hotbarSlot = 9;
}
}
}
`
These numbers work, but can I do it an easier way?
1
UI moves in screen pixel space if the Canvas is set to Screenspace Overlay
. If you rather want to use the values you see in the Inspector then use RectTransform.anchoredPosition
instead which takes the anchor and pivot settings into account as well.
in general I wouldn’t poll and set the position every frame but only when an input occurs. Canvas UI updates might cause re-layout which is quite expensive.
You could just simplify this into something like e.g.
public class Hotbar_Selection : MonoBehaviour
{
public float hotbarSlot = 1;
[SerializeField] private RectTransform rectTransform;
private static readonly IReadOnlyDictionary<KeyCode, int> keyCodeValues = new Dictionary<KeyCode, int>()
{
{ KeyCode.Alpha1, 1 },
{ KeyCode.Alpha2, 2 },
{ KeyCode.Alpha3, 3 },
{ KeyCode.Alpha4, 4 },
{ KeyCode.Alpha5, 5 },
{ KeyCode.Alpha6, 6 },
{ KeyCode.Alpha7, 7 },
{ KeyCode.Alpha8, 8 },
{ KeyCode.Alpha9, 9 }
};
void Awake()
{
if(!rectTransform) rectTransform = GetComponent<RectTransform>();
}
void Update()
{
GetSlotInput();
}
private void GetSlotInput()
{
foreach(var kvp in keyCodeValues)
{
if(Input.GetKeyDown(kvp.Key))
{
ApplySlot(kvp.Value);
break;
}
}
}
private void ApplySlot(int index)
{
// if you don't even need this as an exposed class field you can get rid of it
hotbarSlot = index;
rectTransform.anchoredPosition = new Vector3(((hotbarSlot - 5) * 128 + 960), 90);
}
}