Unity 扩散式布局
如图所示,可以随意增加数量,半径,起始角度和终止角度等。
代码使用Dotween,如有报错,还请检查是否引入了该组件
代码如下:
using UnityEngine;
using DG.Tweening;
public class CircularMenuController : MonoBehaviour
{
[Header("菜单配置")]
[Tooltip("子物体数量,即段数")]
public int segments = 6;
[Tooltip("子物体移动的半径")]
public float radius = 100f;
[Tooltip("子物体分布的起始角度")]
public float startAngle = 0f;
[Tooltip("子物体分布的终止角度")]
public float endAngle = 359f;
[Header("动画配置")]
[Tooltip("动画持续时间")]
public float duration = 0.5f;
[Tooltip("打开状态的缓动类型")]
public Ease openEase = Ease.OutBack;
[Tooltip("关闭状态的缓动类型")]
public Ease closeEase = Ease.InBack;
public bool isOpen = false;
private Transform[] childTransforms;
void Start()
{
// 获取所有子物体的Transform组件
childTransforms = new Transform[segments];
for (int i = 0; i < segments; i++)
{
if (i < transform.childCount)
{
childTransforms[i] = transform.GetChild(i);
}
else
{
// 如果子物体数量不足,则创建新的空物体作为占位符
GameObject placeholder = new GameObject("Placeholder " + i);
placeholder.transform.SetParent(transform);
placeholder.transform.localPosition = Vector3.zero;
childTransforms[i] = placeholder.transform;
}
}
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
ToggleMenu();
}
}
/// <summary>
/// 切换菜单状态:打开或关闭
/// </summary>
public void ToggleMenu()
{
if (isOpen)
{
CloseMenu();
}
else
{
OpenMenu();
}
}
/// <summary>
/// 打开菜单:子物体从中心移动到圆周边缘
/// </summary>
public void OpenMenu()
{
float angleStep = (endAngle - startAngle) / segments;
for (int i = 0; i < segments; i++)
{
float angle = startAngle + angleStep * i;
float rad = angle * Mathf.Deg2Rad;
Vector2 targetPos = new Vector2(Mathf.Cos(rad) * radius, Mathf.Sin(rad) * radius);
childTransforms[i].DOLocalMove(targetPos, duration).SetEase(openEase);
}
isOpen = true;
}
/// <summary>
/// 关闭菜单:子物体从圆周边缘移动回中心
/// </summary>
public void CloseMenu()
{
for (int i = 0; i < segments; i++)
{
childTransforms[i].DOLocalMove(Vector2.zero, duration).SetEase(closeEase);
}
isOpen = false;
}
}
如果代码帮到你,还请点个关注,给个三连。
感谢你的支持,如有其他疑问欢迎评论。
@Liam