Unity中LineRenderer相关知识点

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Lesson21 : MonoBehaviour
{
    private Material m;

    // Start is called before the first frame update
    void Start()
    {
        #region 知识点一 LineRenderer是什么
        //LineRenderer是Unity提供的一个用于画线的组件
        //使用它我们可以在场景中绘制线段
        //一般可以用于
        //1绘制攻击范围
        //2武器红外线
        //3辅助功能
        //4其它画线功能
        #endregion

        #region 知识点二 LineRender参数相关

        #endregion

        #region 知识点三 LineRender代码相关
        //动态添加一个线段
        GameObject line = new GameObject();
        line.name = "Line";
        LineRenderer lineRenderer = line.AddComponent<LineRenderer>();

        //首尾相连
        lineRenderer.loop = true;

        //开始结束宽
        lineRenderer.startWidth = 0.02f;
        lineRenderer.endWidth = 0.02f;

        //开始结束颜色
        lineRenderer.startColor = Color.white;
        lineRenderer.endColor = Color.red;

        //设置材质
        m = Resources.Load<Material>("M");
        lineRenderer.material = m;

        //设置点
        //一定注意 设置点 要 先设置点的个数
        lineRenderer.positionCount = 4;
        //接着就设置 对应每个点的位置
        lineRenderer.SetPositions(new Vector3[] { new Vector3(0,0,0),
                                                  new Vector3(0,0,5),
                                                  new Vector3(5,0,5)});
        lineRenderer.SetPosition(3, new Vector3(5, 0, 0));

        //是否使用世界坐标系
        //决定了 是否随对象移动而移动
        lineRenderer.useWorldSpace = false;

        //让线段受光影响 会接受光数据 进行着色器计算
        lineRenderer.generateLightingData = true;

        #endregion
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

练习题一 请写一个方法,传入一个中心点,传入一个半径,用LineRender画一个圆出来

练习题二 在Game窗口长按鼠标用LineRenderer画出鼠标移动的轨迹

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Lesson21_Exercises : MonoBehaviour
{
    private LineRenderer line2;
    // Start is called before the first frame update
    void Start()
    {
        #region 练习题一 请写一个方法,传入一个中心点,传入一个半径,用LineRender画一个圆出来
        DrawLineRenderer(Vector3.zero, 5, 360);
        #endregion

        #region 练习题二 在Game窗口长按鼠标用LineRenderer画出鼠标移动的轨迹
        //line2 = this.gameObject.AddComponent<LineRenderer>();
        //line2.loop = false;
        //line2.startWidth = 0.5f;
        //line2.endWidth = 0.5f;

        //line2.positionCount = 0;
        #endregion
    }

    private Vector3 nowPos;
    private void Update()
    {
        if( Input.GetMouseButtonDown(0) )
        {
            GameObject obj = new GameObject();
            line2 = obj.AddComponent<LineRenderer>();
            line2.loop = false;
            line2.startWidth = 0.5f;
            line2.endWidth = 0.5f;

            line2.positionCount = 0;
        }

        if( Input.GetMouseButton(0) )
        {
            line2.positionCount += 1;
            //如何得到鼠标转世界坐标的 对应点 
            //知识点
            //1.如何得到鼠标位置
            //Input.mousePosition
            //2.怎么把鼠标 转世界坐标
            //Camera.main.ScreenToWorldPoint(Input.mousePosition);

            nowPos = Input.mousePosition;
            nowPos.z = 10;
            line2.SetPosition(line2.positionCount - 1, Camera.main.ScreenToWorldPoint(nowPos));
        }
    }

    public void DrawLineRenderer(Vector3 centerPos, float r, int pointNum)
    {
        //动态创建 画线对象
        GameObject obj = new GameObject();
        obj.name = "R";
        LineRenderer line = obj.AddComponent<LineRenderer>();
        line.loop = false;
        //设置有多少个点
        line.positionCount = pointNum;
        //让其首尾相连
        line.loop = true;

        //得到每个点之间 间隔的度数
        float angle = 360f / pointNum;

        //准备得到每一个点
        for (int i = 0; i < pointNum; i++)
        {
            //知识点
            //1.点加向量 相当于平移点
            //2.四元数 * 向量 相当于在 旋转向量
            line.SetPosition(i, centerPos + Quaternion.AngleAxis(angle * i, Vector3.up) * Vector3.forward * r);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_32175379/article/details/121068302