Unity3D轮转图(有回正效果,以及指定到达某处位置)

注意:Main Camera 需要挂载Physics RayCaster

           Hierarchy中添加UI里面的EventSystem对象(用来相应拖拽事件)

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

public class Rotate3D : MonoBehaviour, IDragHandler, IEndDragHandler
{
    //生成的数量
    int count = 5;
    //半径
    public int r = 3;
    //需要旋转的弧度
    float movehu = 0;
    //对象集合
    List<GameObject> gameObjects = new List<GameObject>();
    //排序集合
    List<Transform> transforms = new List<Transform>();
    //每个角的弧度
    float hu;
    // Start is called before the first frame update
    void Start()
    {
        hu = 2 * Mathf.PI / count;
        //初始化加载每个预制体到对应位置
        CreateCube();
        //默认加载第一个
        ChoseNumber(0);
    }

    private void HandleDragUpdated(float offset)
    {
        movehu = offset;
        CreateCube();

    }
    //指定去某个位置
    private void ChoseNumber(int n)
    {
        transforms = transforms.OrderBy(x => x.position.z).ToList();
        int index = gameObjects.IndexOf(transforms[0].gameObject);
        int next = index - n;
        int anext = count - Mathf.Abs(next);
        anext = next < 0 ? anext : -anext;
        float nextMove = (Mathf.Abs(next) < Mathf.Abs(anext) ? next : anext) * hu;
        float nextAng = Mathf.Asin(transforms[0].position.x / r) + nextMove;
        DT.To((c) =>
        {
            movehu = c;
            CreateCube();
        }, movehu, movehu + nextAng, Mathf.Abs(nextAng));
    }

    private void CreateCube()
    {
        for (int i = 0; i < count; i++)
        {
            if (gameObjects.Count <= i)
            {
                //加载需要加载的预制体
                GameObject obj = GameObject.Instantiate(Resources.Load<GameObject>("player/player_" + i), transform);
                obj.transform.Rotate(Vector3.up * 180);
                gameObjects.Add(obj);
                transforms.Add(gameObjects[i].transform);
            }
            float x = Mathf.Sin(hu * i + movehu) * r;
            float y = Mathf.Cos(hu * i + movehu) * r;
            gameObjects[i].transform.position = new Vector3(x, 0, y);
        }
    }

    public void OnDrag(PointerEventData eventData)
    {
        var dis = eventData.delta.x / (r * 100);
        movehu -= dis;//控制方向
        CreateCube();
    }

    public void OnEndDrag(PointerEventData eventData)
    {
        var dis = eventData.delta.x / 100;
        DT.To((a) =>
        {
            movehu -= a / r;
            CreateCube();
        }, dis, 0, Mathf.Abs(dis / r)).OnComplete(() =>
        {
            transforms = transforms.OrderBy(x => x.position.z).ToList();
            float zhenghu = Mathf.Asin(transforms[0].position.x / r);
            DT.To((b) =>
            {
                movehu = b;
                CreateCube();
            }, movehu, movehu + zhenghu, 1);
        });
    }
}

DO.To() 方法参考我作品中的Unity手写模拟DoTween中的To功能 也可以直接使用DoTween包

  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HTML和CSS可以通过使用CSS3的transform属性来实现3D轮转。下面是一个简单的实现步骤: 1. 首先,在HTML文件中创建一个容器元素,用于包裹轮转的所有元素。例如: ```html <div class="container"> <!-- 定义每个像的元素 --> <div class="image"></div> <div class="image"></div> <div class="image"></div> <!-- 可添加更多像元素 --> </div> ``` 2. 接下来,在CSS文件中设置容器元素和像元素的样式。首先,设置容器元素的样式,使其能够显示出3D效果: ```css .container { width: 300px; /* 设置容器宽度 */ height: 300px; /* 设置容器高度 */ perspective: 1000px; /* 设置透视效果,值越大离观察者越远 */ } ``` 3. 然后,设置像元素的样式,并应用3D效果: ```css .image { width: 100%; /* 设置像元素宽度 */ height: 100%; /* 设置像元素高度 */ background-image: url("路径/到/像"); /* 设置像背景 */ background-size: cover; /* 设置像背景大小,以覆盖整个像元素 */ transform-style: preserve-3d; /* 保持3D效果 */ animation: rotation 10s infinite linear; /* 设置像旋转动画,时间、循环方式可根据需求自行调整 */ } @keyframes rotation { from { transform: rotateY(0deg); /* 开始时的旋转角度 */ } to { transform: rotateY(360deg); /* 结束时的旋转角度 */ } } ``` 通过以上步骤,我们就可以实现一个简单的3D轮转。你可以根据需要调整容器元素和像元素的样式,添加更多的像元素来实现更复杂的效果

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值