public static IEnumerator RelayoutWithUpdateAsync <T>(Vector2 baseSize, LTAsyncRootElement rootElement, Dictionary <LTElementType, object> updateValues, IAsyncLayouter layouter) where T : IMissingSpriteCache, new() { var originX = 0f; var originY = 0f; var rootObject = rootElement.gameObject; var elements = rootElement.GetLTElements(); foreach (var element in elements) { if (element is ILayoutableText) { if (0 < element.transform.childCount) { var count = element.transform.childCount; for (var i = 0; i < count; i++) { // get first child. var child = element.transform.GetChild(0); child.gameObject.SetActive(false); child.transform.SetParent(null); GameObject.Destroy(child.gameObject); } } } var rectTrans = element.GetComponent <RectTransform>(); rectTrans.anchoredPosition = Vector2.zero; } layouter.UpdateValuesAsync(elements, updateValues); var lineContents = new List <RectTransform>();// 同じ行に入っている要素を整列させるために使用するリスト var currentLineMaxHeight = 0f; var opId = Guid.NewGuid().ToString(); var currentSize = baseSize; // この下のレイヤーで全ての非同期layout処理を集める。 var layoutOps = layouter.LayoutAsync <T>(ref currentSize, out originX, out originY, rootObject, rootElement, elements, ref currentLineMaxHeight, ref lineContents); var layouted = false; ParameterReference resultRefObject = null; AsyncLayoutExecutor.LaunchLayoutOps( opId, currentSize.x, layoutOps, pos => { layouted = true; resultRefObject = pos; } ); while (!layouted) { yield return(null); } layouter.AfterLayout(baseSize, resultRefObject.originX, resultRefObject.originY, rootObject, rootElement, elements, ref resultRefObject.currentLineMaxHeight, ref resultRefObject.lineContents, resultRefObject.wrappedSize); lineContents.Clear(); }