UnityVR--组件3--Line Renderer--线性渲染

2023-11-20

目录

线性渲染组件简介

绘制线条Line Renderer组件介绍

绘制拖尾Trail Renderer组件介绍

应用1:使用Line Renderer绘制线段

应用1实现:使用系统工具或自定义工具绘制线段

应用2:Trail Renderer简单制作子弹拖尾效果

应用3:使用LineRenderer绘制圆(线段逼近)


线性渲染组件简介

  Line Renderer线性渲染组件用于在3D中渲染线段,如之前在小游戏中做过的激光门伤害,以及VR手柄上用到了Line Renderer。

  Trail Renderer拖尾渲染器也是用于渲染线段,用于给物体增加一个体现高速运动拖尾特效。

  本篇主要记录使用Line Renderer、Trail Renderer组件和API,使用它们绘制线段的方法,并且自建一个工具集合存储这些实用工具,以便在后续开发中随时使用。

绘制线条Line Renderer组件介绍

  Line Renderer是一个用顶点去控制渲染尺寸和位置的线条,其中顶点的个数和坐标也是可以控制的。官方的Line Renderer组件介绍可以看Line Renderer component - Unity 手册 (unity3d.com)

  其中,较常用的选项有width、Materials等,其他的设置一般都使用脚本控制。

  width控制线条的宽度,可以设置多个节点让线条各处不等宽。

    

   Materials控制线条材质,不加则只会显示粉色。当然这项也能在脚本中更改。

  

   Line Renderer常用的API有:

  positionCount:设置线段的点的数量;

  SetPosition(int index, Vector3[] position):添加点的位置(点的下标,点的位置);

  startWidth,endWidth:起点和终点的宽度;

  material.Color:射线材质颜色

绘制拖尾Trail Renderer组件介绍

  Trail Renderer组件与Line Renderer组件非常类似,是可以挂在在某个物体上,让它产生拖尾的效果。一般宽度可以设置为前面宽,后面窄,更加有高速的感觉:

  

   其他的设置可以参照官方文档:Trail Renderer component - Unity 手册 (unity3d.com),且可以在脚本中使用API方法来设定。拖尾的效果如下图显示:

应用1:使用Line Renderer绘制线段

  建立一个工具包Tools.cs,设置为静态Statics类,代码如下:

//静态工具类
public static class Tools
{
    //使用LineRenderer绘制线段,方法1(新建线段)
    public static LineRenderer DrawLine(Transform transform, Vector3 start, Vector3 end, Color color = default(Color),
        float width = 0.1f)
    {//DrawLine(设置父物体,线段起点,终点,颜色,宽度)
        GameObject gameObject = new GameObject();  //在场内新建一个物体
        gameObject.transform.SetParent(transform); //把这个物体方在父物体下面
        gameObject.name = "Line";                  //给物体命名
        LineRenderer line = gameObject.AddComponent<LineRenderer>();  //挂上LineRenderer组件
        line.useWorldSpace = true;  //线段设置为世界坐标
        line.material = Resload.Instance.LoadAsset<Material>("line");  //从Resource下加载名为line的材质
        line.SetVertexCount(2);  //设置顶点数量,2个,起点、终点
        line.SetWidth(width, width);  //设置第一个顶点的宽度、第二个顶点宽度
        line.material.SetColor("_Color", color);   //这个颜色是材质的颜色,是Material类中的一个属性
                                                   //这里修改的是Resource文件夹下line材质的颜色属性
        line.startColor = color;  //设置开始颜色和结束颜色
        line.endColor = color;    //可以有一个渐变的效果,当然也可以一致
        line.SetPosition(0, start);//设置起点和终点的位置
        line.SetPosition(1, end);
        return line;
    }

    //使用LineRenderer绘制线段,方法2(对已有线段修改)
    public static LineRenderer DrawLine(Transform transform, LineRenderer line,Vector3 start,Vector3 end, Color color=default(Color), float width = 0.1f)
    {//DrawLine(设置父物体,提供一个线段供修改,线段起点,终点,颜色,宽度)
        if(line==null)
        {//先判断是否已有一个线段,如果没有,则用方法2新建一个
            return DrawLine(transform,start, end, color,width);
        }
        //如果线段已存在,就按照下面的设置修改线段属性,与方法1设置方法相同
        line.useWorldSpace = false;  
        line.SetVertexCount(2);  
        line.SetWidth(width, width);  
        line.material.SetColor("_Color", color);  
        line.startColor = color;  
        line.endColor = color;    
        line.SetPosition(0, start);
        line.SetPosition(1, end);
        return line;
    }

}

  这里设置了2各绘制线段的方法,第一个方法是新建一个线段,包括在场内新建对象和挂载 Line Renderer组件,第二个方法是对已经挂载 Line Renderer组件的对象进行修改。如果有需要设置更复杂的线段,还可以定义得更加详细一些。

