2015-07-13 3 views
2

Как я могу получить фактическое положение объекта в макете сетки? В моей текущей итерации symbolPosition продолжает возвращаться 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); 
Смежные вопросы