Unity 拖拽旋转效果(轮转图)

目录

 

3D旋转效果

3D旋转效果代码部分

UI旋转效果


3D旋转效果

 3D旋转效果代码部分

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

//3D轮转图
public class RotationChart : MonoBehaviour, IDragHandler,IEndDragHandler
{
    int num = 6;
    List<GameObject> players = new List<GameObject>();
    List<Transform> sortlist = new List<Transform>();
    float distance = 0;
    float speed = 1;
    float r;
    public Transform img;
    GameObject game;
    public void OnDrag(PointerEventData eventData)
    {
        distance -= eventData.delta.x/Screen.width;
        Move();
    }
    public void OnEndDrag(PointerEventData eventData)
    {
        float time = Mathf.Abs(eventData.delta.x) / speed;
        time = time > 2 ? 2 : time;
        DOTween.To((float a) =>
        {
            distance -= a / Screen.width;
            Move();
        }, eventData.delta.x, 0, time).SetEase(Ease.InOutQuad).OnComplete(() =>
        {
            sortlist.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(sortlist[0].position.x / r);
            float distance2 = (moveAng / (Mathf.PI * 2)) * num;
            float time2= Mathf.Abs(distance2) / speed;
            DOTween.To((float d) =>
            {
                distance = d;
                Move();
            }, distance, distance + distance2, time2).OnComplete(() =>
            {
              // img.GetComponent<RedarChart>().SetAllDirty();//刷新雷达图数据
            });
        });
    }
    void Start()
    {
        Move();
    }

    public void Move()
    {
        float ang = Mathf.PI * 2 / num;
        r = num / (Mathf.PI * 2);
        for (int i = 0; i < num; i++)
        {
            float x = Mathf.Sin(ang * i + distance) * r;
            float z = Mathf.Cos(ang * i + distance) * r;
            if (players.Count <= i)
            {
                players.Add(Instantiate(Resources.Load<GameObject>("huan" + (i+1)), transform));
                sortlist.Add(players[i].transform);
            }
            players[i].transform.position = new Vector3(x, 0, z);
        }
    }
}

UI旋转效果

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

