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. ASP.NET MVC Controller Session问题

    发现问题 最近在项目中遇到这样一个问题,一直没办法重现,所以几天都没有解决. 测试那边给出的问题是这样的:每天早上来的时候,第一次通过单点登录到系统的时候,总会跳转回登录界面,再次登录就好了.当时给我 ...

  2. LinuxMint下Docker的安装部署和验证

    通过lsb_release命令查看以下我的LinuxMint发行版, 查看以下我的Linux内核版本, Docker要求Linux内核版本必须在要在3.10以上,显然我们的系统是满足的. 1. Doc ...

  3. 字符串string类型转换成DateTime或DateTime?类型

    常用的Convert.ToDateTime方法 //将含有正确日期格式的string类型转换成DateTime类型 string strDate = "2014-08-01"; D ...

  4. 求根号m(巴比伦算法)

    巴比伦算法是针对求根号m的近似值情况的,它的思想是这样的: 设根号m=X0,则如果枚举有答案X(X<X0),则m/X>X0,当精度要求不高的时候,我们可以看成X=m/X=X0,而如果精度要 ...

  5. 项目笔记---Windows Service调用Windows API问题

    概要 此文来自于最近一个“诡异”的Windows API调用发现Windows Service在调用某些Windows API的过程中失效,在经过漫长的Baidu,之后终于在StackOverFlow ...

  6. jQuery基础之(三)jQuery功能函数前缀及与window.onload冲突

    1.jQuery功能函数前缀 在javascript中,开发者通常会编写一些小函数来处理各种操作细节,例如在用户提交表单时,要将文本框最前端和最末端的空格内容清理掉.而javascript中没有类似t ...

  7. C基础之递归(思想很重要,学会找规律)

    递归思想的条件:1.函数自己调用自己 2.函数必须有一个固定的返回值(如果没有这个条件会发生死循环) ----规律很重要 简单递归题目一: 设计一个函数计算一个整数的n次方,比如2的3次方,就是8 步 ...

  8. .net 使用PowerShell获取电脑中的UUID

    UUID含义是通用唯一识别码 (Universally Unique Identifier),这 是一个软件建构的标准,也是被开源软件基金会 (Open Software Foundation, OS ...

  9. 处理Json数据中的日期类型.如/Date(1415169703000)/格式

    在asp.net mvc后台返回到视图中的json数据中想对数据进行操作,发现日期类型无法直接进行操作,需要转换为指定格式才行.在网上也搜了下方法也很多,觉得有点麻烦,最终使用正则搞定了,分享下: v ...

  10. 用word写博客

    都知道word的编辑功能强大,那如何用word写博客呢? 以博客园为例 1.写好word文档后,文件->共享->发送至博客,或者新建博客模板 2. 再博客的界面点击管理账户,新建账户,如果 ...