2D轮转图

设置预制体对象、数量、半径、角度、移动的角度、两个用以存放对象的集合

遍历、计算x,y、生成预制体对象添加到集合中、取出单个对象给其位置赋值并计算其缩放、与3D不同3D是改变坐标中Z值2D是改变缩放用以显示旋转效果

生成对象处理移动缩放方法、赋值完缩放和位置后、直接进行排序用以处理层级问题

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using DG.Tweening;

public class RotateMap2D : MonoBehaviour,IDragHandler,IEndDragHandler
{
    public GameObject m_prefab;
    public int m_num;
    public float m_r;
    float m_angle;
    float m_moveAngle;
    List<GameObject> m_cells = new List<GameObject>();
    List<GameObject> m_lists = new List<GameObject>();
    // Start is called before the first frame update
    void Start()
    {
        m_angle = 2 * Mathf.PI / m_num;
        Move();
    }
    public void Move()
    {
        for (int i = 0; i < m_num; i++)
        {
            float x = Mathf.Sin(i * m_angle + m_moveAngle) * m_r;
            float z = Mathf.Cos(i * m_angle + m_moveAngle) * m_r;
            if (m_cells.Count<=i)
            {
                GameObject go = Instantiate(m_prefab, transform);
                m_cells.Add(go);
                m_lists.Add(go);
            }
            m_cells[i].transform.localPosition = new Vector3(x, 0, 0);
            float scale = (z + m_r) / (2 * m_r) * (1 - 0.5f) + 0.5f;
            m_cells[i].transform.localScale = Vector3.one * scale;
        }
        m_lists.Sort((a,b) =>
        {
            return (int)(a.transform.localScale.z*100 - b.transform.localScale.z*100);
        });
        for (int i = 0; i < m_lists.Count; i++)
        {
            m_lists[i].transform.SetSiblingIndex(i);
        }
    }

gameObject.transform.SetSiblingIndex()方法用以设置层级

处理拖拽问题代码(接上)

 public void OnDrag(PointerEventData eventData)
    {
        m_moveAngle += eventData.delta.x / m_r;
        Move();
    }

    public void OnEndDrag(PointerEventData eventData)
    {
        DOTween.To((a) =>
        {
            m_moveAngle += a / m_r;
            Move();
        },eventData.delta.x,0,1).OnComplete(()=> {
            //float ang = Mathf.Asin(m_lists[m_num - 1].transform.localPosition.x / m_r);
            //DOTween.To((a) =>
            //{
            //    m_moveAngle = a;
            //    Move();
            //}, m_moveAngle, m_moveAngle+ang,1);
            OnClick(m_cells.IndexOf(m_lists[m_num - 1]));
        });
    }
    public void OnClick(int n)
    {
        int index = m_cells.IndexOf(m_lists[m_num - 1]);
        float ang = (index - n) * m_angle;
        float endang= Mathf.Asin(m_lists[m_num - 1].transform.localPosition.x / m_r)+ang;
        DOTween.To((a) =>
        {
            m_moveAngle = a;
            Move();
        }, m_moveAngle, m_moveAngle - endang, 1);
    }

效果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值