void UpdateItem(int count) { for (int i = 0; i < count; i++) { GameObject imageObj = adapter.GetGameObject(this, i); if (imageObj == null) { continue; } imageObj.transform.SetParent(uiRoundTable.transform, false); imageObj.AddComponent <KSPrivateDataReference>().setData <int>(i); TurnTableItem item = imageObj.GetComponent <TurnTableItem>(); Destroy(images[i]); images[i] = imageObj; lastRoundTableRotationRadian = roundTableRotationRadian - 1; UpdateLayout(); } _updateItemDone = true; }
//在update的时候调用,更新ui public void UpdateLayout() { //如果没旋转,保持原样,不必刷新位置 if (lastRoundTableRotationRadian == roundTableRotationRadian) { return; } lastRoundTableRotationRadian = roundTableRotationRadian; int newSelectedIndex = selectedIndex; for (int i = 0; i < count; i++) { //计算占位元素的位置(相对圆心的位置) float angleRadian = roundTableRotationRadian + i * Mathf.PI * 2 / maxCount + selectedRadian; Vector3 pos = new Vector3(Mathf.Cos(angleRadian), 0, Mathf.Sin(angleRadian)) * roundTableRadius; //设置占位元素的相对位置 GameObject placeHolder = placeHolders[i]; placeHolder.gameObject.transform.localPosition = pos; GameObject imageObj = images[i]; //通知item位置设置变化(item可在此修改自己alpha 亮度等) TurnTableItem item = imageObj.GetComponent <TurnTableItem>(); if (item != null) { item.OnPositionChanged(pos, roundTableRadius); } if (angleRadian >= selectMinRadian && angleRadian <= selectMaxRadian) { newSelectedIndex = i; } } if (newSelectedIndex != selectedIndex) { selectedIndex = newSelectedIndex; //通知选择变化 if (selectedListener != null) { selectedListener(selectedIndex); } } }
//设置数据绑定对象。只能设置一次,并且在start调用才生效 public void SetAdapter(TurnTableAdapter adapter, bool coroutineLoading = false) { this.adapter = adapter; //摆斜占位盘子、z轴偏移位置 float xOffset = 0; float zOffset = 0; float yOffset = 0; switch (selectMode) { case SelectedMode.Bottom: selectedRadian = Mathf.PI * 3 / 2; xOffset = 0; zOffset = Mathf.Cos(roundTableTiltDegree * Mathf.Deg2Rad) * roundTableRadius; yOffset = Mathf.Sin(roundTableTiltDegree * Mathf.Deg2Rad) * roundTableRadius; break; case SelectedMode.Top: selectedRadian = Mathf.PI / 2; xOffset = 0; zOffset = -Mathf.Cos(roundTableTiltDegree * Mathf.Deg2Rad) * roundTableRadius; yOffset = -Mathf.Sin(roundTableTiltDegree * Mathf.Deg2Rad) * roundTableRadius; break; case SelectedMode.Right: selectedRadian = 0; xOffset = -Mathf.Cos(selectedRadian) * roundTableRadius; zOffset = 0; yOffset = 0; break; case SelectedMode.Left: selectedRadian = Mathf.PI; xOffset = -Mathf.Cos(selectedRadian) * roundTableRadius; zOffset = 0; yOffset = 0; break; case SelectedMode.Center: selectedRadian = Mathf.PI / 2; xOffset = 0; zOffset = 0; yOffset = 0; break; } tiltTablePlaceHolder.transform.localPosition = new Vector3(xOffset, yOffset, zOffset); tiltTablePlaceHolder.transform.rotation = Quaternion.Euler(new Vector3(-roundTableTiltDegree, 0, 0)); //通过adapter获取数据数量 maxCount = adapter.GetMaxCount(); count = adapter.GetCount(); //计算每个item占的角度、从而计算出可滑动最大、最小角度 eachRadian = 2 * Mathf.PI / maxCount; minRotationRadian = -(eachRadian * (count - 1) + eachRadian / 2); maxRotationRadian = eachRadian / 2; selectMaxRadian = selectedRadian + eachRadian / 2; selectMinRadian = selectedRadian - eachRadian / 2; for (int i = 0; i < tiltTablePlaceHolder.transform.childCount; i++) { GameObject obj = tiltTablePlaceHolder.transform.GetChild(i).gameObject; Destroy(obj); } for (int i = 0; i < uiRoundTable.transform.childCount; i++) { Destroy(uiRoundTable.transform.GetChild(i).gameObject); } if (coroutineLoading) { //动态添加占位元素 和 显示元素 placeHolders = new GameObject[count]; images = new GameObject[count]; for (int i = 0; i < count; i++) { GameObject placeHolder = new GameObject(); placeHolder.name = "" + i; placeHolder.AddComponent <PlaceHolder>(); placeHolder.transform.SetParent(tiltTablePlaceHolder.transform, false); GameObject imageObj = new GameObject(); imageObj.transform.SetParent(uiRoundTable.transform, false); placeHolders[i] = placeHolder; images[i] = imageObj; } lastRoundTableRotationRadian = roundTableRotationRadian - 1; UpdateLayout(); UpdateItem(count); } else { _updateItemDone = true; //动态添加占位元素 和 显示元素 placeHolders = new GameObject[count]; images = new GameObject[count]; for (int i = 0; i < count; i++) { GameObject placeHolder = new GameObject(); placeHolder.name = "" + i; placeHolder.AddComponent <PlaceHolder>(); placeHolder.transform.SetParent(tiltTablePlaceHolder.transform, false); GameObject imageObj = adapter.GetGameObject(this, i); imageObj.transform.SetParent(uiRoundTable.transform, false); imageObj.AddComponent <KSPrivateDataReference>().setData <int>(i); TurnTableItem item = imageObj.GetComponent <TurnTableItem>(); placeHolders[i] = placeHolder; images[i] = imageObj; } lastRoundTableRotationRadian = roundTableRotationRadian - 1; UpdateLayout(); } }