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个点已经很圆滑了。这里要说明一下,点数越多,计算量也就越大,所以合适就行了。

好了,就到这里吧。记念一下我的第一篇笔记!!!!!!!

利用LineRenderer画出一个圆,类似于lol中的攻击范围的更多相关文章

  1. 公告栏添加时钟——利用canvas画出一个时钟

    前言 最近在学习HTML5标签,学到Canvas,觉得很有趣.便在慕课网找了个demo练手.就是Canvas时钟. 对于canvas,w3shcool上是这么描述的: HTML5 <canvas ...

  2. 如何在canvas中画出一个太极图

    先放一个效果图: 代码如下 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /&g ...

  3. 用HTML+CSS画出一个同心圆

    参加web前端校招的同学们经常会遇到这样的面试题:用HTML+CSS画出一个同心圆. 例如: 这道题主要考验的是基础盒模型布局能力和倒圆角属性的巧用. 1.html代码 <body> &l ...

  4. 利用python画出动态高优先权优先调度

    之前写过一个文章. 利用python画出SJF调度图 动态高度优先权优先调度 动态优先权调度算法,以就绪队列中各个进程的优先权作为进程调度的依据.各个进程的优先权在创建进程时所赋予,随着进程的推进或其 ...

  5. WPF Blend 脑洞大开的问题:如何用Blend得到或画出一个凹槽、曲面。

    原文:WPF Blend 脑洞大开的问题:如何用Blend得到或画出一个凹槽.曲面. 目标图: 步骤一(放置一个矩形,填充蓝色): 步骤二(复制该矩形,并调整边角,填充粉红色): 第三部:让图形部分重 ...

  6. 使用CSS3画出一个叮当猫

    刚学习了这个案例,然后觉得比较好玩,就练习了一下.然后发现其实也不难,如果你经常使用PS或者Flash的话,应该就会知道画个叮当猫是很容易的事,至少我是这么觉得.但是,用CSS3画出来确实是第一次接触 ...

  7. 利用ggplot2画出各种漂亮图片详细教程

    1.Why use ggplot2 ggplot2是我见过最human friendly的画图软件,这得益于Leland Wilkinson在他的著作<The Grammar of Graphi ...

  8. 利用Graphviz画出图

    graphviz官网:http://www.graphviz.org/ 背景:有画图需要,之前见到别人用graphviz画,画出来的图漂亮,且自动帮你排版安排布局,所以自己想尝试用它画. 其中遇到的几 ...

  9. 利用css来让一个div在页面中垂直居中的方法

    一.如何让一个div在页面中垂直居中(请至少列出三种) 1.距离页面窗口左边框和上边框的距离设置为50%,这个50%就是指页面窗口的宽度和高度的50%,最后将该DIV分别左移和上移,左移和上移的大小就 ...

随机推荐

  1. Javascript基础系列之(三)数据类型 (数值 Number)

    javascript中想限定一个数的数值,无需限定它是整数还是浮点数型 var num1 = 80 ; var num2 = 55.51; var num3 = -34; var num4 = 9e5 ...

  2. Javascript基础系列之(七)函数(argument访问函数参数)

    argument是javascript中函数的一个特殊参数,例如下文,利用argument访问函数参数,判断函数是否执行 <script type="text/javascript&q ...

  3. 第五章:Javascript语句

    在javascript中,表达式是短语,那么语句(statement)就是整句或命令.正如英文语句以句号结尾,javascript以分号结尾. 表达式计算出一个值,但语句使某件事发生. “使某件事发生 ...

  4. Moqui学习Day3

    添加一个新建表单 添加一个按钮来弹出新建表单,并创建一个转换来处理输入数据操作. 在FindTutorial.xml文件中添加一个转换. <!--新增 列表 --> <transit ...

  5. Apache CXFjar包目录(转)

    文件目录结构及相关文件的详细说明:|-bin|-docs|-etc|-lib|-licenses|-modules|-samples bin(目录) bin 目录中是 CXF 框架中所提供的代码生成. ...

  6. onclik的使用.

    //好笨啊,这个居然忘记了,在行间家onclick事件要加();,addEventListener只要使用函数名字就好了 <!doctype html> <html> < ...

  7. SP*

    1.PS1——默认提示符 root@tcx2250-14:/etc# echo $PS1\u@\h:\w\$ \u是用户名 \h是主机名 \w是当前目录的完整路径.请注意当你在主目录下的时候,如上面所 ...

  8. [IOS UIalert模版]

    1.alertview创建 UIAlertView *alert; alert = [[UIAlertView alloc] initWithTitle:@"提示" message ...

  9. groovy-脚本和类

    在groovy中定义类和java中是一样的.类的方法可以是static,也可以是非static的. groovy中的方法可以是public, protected, private,同时也支持java中 ...

  10. SPOJ Play on Words

    传送门 WORDS1 - Play on Words #graph-theory #euler-circuit Some of the secret doors contain a very inte ...