Unity3d 获取对象在网格布局中的位置

Unity3d 获取对象在网格布局中的位置,unity3d,transform,grid-layout,Unity3d,Transform,Grid Layout,如何获得网格布局中对象的实际位置?在我当前的迭代中,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

如何获得网格布局中对象的实际位置?在我当前的迭代中,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);
}

直到下一帧,位置值才会更新。为了使您能够进行大量更改,而不会使每个更改都导致对这些元素进行完整的重新计算,它将存储需要计算的项目,然后在下一帧开始时更新这些项目

因此,一个选项是使用一个协程来等待一帧,然后获取位置

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);
}

在几年前询问/回答此问题时,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();

非常好的更新,谢谢。
LayoutRebuilder
中的后一种方法似乎在
Start()
中有效,只需将rectcransform设置为参数(
gameObject.GetComponent()
)就可以了,尽管您可能遇到了不同的场景或错误。
LayoutRebuilder.ForceRebuildLayoutImmediate(_gridLayoutTransform);