3D轮转图

3D轮转图 + 雷达图 +CSV解析 选择的人物对应属性显示
1,csv解析
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerData
{
public string name;
public string attack;
public string defense;
public string speed;
public string hp;
public string mp;
public PlayerData(string name, string attack, string defense, string speed, string hp, string mp)
{
this.name = name;
this.attack = attack;
this.defense = defense;
this.speed = speed;
this.hp = hp;
this.mp = mp;
}
}
public class AnalyticData : MonoBehaviour
{
public List<PlayerData> datas = new List<PlayerData>();
// Start is called before the first frame update
void Start()
{
string csv = Resources.Load<TextAsset>("Sheet1").text;
string[] list = csv.Split('\n');
for (int i = 0; i < list.Length; i++)
{
string[] arr= list[i].Split(',');
datas.Add(new PlayerData(arr[0], arr[1], arr[2], arr[3], arr[4], arr[5]));
}
}
}
2,雷达图
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.UI;
public class RadarMap : MaskableGraphic
{
public float[] arr;
public float r;
protected override void OnPopulateMesh(VertexHelper vh)
{
vh.Clear();
int num = arr.Length;
if (num >= 3)
{
Rect rect = rectTransform.rect;
r = rect.width < rect.height ? rect.width / 2 : rect.height / 2;
float q = r / arr.Max();
float ang = Mathf.PI * 2 / num;
//圆心
vh.AddVert(Vector3.zero, color, new Vector2(0.5f, 0.5f));
for (int i = 0; i < num; i++)
{
float x = Mathf.Sin(i * ang) * arr[i] * q;
float y = Mathf.Cos(i * ang) * arr[i] * q;
float uvx = (x + r) / (r + r);
float uvy = (y + r) / (r + r);
vh.AddVert(new Vector3(x, y, 0),Color.red, new Vector2(uvx, uvy));
if (i == 0)
{
vh.AddTriangle(0, num, 1);
}
else
{
vh.AddTriangle(0, i, i + 1);
}
}
}
}
}
3,轮转图
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;
public class RotationChart : MonoBehaviour
{
public int num;
public float spacing;//间距
public float r;
public float c;
public float ang;
public float moveAng = 0;//拖动距离
List<GameObject> playerList = new List<GameObject>();
List<Transform> sortList = new List<Transform>();
public AnalyticData data;
public RadarMap3 radarMap;
// Start is called before the first frame update
void Start()
{
//计算周长=(人的宽+间距)*个数
c = (1 + spacing) * num;
//计算半径 =周长/圆的弧度弧度
r = c / (2 * Mathf.PI);
//计算每个角的弧度
ang = 2 * Mathf.PI / num;
for (int i = 0; i < num; i++)
{
playerList.Add(Instantiate(Resources.Load<GameObject>("player/player_" + i), transform));
float x = Mathf.Sin(i * ang) * r;
float z = Mathf.Cos(i * ang) * r;
playerList[i].transform.localPosition = new Vector3(x, 0, z);
playerList[i].AddComponent<PlayerMove>();
sortList.Add(playerList[i].transform);
}
}
public void Move(float dis)
{
//计算移动弧度=距离/半径
moveAng += dis/r;
//重新计算位置
for (int i = 0; i < playerList.Count; i++)
{
//算出X和Z的值
float x = Mathf.Sin(i * ang + moveAng) * r;
float z = Mathf.Cos(i * ang + moveAng) * r;
playerList[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()
{
//-1 在前 0不动 1在后
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;
}
});
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)=> {
for (int i = 0; i < playerList.Count; i++)
{
float x = Mathf.Sin(i * ang + a) * r;
float z = Mathf.Cos(i * ang + a) * r;
playerList[i].transform.localPosition = new Vector3(x,0,z);
}
},moveAng,moveAng-AlignAng,time).OnComplete(()=> {
int num = playerList.IndexOf(sortList[0].gameObject);
//赋战斗值
radarMap.arr[0] = float.Parse(data.datas[num].attack);
radarMap.arr[1] = float.Parse(data.datas[num].defense);
radarMap.arr[2] = float.Parse(data.datas[num].speed);
radarMap.arr[3] = float.Parse(data.datas[num].hp);
radarMap.arr[4] = float.Parse(data.datas[num].mp);
radarMap.texts[0].text = "姓名:"+ data.datas[num].name;
radarMap.texts[1].text = "攻击\n"+data.datas[num].attack;
radarMap.texts[2].text = "防御\n"+data.datas[num].defense;
radarMap.texts[3].text = "速度\n"+data.datas[num].speed;
radarMap.texts[4].text = "血量\n"+data.datas[num].hp;
radarMap.texts[5].text = "魔法\n"+data.datas[num].mp;
radarMap.SetAllDirty();//脏函数
});
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!