http://www.unity蛮牛.com/blog-5945-1409.html
本人大四狗,学unity半年有余,写此文章纯粹记录自己的心得。
废话不多说,进入主题。。。。
效果如图:
首先要理解圆是怎么画来的:无数个点连成闭合的线,点数越多,圆就越平滑。
然后我们怎么得到这些点呢?
得有个圆心,以圆心为始点画出一条半径长度的直线,直线的终点就是我们所求的圆的点。
那么现在就以我们的主角为圆心,即transform,以radius=10的半径画一条指向transform.forword的直线,求直线的终点坐标。
[code]csharpcode:
float radius= 10f;
Vector3 forwordEndPoint = transform.position + transform.forward * radius;
Debug.DrawLine(transform.position, forwordEndPoint, Color.green);
forwordEndPoint就是直线的终点坐标。
现在我们得到以transform.position为圆心,半径的radius的圆的一个点,其他点怎么得来呢?
现在我们取上的10个点,即将圆平均划分的10等分,也就是将360度平均分为10等分,即36度。
以transform.forword为起始线,每隔36度画一条线,并求出直线的终点。
[code]csharpcode:
using UnityEngine;
using System.Collections.Generic;
using System.Collections; public class TrollDrawLine : MonoBehaviour {
public int pointCount = 10; //取圆上的点数
public float radius = 10f; //圆的半径
private float angle; //平均划分的角度
private List<Vector3> points=new List<Vector3>(); //用于保存点
void Start () {
angle = 360f / pointCount; ///求出划分的角度
}
void CalculationPoints()
{
Vector3 v=transform.position+transform.forward*radius; //这里先求出transform.forword直线的终点
points.Add(v);
Quaternion r = transform.rotation;
for(int i=1;i<pointCount;i++) //循环求出各个点
{
Quaternion q = Quaternion.Euler(r.eulerAngles.x, r.eulerAngles.y - (angle * i), r.eulerAngles.z); ///求出第i个点的旋转角度
v = transform.position + (q * Vector3.forward) * radius;///该点的坐标
points.Add(v);
}
}
void DrowPoints()
{
for(int i=0;i<points.Count;i++)
{
Debug.DrawLine(transform.position, points[i], Color.green);
}
}
void ClearPoints()
{
points.Clear();
}
void Update () { CalculationPoints();
DrowPoints();
ClearPoints();
}
}
然后我们看到的效果是这样的:
现在我们已经得到圆上的点了,接下来画圆就很简单了。
我利用的是LineRenderer来渲染,当然也可以用Debug.DrawLine把第四个点首尾连接起来,这里就不多说了。
首先给主角添加LineRenderer组件
设置材质,positions为0,使用世界坐标,其他自己设置。
最终代码:
[code]csharpcode:
using UnityEngine;
using System.Collections.Generic;
using System.Collections; public class TrollDrawLine : MonoBehaviour { public int pointCount = 10;
public float radius = 10f;
private float angle;
private List<Vector3> points=new List<Vector3>();
private LineRenderer renderer;
public bool rendering = false; //用于标识是否显示
// Use this for initialization
void Start () {
angle = 360f / pointCount;
renderer = GetComponent<LineRenderer>();
if(!renderer)
{
Debug.LogError("LineRender is NULL!");
}
} void CalculationPoints()
{
Vector3 v=transform.position+transform.forward*radius;
points.Add(v);
Quaternion r = transform.rotation;
for(int i=1;i<pointCount;i++)
{
Quaternion q = Quaternion.Euler(r.eulerAngles.x, r.eulerAngles.y - (angle * i), r.eulerAngles.z);
v = transform.position + (q * Vector3.forward) * radius;
points.Add(v);
}
}
void DrowPoints()
{
for(int i=0;i<points.Count;i++)
{
// Debug.DrawLine(transform.position, points[i], Color.green);
renderer.SetPosition(i, points[i]); //把所有点添加到positions里
}
if (points.Count > 0) //这里要说明一下,因为圆是闭合的曲线,最后的终点也就是起点,
renderer.SetPosition(pointCount, points[0]);
}
void ClearPoints()
{
points.Clear(); ///清除所有点
}
// Update is called once per frame
void Update () {
if (Input.GetKeyDown(KeyCode.D)) //按下D键显示
{
rendering = true; }
if(Input.GetKeyUp(KeyCode.D)) //放开D键不显示
{
rendering = false; }
if(rendering)
{
renderer.SetVertexCount(pointCount + 1); ///这里是设置圆的点数,加1是因为加了一个终点(起点)
CalculationPoints();
DrowPoints();
}
else
{
renderer.SetVertexCount(0);//不显示时设置圆的点数为0
}
ClearPoints();
}
}
这里是取10个点的效果
取50个点的效果
200个点的效果
其实50个点已经很圆滑了。这里要说明一下,点数越多,计算量也就越大,所以合适就行了。
好了,就到这里吧。记念一下我的第一篇笔记!!!!!!!