2025-05-09 10:20:30 +08:00

176 lines
4.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* ==============================================================================
* escripSimpleSpider
* Create by DFYStudio
* ==============================================================================*/
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
public class Spider : MonoBehaviour
{
#region How To Use
public GameObject linePrefab;
public GameObject Point;
public float radius=173; // the radius of you spiderMap, Change it to match your background spider map
public float[] testArray = new float[] { };
float[] testArray1 = { 0.5f, 0.7f, 0.5f, 0.5f, 0.5f, 0.7f, 0.5f, 0.5f , 0.5f, 0.7f, 0.5f, 0.5f };
public void GenerateSpider(params float[] values0To1) //Provide a capability array to create a spider diagram. Each value in the array ranges from 0 to 1. The lenght of the array == the count of attributes
{
ClearAll();
CreatePointsLines(values0To1.Length);
SetDataToSpider(values0To1);
InitPointAndLine();
if(FillPolyGon)
{
myUIShape.UpdateShape(allPoint);
}
}
public bool FillPolyGon = true;
public MyUIShape myUIShape;
public List<Transform> allPoint = new List<Transform>();
GameObject theRoot;
List<GameObject> allRoot = new List<GameObject>();
private void Start()
{
GenerateSpider(testArray);
}
private void Update()
{
//Test delete
//if (Input.GetKeyDown(KeyCode.A)) // It is very easy to update the spider diagram. delete it ,instead with code to call GenerateSpider if you have multiply spider diagram
//{
// GenerateSpider(testArray1);
//}
if(FillPolyGon)
{
myUIShape.gameObject.SetActive(true);
}
else
{
myUIShape.gameObject.SetActive(false);
}
myUIShape.UpdateShape(allPoint);
UpdateLineChart();
}
#endregion
/// <summary>
///
/// </summary>
/// <param name="attributes"> how many attributes, So 360 / attributes get degree;</param>
void CreatePointsLines(int attributes)
{
theRoot = new GameObject("Root");
theRoot.transform.SetParent(transform);
theRoot.transform.localPosition = Vector3.zero;
theRoot.transform.localEulerAngles = Vector3.zero;
for (int i = 0; i < attributes; i++)
{
GameObject o = Instantiate(theRoot, transform);
o.transform.localPosition = Vector3.zero;
theRoot.transform.localEulerAngles += new Vector3(0, 0, 360f / attributes);
allRoot.Add(o);
}
for (int i = 0; i < allRoot.Count; i++)
{
allPoint.Add(Instantiate(Point, allRoot[i].transform).GetComponent<RectTransform>());
}
}
void SetDataToSpider(params float[] values0To1)
{
for (int i = 0; i < allPoint.Count; i++)
{
allPoint[i].localPosition = values0To1[i] * new Vector3(radius, 0,0);
}
}
void InitPointAndLine()
{
for (int a = 0; a < allPoint.Count; a++)
{
if (a < allPoint.Count)
{
GameObject line = GameObject.Instantiate<GameObject>(linePrefab);
line.transform.SetParent(allPoint[a]);
line.transform.localPosition = Vector3.zero;
}
}
}
void ClearAll()
{
if(theRoot!=null)
Destroy(theRoot);
foreach (var item in allPoint)
{
Destroy(item.gameObject);
}
foreach (var item in allRoot)
{
Destroy(item.gameObject);
}
allPoint.Clear();
allRoot.Clear();
}
public void UpdateLineChart()
{
for (int a = 0; a < allPoint.Count-1; a++)
{
if (allPoint[a + 1] != null)
{
Vector3 v = (allPoint[a + 1].position - allPoint[a].position);
allPoint[a].GetChild(0).GetComponent<RectTransform>().sizeDelta = new Vector2(v.magnitude, 50);
allPoint[a].GetChild(0).right = v;
}
}
if(allPoint.Count>=2)
{
Vector3 v1 = (allPoint[0].position - allPoint[allPoint.Count - 1].position);
allPoint[allPoint.Count - 1].GetChild(0).GetComponent<RectTransform>().sizeDelta = new Vector2(v1.magnitude, 50);
allPoint[allPoint.Count - 1].GetChild(0).right = v1;
}
}
}