需求是这个图形跟随角色, 在角色背后, 并且每个角色的扇形角度可能不同。
So, NGUI和UGUI很好用的FilledType是用不了了..
去网上搜了下Unity绘制扇形
找到这么篇文章http://blog.csdn.net/awnuxcvbn/article/details/44039819
很好, 前人已经造好了轮子, 我拿来用就好
结果:
网格的扇形是有了, 但是游戏里的显示是什么鬼!所以说人是不能偷懒的, 还是老老实实的看看前人的轮子是怎么造的吧.
既然看了, 就为自己的需求做了些改造, 加了起始角度, 并把源代码画在x,z轴平面的扇形改到了x,y轴平面
还是上代码:
using UnityEngine;
using System.Collections;
[RequireComponent(typeof(MeshRenderer), typeof(MeshFilter))]
public class SectorProgressBar : MonoBehaviour
{
public float radius = 2;
public float startAngleDegree = 0;
public float angleDegree = 100;
public int segments = 10;
public int angleDegreePrecision = 1000;
public int radiusPrecision = 1000;
private MeshFilter meshFilter;
private SectorMeshCreator creator = new SectorMeshCreator();
[ExecuteInEditMode]
private void Awake()
{
meshFilter = GetComponent();
}
private void Update()
{
meshFilter.mesh = creator.CreateMesh(radius, startAngleDegree, angleDegree, segments, angleDegreePrecision, radiusPrecision);
}
//在Scene界面画辅助线
void OnDrawGizmos()
{
Gizmos.color = Color.gray;
DrawMesh();
}
//在Scene界面画辅助线
void OnDrawGizmosSelected()
{
Gizmos.color = Color.green;
DrawMesh();
}
private void DrawMesh()
{
Mesh mesh = creator.CreateMesh(radius, startAngleDegree, angleDegree, segments, angleDegreePrecision, radiusPrecision);
int[] tris = mesh.triangles;
for (int i = 0; i < tris.Length; i += 3)
{
Gizmos.DrawLine(convert2World(mesh.vertices[tris[i]]), convert2World(mesh.vertices[tris[i + 1]]));
Gizmos.DrawLine(convert2World(mesh.vertices[tris[i]]), convert2World(mesh.vertices[tris[i + 2]]));
Gizmos.DrawLine(convert2World(mesh.vertices[tris[i + 1]]), convert2World(mesh.vertices[tris[i + 2]]));
}
}
private Vector3 convert2World(Vector3 src)
{
return transform.TransformPoint(src);
}
private class SectorMeshCreator
{
private float radius;
private float startAngleDegree;
private float angleDegree;
private int segments;
private Mesh cacheMesh;
///
/// 创建一个扇形Mesh
///
/// 扇形半径
/// 扇形开始角度
/// 扇形角度
/// 扇形弧线分段数
/// 扇形角度精度(在满足精度范围内,认为是同个角度)
///
///
/// 扇形半价精度(在满足半价精度范围内,被认为是同个半价)。
/// 比如:半价精度为1000,则:1.001和1.002不被认为是同个半径。因为放大1000倍之后不相等。
/// 如果半价精度设置为100,则1.001和1.002可认为是相等的。
///
///
/// 基本功能实现了~
其实还有个问题, 半径(radius)比较大的情况, 会发现图片失真.
这种图其实是可以做到不失真的, 因为, 内部是纯透明的, 只有外围一圈有颜色, 所以如果只缩放内部半段, 保持外部半段的半径, 就可以实现.
示意图:
不过这次的需求并不需要放大图片, 以后需要的时候再实现吧~
=========================
这篇文章出来后,和同事讨论以后,对扇形绘制又做了优化:[Unity]利用Mesh在Unity中绘制扇形图片2