首页 > 编程语言 >C#轮转图

C#轮转图

时间:2023-02-24 08:44:25浏览次数:47  
标签:轮转 localPosition C# float list Mathf sortList public

 

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()
    {
    }
}

 

标签:轮转,localPosition,C#,float,list,Mathf,sortList,public
From: https://www.cnblogs.com/bazi/p/17150085.html

相关文章

  • IDEA&Eclipse快捷键对照表
    在Mac中commond替换Ctrloption替换AltIDEACommentEclipseCommentRemarkCtrl+Alt+H调用层次,方法调用Ctrl+Alt+H开放的调用层次结构Alt+F7查找光标......
  • 一文读透react精髓
    学和使用react有一年多了,最近想在梳理一下react基础知识,夯实基础,激流勇进~关于reacr-router,redux,redux-saga后续都会慢慢输出,希望各位看官老爷持续关注~~要是能给个赞......
  • 阿里前端二面必会react面试题指南
    这段代码有什么问题吗?这段代码有什么问题:this.setState((prevState,props)=>{return{streak:prevState.streak+props.count,};});答案:没有什么问......
  • docker swarm快速入门篇
    目录一.dockerswarm集群部署1.初始化manager节点2.worker节点加入集群3.查看集群节点列表4.给节点添加label5.将work节点提升为manager角色以实现高可用6.查看node信息7.......
  • 记Cucumber行为驱动测试的简单配置与使用方式
    产生背景代码测试的工具有很多,比如最常用的单元测试工具Junit、Jupiter、Mockito和PowerMockito,这几个可以说是Java开发者的心头好,代码测试一般都是用这几个里面的某一个......
  • C语言:几位数 乘积
    /*输入一个不大于4位正整数,判断它是几位数,然后输出各位之积。*/#include<stdio.h>main(){inta,cj=1,wei=0,b;scanf("%d",&a);b=a;if(a<=9999......
  • 深度好文:TCP三次握手和四次挥手深入实践
     TCP连接状态 图1是TCP三次握手、数据传输、四次挥手三个阶段的状态转移图,状态说明如下: LISTEN:侦听来自客户端的TCP端口的连接请求SYN-SENT:再发送连接请求后等......
  • 编写Chart部署RabibtMQ
    一、创建一个Charthelmcreaterabbitmq-cluster&&cdrabbitmq-cluster/#查看目录结构,都是熟悉的吧[root@k8s-master01rabbitmq-cluster]#tree..├──charts......
  • 换个角度理解TCP建立连接为什么需要三次握手
    1、第三次握手是为了防止失效的连接请求到达服务器,让服务器错误打开连接。2、换个易于理解的视角来看为什么要3次握手。客户端和服务端通信前要进行连接,“3次握手”的......
  • C语言填空:周岁
    /*编写程序,输入一个学生的生日(年:y0、月:m0、日:d0);并输入当前的日期(年:y1、月:m1、日:d1);输出学生的实际年龄周岁*/#include<stdio.h>main(){inty0,m0,d0,y1,m1,d1......