bazi

C#轮转图

 

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

public class RotationChart : MonoBehaviour
{
    public int n;//个数
    public float spacing = 1;//间距
    float c;//周长
    float r;//半径
    float ang;//每个角的弧度
    float distance = 0;//拖动的距离
    List<GameObject> list = new List<GameObject>();
    List<Transform> sortList = new List<Transform>();
    // Start is called before the first frame update
    void Start()
    {
        //计算周长
        c = (1 + spacing) * n;
        //计算半径
        r = c / (2 * Mathf.PI);
        //计算每个角的弧度
        ang = 2 * Mathf.PI / n;
        //创建人
        for (int i = 0; i < n; i++)
        {
            list.Add(Instantiate(Resources.Load<GameObject>("player/player_" + i), transform));
            float x = Mathf.Sin(i * ang) * r;
            float z = Mathf.Cos(i * ang) * r;
            list[i].transform.localPosition = new Vector3(x, 0, z);
            list[i].AddComponent<PlayerMove>();
            sortList.Add(list[i].transform);
        }
    }
    public void Move(float dis)
    {
        distance += dis;
        //计算移动的弧度 = 距离/半径
        float moveAng = distance / r;
        //重新计算位置
        for (int i = 0; i < list.Count; i++)
        {
            float x = Mathf.Sin(i * ang + moveAng) * r;
            float z = Mathf.Cos(i * ang + moveAng) * r;
            list[i].transform.localPosition = new Vector3(x, 0, z);
        }
    }
    //惯性,惯性的初速度就是最后一帧移动的距离
    public void Inertia(float endspeed)
    {
        //注意:距离有正有负,时间没有,所以求时间要用绝对值
        //计算时间 = 初速度/衰减速度
        float time = Mathf.Abs(endspeed) / 1;
        DOTween.To((float a) =>
        {
            Move(a);
        }, endspeed, 0, time).OnComplete(() =>
           {
               //惯性结束之后调用对齐
               Align();
           });
    }
    public void Align()
    {
        //找到离相机最近的
        //按z排序
        sortList.Sort((a, b) =>
        {
            if (a.localPosition.z < b.localPosition.z)
            {
                return 1;
            }
            else if(a.localPosition.z == b.localPosition.z)
            {
                return 0;
            }
            else
            {
                return -1;
            }

        });
        Debug.Log(sortList[0].localPosition.z);
        float AlignAng = Mathf.Atan(sortList[0].localPosition.x / sortList[0].localPosition.z);
        float AlignDis = AlignAng * r;
        //注意:距离有正负,时间没有,所以要用绝对值
        //时间 = 距离/ 速度
        float time = Mathf.Abs(AlignDis) / 1;
        DOTween.To((float a) =>
        {
            Move(a - distance);
        }, distance, distance - AlignDis, time);

    }
    // Update is called once per frame
    void Update()
    {
    }
}

 

posted on 2023-02-24 08:34  芭梓  阅读(18)  评论(0编辑  收藏  举报

导航