//2D轮转图
public class RotationChart2D : MonoBehaviour, IDragHandler, IEndDragHandler
{
    public GameObject prefab;//图片预制体
    public GameObject can;//Canvas
    int num = 13;//数量
    float spacing = 10;//间距
    float spacingMax = 1;//缩放最大值
    float spacingMin = 0.5f;//缩放最小值
    float distance = 0;//转动距离
    float ang;//弧度
    float l;//周长
    float r;//半径
    float speed = 10;//速度
    List<GameObject> imglist = new List<GameObject>();//图片集合
    List<Transform> sortimglist = new List<Transform>();//排序后的图片集合
    public Button yg;//老虎机摇杆
    public Text text;//数据显示
    int www = 0;//id
    //拖拽
    public void OnDrag(PointerEventData eventData)
    {
        //拖动距离
        distance -= eventData.delta.y;
        //调用移动方法
        Move();
    }
    //拖拽结束
    public void OnEndDrag(PointerEventData eventData)
    {
        //结束时间
        float time = Mathf.Abs(eventData.delta.x) / speed;
        //时间限制
        time = time > 2 ? 2 : time;
        //移动惯性
        DOTween.To((float a) =>
        {
            //改变移动距离
            distance -= a;
            //调用移动方法
            Move();
        }, eventData.delta.y, 0, time).SetEase(Ease.InOutQuad).OnComplete(() =>
        {
            //移动结束后找到距离相机最近的图片id
            //int index = sortimglist[sortimglist.Count - 1].GetComponent<RotationCall>().id;
            调用对齐方法
            //Aalide(index);
        });
    }
    //对齐
    public void Aalide(int id)
    {
        //当前最前方图片id
        int b = 1;// sortimglist[sortimglist.Count - 1].GetComponent<RotationCall>().id;
        //计算当前最前方图片与传过来的图片id的差值
        int c = b - id;
        //计算另外一条线路移动距离
        int d = num - Mathf.Abs(c);
        //得出最终移动方向和距离
        int e = d > Mathf.Abs(c) ? c : (c > 0 ? -d : d);
        //计算移动弧度
        float moveAng = Mathf.Asin(sortimglist[sortimglist.Count - 1].localPosition.y / r) + (e * ang);
        //计算移动距离
        float distance2 = (moveAng / (Mathf.PI * 2)) * l;
        //计算移动时间
        float time2 = Mathf.Abs(distance2) / speed;
        //对齐
        //DOTween.To((float d) =>
        //{
        //    //改变移动距离
        //    distance = d;
        //    //调用移动方法
        //    Move();
        //}, distance, distance + distance2, 1).OnComplete(() =>
        //{
        //    //操作选中的玩家数据
            
        //});
    }
    // Start is called before the first frame update
    void Start()
    {
        //计算弧度
        ang = (2 * Mathf.PI) / num;
        //计算周长
        l = (prefab.GetComponent<RectTransform>().sizeDelta.x + spacing) * num;
        //计算半径
        r = l / (2 * Mathf.PI);
        //调用移动方法
        Move();
        //摇杆监听
        //yg.onClick.AddListener(() =>
        //{
        //    //获取随机数
        //    int n = UnityEngine.Random.Range(0, 13);
        //    Debug.Log(n + 1);
        //    //调用对齐方法
        //    Aalide(n);
        //});
    }
    public void Move()
    {
        //计算移动弧度
        float moveAng = (distance / l) * (2 * Mathf.PI);
        //循环图片个数
        for (int i = 0; i < num; i++)
        {
            //计算点的坐标位置
            float y = Mathf.Sin(i * ang + moveAng) * r;
            float z = Mathf.Cos(i * ang + moveAng) * r;
            //判断并创建图片
            if (imglist.Count <= i)
            {
                //创建图片添加到图片集合
                imglist.Add(Instantiate(prefab, transform));
                //添加脚本给id赋值
              //  imglist[i].AddComponent<RotationCall>().id = i;
                //赋值图片
                imglist[i].GetComponent<Image>().sprite = Resources.Load<Sprite>("纸牌资源/card_1_" + (i + 1));
                //添加到排序集合
                sortimglist.Add(imglist[i].transform);
            }
            //给图片赋值位置
            imglist[i].transform.localPosition = new Vector3(0, y, 0);
            //计算图片缩放
            float scalingRatio = 1 - (z + r) / (2 * r);
            //赋值图片的缩放
            imglist[i].transform.localScale = Vector3.one * ((spacingMax - spacingMin) * scalingRatio + spacingMin);
        }
        //排序
        sortimglist.Sort((a, b) =>
        {
            //大于返回1
            if (a.localScale.x > b.localScale.x)
            {
                return 1;
            }//等于返回0
            else if (a.localScale.x == b.localScale.x)
            {
                return 0;
            }//小于返回-1
            else
            {
                return -1;
            }
        });
        //循环获取id
        for (int i = 0; i < sortimglist.Count; i++)
        {
            //获取节点id
            sortimglist[i].SetSiblingIndex(i);
        }
    }
}

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Unity是一个功能强大的游戏引擎,可用于创建各种2D和3D游戏。在Unity中,拖拽旋转物体是一个常见的需求,可以通过以下步骤实现。 首先,通过添加组件将对象转化为可挂接的对象。可以挂接一个刚体组件或是使用物理引擎,也可以使用脚本控制其移动和旋转。 然后,鼠标右键单击对象,选择“3D对象”、“空物体”或“其他”选项。这将创建一个空对象,它将成为控制器。将控制器命名为“旋转控制器”。 接着,将对象拖到旋转控制器上,并将其调整到对象的中心点。这样一来,我们就可以通过拖拽旋转控制器来旋转对象。还可以通过缩放控制器来改变对象的大小,通过移动控制器来移动对象。 最后,在脚本中添加代码来控制旋转控制器。例如,可以编写代码使控制器沿着Y轴旋转,或根据鼠标的拖拽旋转控制器。还可以使用键盘控制器来旋转控制器。 以上步骤可帮助你在Unity中实现拖拽旋转物体的效果。掌握了这些技能,你将能够创建出更加复杂而精彩的游戏。 ### 回答2: Unity拖拽旋转物体非常简单。首先,我们需要在场景中创建一个物体,比如一个立方体。然后,我们将其选择并拖拽到层次结构视中。接着,我们点击场景视中的立方体,从而选择它。 现在,我们可以在场景视中看到三个箭头。分别是红、绿和蓝色的箭头,代表了物体在空间中的X、Y和Z轴。我们可以通过拖拽这些箭头来移动物体,也可以通过点击物体旁边的圆圈来旋转物体。我们可以按住鼠标左键来旋转物体,也可以按住鼠标右键来平移物体。按住鼠标中键可以放大和缩小物体。 如果需要更精确的控制,我们可以使用GameObject菜单中的旋转和平移选项,或者使用快捷键W(移动)、E(旋转)和R(缩放)。 总之,Unity拖拽旋转物体非常方便,可以通过鼠标和快捷键来进行控制,从而快速创建我们需要的场景。 ### 回答3: Unity引擎是一款非常强大的游戏开发引擎,它支持多种交互功能,其中最基本的是拖拽旋转物体。 拖拽物体需要用到Unity的Transform组件,它是每个游戏物体上都有的组件。拖拽物体,首先需要确保选中了合适的物体,并且该物体的Transform组件被打开。在场景视中点击选中该物体,然后可以通过点击并拖拽标识该物体的小圆圈,来将物体移动到新的位置。同时,可以在Inspector面板中手动修改该物体的Position属性值来实现位置的修改。 旋转物体也需要用到Transform组件。在场景视中选中需要旋转的物体,在该物体的Transform组件中找到Rotation属性。通过手动修改该属性的值或者直接在场景视中点击并拖动物体上的小圆球来旋转物体。 需要注意的是,旋转的方向会根据圆球的位置而不同,例如,在圆球上方旋转时,物体会围绕X轴旋转;在圆球左边旋转时,物体会围绕Y轴旋转;在圆球前方旋转时,物体会围绕Z轴旋转。 以上就是Unity拖拽旋转物体的基本操作方法。通过这些方法,可以轻松实现游戏物体的移动和旋转功能,为游戏开发带来更多的交互性和用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值