c# - prefabricadas - venta de casas chinas en argentina
Las prefabricadas de UI se instancian debajo del lienzo (1)
Supongo que obtendrás algo como esto:
Arreglas esto por pasar false
al segundo parámetro de la función SetParent
. Al hacer esto, hará que la Transformación mantenga su orientación local en lugar de su orientación global.
Simplemente reemplace:
newHealthContainerTransform.SetParent(healthBar);
con:
newHealthContainerTransform.SetParent(healthBar, false)
También puede establecer el Objeto padre y hacer que la Transformación del Objeto instanciado mantenga su orientación local en la función Instantiate
. La única desventaja de esto es que ahora tiene que establecer la posición del objeto en otra línea de código en lugar de la función Instantiate
como antes.
Transform newHealthContainerTransform = Instantiate(healthWrapperObject, healthBar, false).transform;
newHealthContainerTransform.GetComponent<RectTransform>().anchoredPosition3D = new Vector2(x, y);
Al mover un objeto UI, debe modificar RectTransform
variables RectTransform
lugar de las variables Transform
.
A continuación hay otras variables útiles que determinan dónde colocar la IU:
Estos son anchorMax
, anchorMax
, anchorMax
y anchorMin
que se pueden modificar con:
yourUIObj.GetComponent<RectTransform>().anchoredPosition = ...
yourUIObj.GetComponent<RectTransform>().anchoredPosition3D = ...
yourUIObj.GetComponent<RectTransform>().anchorMax = ...
yourUIObj.GetComponent<RectTransform>().anchorMin = ...
Estoy tratando de copiar el sistema de salud de Zelda. El código se ve muy bien y funciona bien.
Pero los contenedores de corazón están mal colocados. Se crean instancias debajo del lienzo.
Este es el código importante, los contenedores de corazón son correctos, solo en la posición incorrecta.
El cálculo de xey es correcto, pero en el lienzo no lo es.
private Transform healthBar = GameObject.FindGameObjectWithTag("HealthController").transform; // container for the heartContainers
private GameObject healthWrapperObject = Resources.Load("HealthContainer") as GameObject; // the backgroundImage and parent of the heart
private List<Image> healthContainers = new List<Image>(); // list of hearts for later usages
private int maxHealth = 6;
private int currentHealth;
private int healthPerHealthContainer = 4; // 4 lifepoints per heart
private int healthContainersPerRow = 5; // 5 hearts per row
private int healthContainerStartPositionX = 0; // Healthbar starts at 0 on x
private int healthContainerStartPositionY = 0; // Healthbar starts at 0 on y
private int healthContainerSpacingX = 10; // horizontal spacing
private int healthContainerSpacingY = -10; // vertical spacing
private void Start()
{
currentHealth = maxHealth;
InitializeHealthBar();
}
public void InitializeHealthBar()
{
int neededHealthContainers = maxHealth % healthPerHealthContainer == 0 ? maxHealth / healthPerHealthContainer : maxHealth / healthPerHealthContainer + 1; // Calculate the needed container count
int counter = 0; // counts the hearts per row
int x = healthContainerStartPositionX; // horizontal position of the heartContainer
int y = healthContainerStartPositionY; // vertical position of the heartContainer
for (int i = 0; i < neededHealthContainers; i++)
{
counter++;
if (counter >= healthContainersPerRow) // start a new line after 5 hearts per row
{
x = healthContainerStartPositionX; // move back to the left
y += healthContainerSpacingY; // go for the next line
counter = 0; // reset the counter
}
else
x += healthContainerSpacingX; // place the new container right next to the previous
Transform newHealthContainerTransform = Instantiate(healthWrapperObject, new Vector2(x, y), healthWrapperObject.transform.rotation).transform; // create the healthContainer parent / backgroundImage
newHealthContainerTransform.SetParent(healthBar); // take the container and make it a child of the healthBar
healthContainers.Add(newHealthContainerTransform.GetChild(0).GetComponent<Image>()); // get the heart of the heartContainer and add it to the heartList
}
}
Agregué la configuración de transformación para healthBar, healthContainer / backgroundImage y heart ("healthfill").
En los 3 elementos presioné Strg + Alt y Shift para anclarlos.
El corazóncontainter debe agregarse a la barra de estado, el corazón es un elemento secundario del corazón y está configurado para estirar (debe ser del mismo tamaño que su elemento primario)
¿Por qué los objetos prefabricados de UI se crean instancias debajo del lienzo?