Unity3d 获取对象在网格布局中的位置
如何获得网格布局中对象的实际位置?在我当前的迭代中,symbolPosition始终返回0,0,0Unity3d 获取对象在网格布局中的位置,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
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);