流程
作用:根据子物体的数量进行圆形分布
参数:
- Radius :可以设置半径
- StartAngle:开始角度,指的是最开始的Item在圆心的那个角度,圆心的正方向是0度,然后逆时针增加(如正上方是90度)
- IsAutoRotateSelfToCenter:是否旋转Item指向中心点。
操作方式:
点击右上角,如下图
/// <summary>
/// 圆形抽奖的Items,绑定在Item的父物体上
/// </summary>
public class CycleLayout : MonoBehaviour
{
[Header("点击组件右上角测试里的设置自动圆形排列Item")] public int Radius = 300;
[Tooltip("我们以圆的正上方为Item第一个是圆的90度位置,逆时针")]
public int StartAngle = 90;
[Tooltip("自动旋转item指向中心点")] public bool IsAutoRotateSelfToCenter = true;
[ContextMenu("自动圆形排列")]
public void SetCycleLayout()
{
RectTransform rectTransform = this.GetComponent<RectTransform>();
var size = rectTransform.sizeDelta;
float interval = 360 / this.transform.childCount;
for (int i = 0; i < this.transform.childCount; i++)
{
//1.让item平均分布在圆外围的位置
float curAngle = (StartAngle - i * interval) * Mathf.Deg2Rad;
Vector2 pos = new Vector2(Radius * Mathf.Cos(curAngle), Radius * Mathf.Sin(curAngle));
var child = rectTransform.GetChild(i);
child.localPosition = pos;
//2.让item方向朝向中心点
if (IsAutoRotateSelfToCenter)
{
Vector2 dir1 = -pos; //当前指向原点
Vector2 dir2 = Vector2.down; //
float signedAngle = Vector2.SignedAngle(dir1, dir2);
Debug.Log($"SignedAngle:{signedAngle}");
child.localRotation = Quaternion.Euler(0, 0, -signedAngle);
}
}
}