2016-11-15 5 views
1

Я работаю на странице магазина. Страница заполнена панельными панелями. По какой-то причине, когда он заполняет сборные блоки, он более чем удваивает размер шкалы сборного. Если я перетащил сборник на место, он будет работать так, как ожидалось.Как отладить масштабную проблему?

У меня нет кода в шкале таргетинга программы. Я не уверен, откуда он.

Это код, который я использую для популяции списка.

[System.Serializable] 
public class Item 
{ 
    public string itemName; 
    public int price; 
} 

public class ShopScrollList : MonoBehaviour { 
    public List<Item> itemList; 
    public Transform contentPanel; 
    public Text storeDisplayText; 
    public SimpleObjectPool buttonObjectPool; 

    void Start() { 
     RefreshDisplay(); 
    } 


    private void RefreshDisplay() 
    { 
     AddButtons(); 
    } 

    private void AddButtons() 
    { 
     for (int i = 0; i < itemList.Count; i++) 
     { 
      Item item = itemList[i]; 
      GameObject newButton = buttonObjectPool.GetObject(); 
      newButton.transform.SetParent(contentPanel); 

      ButtonDetails buttonDetails = newButton.GetComponent<ButtonDetails>(); 
      buttonDetails.Setup(item, this); 
     } 
    } 
} 

SimpleObjectPool Сценарий:

// A very simple object pooling class 
public class SimpleObjectPool : MonoBehaviour 
{ 
    // the prefab that this object pool returns instances of 
    public GameObject prefab; 
    // collection of currently inactive instances of the prefab 
    private Stack<GameObject> inactiveInstances = new Stack<GameObject>(); 

    // Returns an instance of the prefab 
    public GameObject GetObject() 
    { 
     GameObject spawnedGameObject; 

     // if there is an inactive instance of the prefab ready to return, return that 
     if (inactiveInstances.Count > 0) 
     { 
      // remove the instance from teh collection of inactive instances 
      spawnedGameObject = inactiveInstances.Pop(); 
     } 
     // otherwise, create a new instance 
     else 
     { 
      spawnedGameObject = (GameObject)GameObject.Instantiate(prefab); 

      // add the PooledObject component to the prefab so we know it came from this pool 
      PooledObject pooledObject = spawnedGameObject.AddComponent<PooledObject>(); 
      pooledObject.pool = this; 
     } 

     // put the instance in the root of the scene and enable it 
     spawnedGameObject.transform.SetParent(null); 
     spawnedGameObject.SetActive(true); 

     // return a reference to the instance 
     return spawnedGameObject; 
    } 

    // Return an instance of the prefab to the pool 
    public void ReturnObject(GameObject toReturn) 
    { 
     PooledObject pooledObject = toReturn.GetComponent<PooledObject>(); 

     // if the instance came from this pool, return it to the pool 
     if (pooledObject != null && pooledObject.pool == this) 
     { 
      // make the instance a child of this and disable it 
      toReturn.transform.SetParent(transform); 
      toReturn.SetActive(false); 

      // add the instance to the collection of inactive instances 
      inactiveInstances.Push(toReturn); 
     } 
     // otherwise, just destroy it 
     else 
     { 
      Debug.LogWarning(toReturn.name + " was returned to a pool it wasn't spawned from! Destroying."); 
      Destroy(toReturn); 
     } 
    } 
} 

// a component that simply identifies the pool that a GameObject came from 
public class PooledObject : MonoBehaviour 
{ 
    public SimpleObjectPool pool; 
} 

Как я могу отладить, чтобы выяснить, где проблема исходит от. Здесь только одна вещь влияет на трансформацию и не должна корректировать масштаб.

+0

Почти невозможно без скрипта SimpleObjectPool. – Programmer

+0

Я добавил скрипт SimpleObjectPool –

+0

Хорошо. Заменить 'spawnedGameObject = (GameObject) GameObject.Instantiate (prefab);' с 'spawnedGameObject = (GameObject) Instantiate (prefab);'. Дайте мне знать, если проблема все еще существует. – Programmer

ответ

1

Ответ:

newButton.transform.SetParent (ContentPanel, ложь);

https://docs.unity3d.com/ScriptReference/Transform.SetParent.html

// это делает игрок сохранить свою локальную ориентацию, а не его глобальной ориентации. player.transform.SetParent (newParent, false);

+1

Я действительно видел эту проблему раньше, и это было решение. Просто увидели, что вы комментируете 'newButton.transform.SetParent (contentPanel); 'теперь. – Programmer