Unity3D轮转图

        对于游戏开发者来说,很多时候需求是非常独特而且奇特的。这个时候我们就需要高效的技术和创造力可以解决这些问题。这篇文章将介绍如何在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旋转菜单的代码和注释。如果您想制作独一无二的游戏,需要具备高效的技术和创造性思维,欢迎学习本文的实现方法,并将其运用到您的项目中。

猜你喜欢

转载自blog.csdn.net/Asklyw/article/details/130371878