利用LineRenderer画出一个圆,类似于lol中的攻击范围
http://www.unity蛮牛.com/blog-5945-1409.html

[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中的攻击范围的更多相关文章
- 公告栏添加时钟——利用canvas画出一个时钟
前言 最近在学习HTML5标签,学到Canvas,觉得很有趣.便在慕课网找了个demo练手.就是Canvas时钟. 对于canvas,w3shcool上是这么描述的: HTML5 <canvas ...
- 如何在canvas中画出一个太极图
先放一个效果图: 代码如下 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /&g ...
- 用HTML+CSS画出一个同心圆
参加web前端校招的同学们经常会遇到这样的面试题:用HTML+CSS画出一个同心圆. 例如: 这道题主要考验的是基础盒模型布局能力和倒圆角属性的巧用. 1.html代码 <body> &l ...
- 利用python画出动态高优先权优先调度
之前写过一个文章. 利用python画出SJF调度图 动态高度优先权优先调度 动态优先权调度算法,以就绪队列中各个进程的优先权作为进程调度的依据.各个进程的优先权在创建进程时所赋予,随着进程的推进或其 ...
- WPF Blend 脑洞大开的问题:如何用Blend得到或画出一个凹槽、曲面。
原文:WPF Blend 脑洞大开的问题:如何用Blend得到或画出一个凹槽.曲面. 目标图: 步骤一(放置一个矩形,填充蓝色): 步骤二(复制该矩形,并调整边角,填充粉红色): 第三部:让图形部分重 ...
- 使用CSS3画出一个叮当猫
刚学习了这个案例,然后觉得比较好玩,就练习了一下.然后发现其实也不难,如果你经常使用PS或者Flash的话,应该就会知道画个叮当猫是很容易的事,至少我是这么觉得.但是,用CSS3画出来确实是第一次接触 ...
- 利用ggplot2画出各种漂亮图片详细教程
1.Why use ggplot2 ggplot2是我见过最human friendly的画图软件,这得益于Leland Wilkinson在他的著作<The Grammar of Graphi ...
- 利用Graphviz画出图
graphviz官网:http://www.graphviz.org/ 背景:有画图需要,之前见到别人用graphviz画,画出来的图漂亮,且自动帮你排版安排布局,所以自己想尝试用它画. 其中遇到的几 ...
- 利用css来让一个div在页面中垂直居中的方法
一.如何让一个div在页面中垂直居中(请至少列出三种) 1.距离页面窗口左边框和上边框的距离设置为50%,这个50%就是指页面窗口的宽度和高度的50%,最后将该DIV分别左移和上移,左移和上移的大小就 ...
随机推荐
- 喝咖啡写脚本,顺便再加一点点CSS语法糖 2.五分钟学会Less
CoffeeScript + Html5 + Less这个新组合,看上去Less更容易拿下,先尝尝糖吧. Less这么小个东西,竟然要FQ,真是没有天理,简直不可理喻,先不管那么多了,那就看这个吧.h ...
- node的实践(项目一)
学习一门语言,我们先要学习他的基本的语法,基本的数据类型,基本的数组操作,字符串的操作,然后就是语言的特性,实现共享和降低耦合的方式,然后开始比较高级的学习(所有语言都是一样的),比如说通信方法,tc ...
- SequoiaDB 系列源码分析调整
犹豫我经验尚不够丰富,有大牛跟我说,以我这样定下的结构来分析源码,学习效果不太好. 应该先从程序的进程入口函数开始,慢慢的跟流程来分析.先通过系统的启动.退出来分析所用到的技术,像进程模型,线程模型等 ...
- Bootstrap3.0学习第九轮(CSS补充)
详情请查看http://aehyok.com/Blog/Detail/15.html 个人网站地址:aehyok.com QQ 技术群号:206058845,验证码为:aehyok 本文文章链接:ht ...
- 国内公共DNS
DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串.通过主机名,最终 ...
- git使用问题汇总
2015.11.29 一.git clone 出现如下问题: 解决方案:添加一个ssh keys.步骤如下: 1.生成一个ssh-key(图片来自网络) 2.找到“Your identificatio ...
- java多线程-Condition
Condition 将 Object 监视器方法(wait.notify 和 notifyAll)分解成截然不同的对象,以便通过将这些对象与任意 Lock 实现组合使用,为每个对象提供多个等待 set ...
- 【Gym 100712A】Who Is The Winner?
题 题意 解题数目越多越排前,解题数目相同罚时越少越排前,求排第一的队伍名字. 分析 用结构体排序. 代码 #include<cstdio> #include<algorithm&g ...
- org.springframework.beans.factory.annotation.Autowired(required=true)
Injection of autowired dependencies failed ERROR org.springframework.web.context.ContextLoader - Co ...
- 【poj1144】 Network
http://poj.org/problem?id=1144 (题目链接) 题意 求无向图的割点. Solution Tarjan求割点裸题.并不知道这道题的输入是什么意思,也不知道有什么意义= =, ...