pi126
pi126

Reputation: 19

Game objects wrong positioning

The objects are being set to out of the canvas
The objective of setting them is to show the user inventory with only the items that the user have
It's setting them active normally, and in the order that the user got it, but in wrong positioning No error messages were sent
Before setting the positions array, i checked what were the positions in the scene to put it right on the array
But the objects are setting in the wrong place
I put this debug logs to try to see the problem
But it says the positions that i set
Object Positions
Debug Logs
Apples InpectorDouble Speed InspectorSuper Force Inspector
This is my code:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;

public class Filters
 : MonoBehaviour
{
    [Header("Items")]
    public GameObject doubleSpeed;
    public GameObject doubleJump;
    public GameObject superForce;
    public GameObject noGravity;
    public GameObject noHit;
    public GameObject apple;
    private GameObject[] items;
    public int index = 0;
    public float[] position = new float[6] { -125.8f, -78.6f, -24.1f, 23.1f, 80.69913f, 36.3375f };
    private float x;

    // Update is called once per frame
    void Update()
    {
        Player player = FindObjectOfType<Player>();
        Filter(doubleJump, player.doubleJumps);
        Filter(doubleSpeed, player.doubleSpeeds);
        Filter(superForce, player.superForces);
        Filter(noGravity, player.noGravitys);
        Filter(noHit, player.noHits);
        Filter(apple, player.apples);
        items = GameObject.FindGameObjectsWithTag("Have");
        if(items.Length != 0)
        {
            for(int i = 0; i < items.Length; i++)
            {
                items[i].transform.position = new Vector3(position[i], 52.8f , 1f);
                items[i].SetActive(true);
                Debug.Log("Changed the position and set active new position:" + items[i].transform.position);
            }
        }
    }
    void Filter(GameObject item, int quantity)
    {
        if(quantity < 1)
        {
            item.SetActive(false);
            Debug.Log("less than 1");
        }
        else
        {
            item.SetActive(true);
            Debug.Log("set active");
            item.tag = "Have";
            Debug.Log("set the tag");
        }
    }
}

Upvotes: 0

Views: 235

Answers (1)

derHugo
derHugo

Reputation: 90872

  1. In general there is a difference between the localPosition - the position relative to the parent object and usually the one displayed in the Unity Inspector - and the absolute world space position you are setting in

    items[i].transform.position = new Vector3(position[i], 52.8f , 1f);
    
  2. Further there is an even bigger difference when dealing with a RectTransform. What you see and edit in the Inspector is the RectTransform.anchoredPosition which is relative to the parents RectTransform and additionally takes the Anchors and Pivot settings into account.

    So try this instead

    items[i].GetComponent<RectTransform>().anchoredPosition3D = new Vector3(position[i], 52.8f , 1f);
    

anchoredPosition3D is basically the same as anchoredPosition but additionally allows to set the delta in the Z axis


In general for your usecase I would recommend to use a HorizontalLayoutGroup and rather let the UI handle the placement itself. You would then simply use SetActive to hide and show items.

Upvotes: 1

Related Questions