2016-11-15 55 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)实例化(预制);'替换'spawnedGameObject =(GameObject)GameObject.Instantiate(prefab);'。让我知道如果问题仍然存在。 – Programmer

回答

1

答案是:

newButton.transform.SetParent(的ContentPanel,FALSE);

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

//这使得玩家保持其局部方向,而不是它的全球定位。 player.transform.SetParent(newParent,false);

+1

我真的已经看到过这个问题,这是解决方案,只是看到你对'newButton.transform.SetParent(contentPanel); '现在。 – Programmer