3D轮转图选角色+2D雷达图

该代码示例展示了在Unity3D环境中如何解析CSV文件获取人物属性,并用3D轮转图和雷达图进行可视化展示。通过CSV解析获取玩家的数据,然后利用这些数据生成雷达图表示人物属性,同时实现3D轮转图动态展示玩家排列。
摘要由CSDN通过智能技术生成

 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();//脏函数
});

}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值