当前位置: 首页 > news >正文

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 

相关文章:

  • Unity 带阻尼感的转盘
  • 数智读书笔记系列015 探索思维黑箱:《心智社会:从细胞到人工智能,人类思维的优雅解读》读书笔记
  • Openlayer+天地图+山东天地图
  • Html5学习教程,从入门到精通, HTML5超链接应用的详细语法知识点和案例代码(18)
  • uni-app+vue3学习随笔
  • 深度学习PyTorch之数据加载DataLoader
  • KafkaRocketMQ
  • AI智能导航站HTML5自适应源码帝国cms7.5模板
  • word甲烷一键下标
  • 08 HarmonyOS NEXT 仿uv-ui Tag组件开发教程系列(二)
  • 【Java学习】包装类
  • 【商城实战(20)】商品管理功能深化实战
  • 【理想解法学习笔记】
  • 计算机操作系统
  • docker企业级事例部署phpmyadmin和MySQL
  • win10电脑鼠标速度突然变的很慢?
  • 【Go语言圣经1.1】
  • Linux 常用测试网络带宽命令
  • 八股打卡(七)
  • 密码学 网络安全 科普 网络安全密码技术
  • 四川6月龄男婴确诊心衰、重症肺炎:治疗缺钱,母亲发起求助
  • 美发布“金穹”导弹防御系统发展规划
  • 小满:一庭栀子香
  • 受工友诱骗为获好处费代购免税品,海口海关:两当事人被立案
  • “80后”湖南岳阳临湘市市长刘琦任临湘市委书记
  • 年内首次存款利率下调启动:3年期、5年期均下调0.25个百分点