应用1实现:使用系统工具或自定义工具绘制线段

  在场内新建一个空节点line,并挂载一个脚本line.cs(名字随意)。不过这个line节点的位置会对之后绘制的线段有影响,因为线段是作为它的子节点的。line.cs的脚本只要在Start()中如下

void Start()
    {
        //使用Unity自带的Debug划线工具
        Debug.DrawLine(transform.position,transform.position+transform.forward*10,Color.green,100);
        Debug.DrawRay(transform.position, transform.forward, Color.red, 100);

        //使用Tools工具集划线段
        Tools.DrawLine(transform, transform.position, transform.position + transform.forward * 10, Color.blue, 0.1f);        
    }

  这里先尝试使用Unity自带的划线工具Debug.DrawLine。它的定义如下,传的参数比较少。

public static void DrawLine(Vector3 start, Vector3 end, Color color, float duration){}

  * 注: 使用静态(static)类、静态方法、静态变量时,只有在调取类时才能调用到它(Tools.DrawLine()),而不是new对象后,通过“对象.方法”来调用了。

  运行结果如下:

应用2:Trail Renderer简单制作子弹拖尾效果

  之前做过的子弹预制体上,直接AddComponent,加上Trail Renderer组件,根据需要简单设置一下颜色、宽度、阴影等参数,达到如下效果:

