设置预制体对象、数量、半径、角度、移动的角度、两个用以存放对象的集合
遍历、计算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);
}
效果