zoukankan      html  css  js  c++  java
  • 利用LineRenderer画出一个圆,类似于lol中的攻击范围

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

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

  • 相关阅读:
    overflow 溢出
    float1
    AI赋能测试_API测试
    AI赋能测试_APP测试智能化
    最最最基础题应知应会题目_1_排序_下载图片
    AI赋能测试_遗传算法应用
    PAI使用方法
    nlu模型测试集构建语料多样性
    机器学习基础功能练习II
    python机器学习数据绘图总结
  • 原文地址:https://www.cnblogs.com/123ing/p/4056098.html
Copyright © 2011-2022 走看看