UGUI 동적 곡선 그리 기
머리말
시간 이 있 으 면 상세 한 설명 을 보충 하고 코드 를 먼저 올 립 니 다.스스로 읽다.
코드
UICurvedata 클래스,데 이 터 를 저장 하 는 기본 구조 입 니 다.
public class UICurveData
{
#region [Fields]
public List<Vector2> Postion = new List<Vector2>();
public Color Ccolor;
public float Thickness = 1;
#endregion
#region [PublicTools]
public void Addpos(float varX, float varY)
{
Addpos(new Vector2(varX, varY));
}
public void Addpos(Vector2 varV2)
{
Postion.Add(varV2);
}
#endregion
}
UICurve 는 정점 데이터,mesh 를 구축 하 는 것 을 책임 집 니 다.
public class UICurve : MaskableGraphic
{
#region [Fields]
private Dictionary<int, UICurveData> mCurveData = new Dictionary<int, UICurveData>();
#endregion
#region [Inherit]
protected override void OnPopulateMesh(VertexHelper varVerHeler)
{
varVerHeler.Clear();
foreach (var tempKvp in mCurveData)
{
var tempUICurveData = tempKvp.Value;
if (tempUICurveData.Postion.Count < 2)
{
continue;
}
for (int i = 1; i < tempUICurveData.Postion.Count; i++)
{
UIVertex[] verts = new UIVertex[4];
float x1 = tempUICurveData.Postion[i - 1].x;
float y1 = tempUICurveData.Postion[i - 1].y;
float x2 = tempUICurveData.Postion[i].x;
float y2 = tempUICurveData.Postion[i].y;
float xd = (y2 - y1) / Mathf.Sqrt(Mathf.Pow(x2 - x1, 2) * Mathf.Pow(y2 - y1, 2)) * tempKvp.Value.Thickness / 2;
float yd = (x2 - x1) / Mathf.Sqrt(Mathf.Pow(x2 - x1, 2) * Mathf.Pow(y2 - y1, 2)) * tempKvp.Value.Thickness / 2;
int idx = 0;
verts[idx].position = new Vector3(tempUICurveData.Postion[i - 1].x - xd, tempUICurveData.Postion[i - 1].y + yd);
verts[idx].color = tempUICurveData.Ccolor;
verts[idx].uv0 = Vector2.zero;
idx++;
verts[idx].position = new Vector3(tempUICurveData.Postion[i].x - xd, tempUICurveData.Postion[i].y + yd);
verts[idx].color = tempUICurveData.Ccolor;
verts[idx].uv0 = Vector2.zero;
idx++;
verts[idx].position = new Vector3(tempUICurveData.Postion[i].x + xd, tempUICurveData.Postion[i].y - yd);
verts[idx].color = tempUICurveData.Ccolor;
verts[idx].uv0 = Vector2.zero;
idx++;
verts[idx].position = new Vector3(tempUICurveData.Postion[i - 1].x + xd, tempUICurveData.Postion[i - 1].y - yd);
verts[idx].color = tempUICurveData.Ccolor;
verts[idx].uv0 = Vector2.zero;
varVerHeler.AddUIVertexQuad(verts);
}
}
}
#endregion
#region [PublicTools]
public void AddCurveData(int varID, UICurveData varCurveData)
{
mCurveData.Add(varID, varCurveData);
SetAllDirty();
}
public void Clear()
{
mCurveData.Clear();
SetAllDirty();
}
public void RemovePointIDs(params int[] varRemovepoints)
{
List<int> tempL = new List<int>();
tempL.AddRange(varRemovepoints);
RemovePointIDs(tempL);
}
public void RemovePointIDs(List<int> varRemovePoints)
{
foreach (var i in varRemovePoints)
{
if (!mCurveData.ContainsKey(i)) continue;
mCurveData.Remove(i);
}
SetAllDirty();
}
#endregion
}
테스트 사용
public class TestCurve : MonoBehaviour
{
void Start()
{
var tempCurve = this.gameObject.AddComponent<UICurve>();
UICurveData tempcd = new UICurveData();
tempcd.Ccolor = Color.yellow;
tempcd.Thickness = 2;
for (int i = 0; i < 360; i++)
{
tempcd.Addpos(i * 2,(float)Mathf.Cos(i));
}
tempCurve.AddCurveData(1,tempcd);
}
}
이 스 크 립 트 를 Canvas 에 걸 면 실행 중 에 볼 수 있 습 니 다.이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Unity3D UGUI 코드에 클릭 이벤트 추가그 중에서 stateText는 Text이고 Image 등 UGUI의 구성 요소일 수도 있습니다. onTextClick 메소드의 콜백...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.