博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
利用LineRenderer画出一个圆,类似于lol中的攻击范围
阅读量:5328 次
发布时间:2019-06-14

本文共 3094 字,大约阅读时间需要 10 分钟。

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
points=new List
(); //用于保存点 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
然后我们看到的效果是这样的:

现在我们已经得到圆上的点了,接下来画圆就很简单了。

我利用的是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
points=new List
(); private LineRenderer renderer; public bool rendering = false; //用于标识是否显示 // Use this for initialization void Start () { angle = 360f / pointCount; renderer = GetComponent
(); 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
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个点已经很圆滑了。这里要说明一下,点数越多,计算量也就越大,所以合适就行了。

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

 

转载于:https://www.cnblogs.com/123ing/p/4056098.html

你可能感兴趣的文章
windows编程ASCII问题
查看>>
.net webService代理类
查看>>
Code Snippet
查看>>
Node.js Express项目搭建
查看>>
zoj 1232 Adventure of Super Mario
查看>>
1201 网页基础--JavaScript(DOM)
查看>>
组合数学 UVa 11538 Chess Queen
查看>>
oracle job
查看>>
Redis常用命令
查看>>
XML学习笔记(二)-- DTD格式规范
查看>>
IOS开发学习笔记026-UITableView的使用
查看>>
[转载]电脑小绝技
查看>>
windos系统定时执行批处理文件(bat文件)
查看>>
thinkphp如何实现伪静态
查看>>
BZOJ 2243: [SDOI2011]染色( 树链剖分 )
查看>>
BZOJ 1925: [Sdoi2010]地精部落( dp )
查看>>
c++中的string常用函数用法总结!
查看>>
界面交互之支付宝生活圈pk微信朋友圈
查看>>
[DLX精确覆盖+打表] hdu 2518 Dominoes
查看>>
SuperMap iServerJava 6R扩展领域开发及压力测试---判断点在那个面内(1)
查看>>