2015-07-13 42 views
2

如何獲取網格佈局中對象的實際位置?在我目前的迭代符號位置不斷返回0,0,0。獲取網格佈局中對象的位置

public void OnPointerClick (PointerEventData eventData) 
{ 
    // Instantiate an object on click and parent to grid 
    symbolCharacter = Instantiate(Resources.Load ("Prefabs/Symbols/SymbolImage1")) as GameObject; 
    symbolCharacter.transform.SetParent(GameObject.FindGameObjectWithTag("MessagePanel").transform); 

    // Set scale of all objects added 
    symbolCharacter.transform.localScale = symbolScale; 

    // Find position of objects in grid 
    symbolPosition = symbolCharacter.transform.position; 
    Debug.Log(symbolPosition); 
} 

回答

4

位置值不會更新,直到下一幀。爲了允許您進行很多更改,而不必每次更改都導致整個重新計算這些元素,它會存儲需要計算的項目,然後在下一幀的開始時更新它們。

這樣的選擇是使用一個協程等待一個框架,然後得到位置

public void OnPointerClick (PointerEventData eventData) 
{ 
    // Instantiate an object on click and parent to grid 
    symbolCharacter = Instantiate(Resources.Load ("Prefabs/Symbols/SymbolImage1")) as GameObject; 
    symbolCharacter.transform.SetParent(GameObject.FindGameObjectWithTag("MessagePanel").transform); 

    // Set scale of all objects added 
    symbolCharacter.transform.localScale = symbolScale; 

    StartCoroutine(CoWaitForPosition()); 
} 

IEnumerator CoWaitForPosition() 
{ 
    yield return new WaitForEndOfFrame(); 
    // Find position of objects in grid 
    symbolPosition = symbolCharacter.transform.position; 
    Debug.Log(symbolPosition); 
} 
0

這可能不會一直當這個問題被問的API中,但是這似乎工作,迫使GridLayoutGroup將子對象放置在添加子對象的框架中,從而消除了對協程的需求。

for(int i = 0; i < 25; i++){ 
     GameObject gridCell = Instantiate(_gridCellPrefab); 
     gridCell.transform.SetParent(_gridLayoutTransform,false); 
    } 

    _gridLayoutGroup.CalculateLayoutInputHorizontal(); 
    _gridLayoutGroup.CalculateLayoutInputVertical(); 
    _gridLayoutGroup.SetLayoutHorizontal(); 
    _gridLayoutGroup.SetLayoutVertical(); 

從這裏,你可以得到'gridCells'同一幀的位置。

還有另一個功能,它似乎應該實現這個目的,但它不適合我。該API對內部正在發生的事情非常安靜:

LayoutRebuilder.ForceRebuildLayoutImmediate(_gridLayoutTransform);