对于游戏开发者来说,很多时候需求是非常独特而且奇特的。这个时候我们就需要高效的技术和创造力可以解决这些问题。这篇文章将介绍如何在Unity3D平台上实现3D旋转菜单,内容包括代码和注释。
代码:
using System.Collections;
using System.Collections.Generic;
using DG.Tweening;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.SceneManagement;
// 实现拖拽和释放事件的接口
public class RotaryFigure : MonoBehaviour,IDragHandler,IEndDragHandler
{
private float des;
private List<GameObject> list = new List<GameObject>();
private int num = 10;
private List<Transform> trlist = new List<Transform>();
private float speed = 1;
// 雷达图
public RadarMap rm;
private float r;
// Start is called before the first frame update
void Start()
{
// 移动方法
Move();
}
// Update is called once per frame
void Update()
{
}
// 当拖动时触发
public void OnDrag(PointerEventData eventData)
{
// 计算旋转角度
des -= eventData.delta.x / Screen.width;
// 调用移动方法
Move();
}
// 调用移动方法
public void Move()
{
// 计算移动距离
float movesc = (des / num) (2 Mathf.PI);
// 计算旋转半径
r = num / (2 Mathf.PI);
// 计算旋转角度
float ang= (2 Mathf.PI) / num;
// 遍历每个模型
for (int i = 0; i < num; i++)
{
float x = Mathf.Sin(ang i + movesc) r;
float z = Mathf.Cos(ang i + movesc) r;
// 如果列表中不存在当前模型则添加到列表中
if (list.Count<=i)
{
list.Add(Instantiate(Resources.Load<GameObject>("player/player_" + i)));
// 获取模型的Transform
trlist.Add(list[i].transform);
}
// 移动当前模型位置
list[i].transform.position = new Vector3(x, 0, z);
}
}
// 当拖拽完成时触发
public void OnEndDrag(PointerEventData eventData)
{
// 计算需要旋转的时间
float time = Mathf.Abs(eventData.delta.x) / speed;
time = time >2 ? 2 : time;
// 定义 Tween 动画实现动态的旋转
DOTween.To((float a) =>
{
des -= a / Screen.width;
Move();
}, eventData.delta.x, 0, time).SetEase(Ease.InOutQuad).OnComplete(() =>
{
// 根据模型的位置进行排序
trlist.Sort((a,b) =>
{
if (a.position.z>b.position.z)
{
return 1;
}else if (a.position.z==b.position.z)
{
return 0;
}
else
{
return -1;
}
});
// 计算需要旋转的角度
float moveAng = Mathf.Asin(trlist[0].position.x / r);
float dis = (moveAng / (Mathf.PI 2)) num;
float ti = Mathf.Abs(dis) / speed;
// 定义 Tween 动画实现动态的旋转
DOTween.To((float b) =>
{
des = b;
Move();
}, des, des + dis, ti).OnComplete(() =>
{
// 根据新的角度设置雷达图的数值
int num_one = Random.Range(0, 6);
int num_two = Random.Range(0, 6);
int num_three = Random.Range(0, 6);
int num_four = Random.Range(0, 6);
int num_five = Random.Range(0, 6);
rm.arr = new float[] {num_one, num_two, num_three, num_four, num_five};
rm.SetVerticesDirty();
});
});
}
}
注释:代码中添加了详细的注释。通过注释我们可以了解每一行代码的含义,方便我们理解代码的实现逻辑。
这篇代码主要是使用轮转图的方式更换我们的雷达图,并且可以更换其他的图片,如果需要雷达图的代码可以查看我之前的博客http://t.csdn.cn/LSlVL
总结:本文提供了在Unity3D平台上实现3D旋转菜单的代码和注释。如果您想制作独一无二的游戏,需要具备高效的技术和创造性思维,欢迎学习本文的实现方法,并将其运用到您的项目中。