应用3:使用LineRenderer绘制圆(线段逼近)

  先制作工具,在Tools.cs工具集中加上下面的DrawCircle()方法:

    //使用LineRenderer绘制线段逼近一个圆
    public static void DrawCircle(GameObject go,float xRadius,float yRadius,float zRadius, 
        int number, float width,Color color = default(Color))
    {//画圆的物体,x/y/z方向的半径,线段数量,宽度,颜色
        if(!go.GetComponent<LineRenderer>())
        {
            go.AddComponent<LineRenderer>();
        }
        LineRenderer line=go.GetComponent<LineRenderer>();
        line.positionCount = number + 1;//5个线条有6个顶点
        line.useWorldSpace = false;  //使用本地坐标
        line.material = Resload.Instance.LoadAsset<Material>("line");
        line.material.SetColor("_Color", color);
        line.SetWidth(width, width);
        float x,y,z;
        float angle = 0;  //设置画圆(线)的初始角度为0,每画一条转一个angle角度,直到360度
        for(int i=0; i<line.positionCount; i++)
        {
            x = Mathf.Sin(Mathf.Deg2Rad * angle) * xRadius;
            y = Mathf.Cos(Mathf.Deg2Rad * angle) * yRadius;
            z=Mathf.Cos(Mathf.Deg2Rad*angle) * zRadius;
            line.SetPosition(i, new Vector3(x, y, z));  //设置line每个顶点的坐标
            angle += (360f / number);
        }

    在主角身上使用(把下面的CircleDraw.cs挂在主角上):

public class CircleDraw : MonoBehaviour
{
    public int number; //组成圆的线条数
    public float xRadius;
    public float yRadius;
    public float zRadius;
    public float width;
    void Start()
    {
        Tools.DrawCircle(transform.gameObject, xRadius, yRadius, zRadius, number, width, Color.cyan);
    }
}

  效果如下:

   

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UnityVR--组件3--Line Renderer--线性渲染 的相关文章

随机推荐

  • Android Framework——进程间通讯学习,从Binder使用看起

    前言 Binder 是安卓中非常重要的进程间通讯工具 通过Binder 安卓在ServiceManager中对外提供了一系列的服务 学习Binder 将很好地为我们学习framework开个好头 Android 使用多进程 Android
  • 5分钟带你看懂Jeesite10大功能要点

    jeesite内容丰富 集成了大量优秀的组件 是一个值得研究的框架 它有 1 shiro安全权限控制 2 mybatis查询缓存接口扩展 3 ecache分布式缓存整合 4 页面资源缓存优化 5 多数据源灵活切换 6 mybatismapp
  • EasyExcel轻松读取Excel文件!

    EasyExcel是一个Java库 用于快速 简单地读写Excel文件 要使用EasyExcel 您首先需要将其添加为项目的依赖 如果使用Maven 可以添加以下依赖项
  • 算法:二分查找之第一个错误的版本

    方法一 class Solution public int firstBadVersion int n int left 1 int right n while left lt right int mid right left 2 left
  • 【React】 4课 react初识组件

    首先我们如1课创建一个文件夹在文件夹中安装react环境需要的配置文件 npm init y npm i babel standalone D npm i react react dom D 安装配置文件教程链接 https blog cs
  • 4个开源的Java代码静态分析工具

    1 PMD PMD是一款采用BSD协议发布的Java程序代码检查工具 该工具可以做到检查Java代码中是否含有未使用的变量 是否含有空的抓取块 是否含有不必要的对象等 该软件功能强大 扫描效率高 是Java程序员debug的好帮手 PMD支
  • Lex和Yacc应用教程(四).语法树的应用

    Lex和Yacc应用方法 四 语法树的应用 草木瓜 20070515 一 序 不论什么语言 语法结构总是那几种 可以想象任何程序体都可以解释成一棵语法树 语法树的本质是递归 很显然Yacc文法的核心思想也是递归 本文就通过具体实例 使用Ya
  • cesium加载影像的问题解决

    我用gdal把web墨卡托转为经纬度 再切分片时 发现对不上影像 经过两天排查 发现竟然是前端写错 viewer scene imageryLayers addImageryProvider new Cesium UrlTemplateIm
  • vscode乱码

    vscode中文乱码怎么解决 vscode是一款跨平台源代码编辑器 能够在桌面上运行 并且能够用途windows macOS以及Linux 但是有不少小伙伴们在使用vscode时 输入输出的却是中文代码 也不知道如何解决 那么今天小编就来告
  • Ribbon负载均衡策略DynamicServerListLoadBalancer的ServerListFilter解读

    一 DynamicServerListLoadBalancer在类图中的位置 二 DynamicServerListLoadBalancer源码解读 1 关键代码请见注释 2 源码位置 ribbon master ribbon loadba
  • JDK 8 List集合使用记录

    JDK8 的新特性给我们开发带来了很大的便利性 先声明 我没有系统的去学习 JDK8的这些所有新特性 本文只是记录一些我个人日常开发中常遇到的一些 JDK8 的新特性方法 1 提取对象集合中的某一属性集合 List lt 对象 gt gt
  • 【文件I/O】(一)标准I/O

    标准I O 库函数 一 I O相关知识 1 1最早接触的I O 1 2I O的种类 1 3库函数和系统调用 1 4什么是FILE 二 标准I O函数 1 fopen fclose strerror perror 打开 关闭文件 输出错误码信
  • 2022年网络安全比赛--数据库服务渗透测试中职组(超详细)

    2022年数据库服务渗透测试解析 一 竞赛时间 180分钟 共计3小时 二 竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 1 通过分析靶机Server01页面信息 寻找漏洞页面 将WEB服务存在SQL注入漏洞的页面名称作为Flag
  • 电脑提示vcomp100.dll丢失错误怎么办?(多种修复方法介绍)

    vcomp100 dll是由 Microsoft 开发的动态链接库 DLL 它是几个基于图形的应用程序 例如 Photoshop 以及多个游戏 例如巫师 3 所必需的 vcomp100 dll的作用包括 提供多线程支持 vcomp100 d
  • logback日志在项目启动后立刻清理历史日志

    扣扣技术分享交流群 1125844267 背景 搭了一个maven项目 只有一个main方法 然后打成一个jar包以供别的程序去启动执行 项目中配置了logback日志策略 但是在生产环境下发现日志可以正常生成 但是没有删除历史日志 设置的
  • 最全面、最详细web前端面试题及答案总结

    最全面 最详细web前端面试题及答案总结 总结不易 希望可以帮助到即将面试或还在学习中的web前端小伙伴 祝面试顺利 拿高薪 本章是HTML考点的 重难点 因此我们采 简略回答的 式进 撰写 所以不会有太多详细的解释 我们约定 每个问题后我
  • STM32外部EXTI中断笔记(开始于2021-07-13)

    STM32外部EXTI中断笔记 1 EXTI简介 在STM32上外部中断线共有19个 互联型 其上每个GPIO都可作外部中断输入 供GPIO的外部中断线供有16个 EXTI Line x x 0 15 stm32只分配7个中断向量给这16个
  • beego+goAdmin+mysql+docker+natapp作为微信小程序地服务器“伪部署”

    写在前面的话 1 为什么我要叫伪部署 答 因为我把它们放在服务器运行 都是开发模式 生产模式实在不会弄 所以就这样了 2 系统环境 答 腾讯云服务器 系统为 ubuntu 版本不记得 应该是比较高的 3 前提假设 答 假设你的服务器已经安装
  • Nginx启动报No mapping for the Unicode character exists in the target multi-byte code pa

    安装路径不能含有中文
  • UnityVR--组件3--Line Renderer--线性渲染

    目录 线性渲染组件简介 绘制线条Line Renderer组件介绍 绘制拖尾Trail Renderer组件介绍 应用1 使用Line Renderer绘制线段 应用1实现 使用系统工具或自定义工具绘制线段 应用2 Trail Render