Unity3D 使用LineRenderer绘制尾迹与虚线

1.添加LineRenderer组件

先创建一个3D对象,然后点击Add Component选项

搜索并添加LineRenderer组件

添加完成之后我们就能看到一个突兀的紫色方块出现在了球体旁边,这个就是初始状态(还没孵化出来)的LineRenderder

稍后我们需要使用脚本来控制它的行为


2.添加控制脚本

为了控制LineRenderer的行为,我们需要新建一个脚本,就叫MoveTrack好了


完整轨迹脚本

在实现尾迹之前,不妨先了解一下如何使用LineRenderer绘制完整的运动路径

public class MoveTrack : MonoBehaviour
{
// LineRenderer组件
LineRenderer lineRenderer; void Start()
{
// 获取组件
lineRenderer = GetComponent<LineRenderer>();
// 重置坐标点数量
lineRenderer.positionCount = 0;
} void Update()
{
// 将当前位置添加到LineRenderer
lineRenderer.SetPosition(lineRenderer.positionCount++, transform.position);
}
}

实现的效果


尾迹效果脚本

尾迹的实现其实并没有和上面相差太多,上面是记录所有的走过的路径点,而尾迹则只需要记录走过的前几个路径点,让路径点像队列一样先进先出,每次把最早的记录去掉,然后再加入当前的位置坐标,这样就能绘制出固定范围的路径了。

既然思路有了,那么这就写一个脚本试试

// 挂载脚本后可以自动添加LineRenderer
[RequireComponent(typeof(LineRenderer))] public class MoveTrack : MonoBehaviour
{
// LineRenderer组件
LineRenderer lineRenderer;
// 使用List储存前几个位置的坐标点
// 由于绘制过程中需要遍历坐标,所以不能直接使用队列
// 而是用List进行模拟
List<Vector3> pointList = new List<Vector3>();
// 需要记录的坐标点的数量
[SerializeField] int pointSize = 20; void Start()
{
// 初始化坐标点列表
InitPointList();
// 获取LineRenderer组件
lineRenderer = GetComponent<LineRenderer>();
// 初始化LineRenderer的坐标点数量
lineRenderer.positionCount = pointSize;
} void FixedUpdate()
{
// 更新坐标点列表
UpdatePointList();
// 根据记录的坐标点绘制尾迹
DrawLine();
} // 初始化坐标点列表
void InitPointList()
{
// 用起始坐标填满列表进行初始化
for (int i = 0; i < pointSize; i++)
pointList.Add(transform.position);
} // 更新坐标点列表 (模拟队列方式)
void UpdatePointList()
{
// 移除最后一个坐标点
pointList.RemoveAt(pointSize - 1);
// 添加当前坐标点到表头
pointList.Insert(0, transform.position);
} // 绘制尾迹
void DrawLine()
{
// 遍历坐标点并添加到LineRenderer中
for (int i = 0; i < pointSize; i++)
lineRenderer.SetPosition(i, pointList[i]);
}
}

这样,我们就得到了一个基本的尾迹效果


3.修改LineRenderer组件样式

虽然尾迹效果是有了,但目前的样子显然是有点不堪入目不尽人意

不过没关系,因为在组件面板中有非常多的选项可供我们调整

虽然我基本都不会用(逃

所以我们继续来看看如何修改LineRenderer的样式


宽度控制

说到尾迹,那肯定是少不了结尾由粗变细的效果

右键宽度调节窗口上的红线,之后就会出现Add Key选项

(注意,要右键红线位置,不然不会有反应)

添加完关键点后,就可以拉曲线来实现不同位置粗细调节的效果了


颜色调节

在做前几步的时候可能就有小伙伴发现了,为什么在设置里调的颜色不会生效呢?

在设置里稍微往下看看,就能找到一个默认被折叠的选项卡Materials,它就是罪魁祸首。

在没有材质的情况下LineRenderer是无法正常渲染的,所以现在我们需要创建一个Material来给他挂上

把Material设置上方的Shader设为Sprites/Default

(其实设置成GUI/Text Shader或其他应该也可以,但默认的Standard似乎不行)

这样之前设置的颜色就能成功显示出来了

此外,Material设置里面也有个Tint选项可以调节颜色,而线条最终的颜色受二者共同影响,而且Tint选项是可以额外调节透明度的

你不觉得这很酷吗?(逃


纹理Texture(虚线)

既然都做到这一步了,还局限在调节颜色上怎么能行

我们当然是要搞一个大新闻

所以我们就来试试为它添加Texture

首先依旧是在熟悉的Material,这次把Shader设为GUI/Text Shader

主要是因为我不知道如何给Sprites/Default挂上纹理

修改完后,右边就出现了选择Texture的方框

把虚线素材拖进去

虚线素材在这里

注意,要用png格式才能有透明效果

最后把LineRenderer的TextureMode修改为Tile,就大功告成了

最终效果

其实这里可以看出虚线显示在了球体的前面,这是因为GUI/Text Shader无法正确处理遮挡关系。

因此我们可以在GUI/Text Shader下设置完Texture后,再把Shader设置为Sprites/Default

切换后虽然设置界面没有显示纹理,但实际效果是保留下来了,不过具体原理我也不是很了解


关于纹理的补充

如果按照上面的方法,最后却无法正常显示的话可以试着右键你的素材,选择Properties

看看TextureType是否为Default


本文编辑于2022年10月29日

最后修改于2022年10月30日

[Unity3D] 使用LineRenderer实现尾迹与虚线效果的更多相关文章

  1. unity3D 涂涂乐使用shader实现上色效果

    unity3D 涂涂乐使用shader实现上色效果 之前我博文里面发过一个简单的通过截图方式来实现的模型上色方法,但是那个方法不合适商用,因为你需要对的很准确才可以把贴图完美截取下来,只要你手抖了一下 ...

  2. Unity3D中暂停时的动画及粒子效果实现

    暂停是游戏中经常出现的功能,而Unity3D中对于暂停的处理并不是很理想.一般的做法是将Time.timeScale设置为0.Unity的文档中对于这种情况有以下描述: The scale at wh ...

  3. 学习笔记-Unity3d代码实现Windows10加载圈圈的效果

    最近在写一个Unity3d的模仿windows10的桌面的程序,由于Unity3d本身不支持Gif图片,所以突发奇想使用代码来实现接近的. 接下来是代码部分:不一一解析,很简单,看的懂原理就Okly了 ...

  4. [Unity3d]向量的过度方法以及拖尾效果

    Vector3.RotateTowards() 用法 public static function RotateTowards(current: Vector3, target: Vector3, m ...

  5. Unity3d 2017

    Unity3d引擎的新纪元--Unity3d 2017 来源 http://blog.csdn.net/dark00800/article/details/75209544 Unity3d不久之前正式 ...

  6. [Unity3D]Unity3D游戏开发之《愤慨的小鸟》弹弓实现

    各位朋友,大家晚上好, 我是秦元培.欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei.今天我们来做一个高端大气上档次的东西. 我相信大家都玩过一款叫做<愤慨的 ...

  7. 深入了解Unity中LineRenderer与TrailRenderer

    LineRender和TrailRender是两个好东西,很多Unity拖尾特效都会使用到它们.一些简单的介绍可以参见官方的API文档.在这里探讨一下它们具体的渲染方式,而后给出一些Shader以便更 ...

  8. Unity3d多人在线教程

    [转载]Unity3d多人在线教程 (2013-02-25 16:02:49) 转载▼ 标签: 转载   原文地址:Unity3d多人在线教程作者:lsy0031 Unity 多个玩家开发教程 Uni ...

  9. [Unity3D]Unity资料大全免费分享

     都是网上找的连七八糟的资料了,整理好分享的,有学习资料,视频,源码,插件……等等 东西比较多,不是所有的都是你需要的,可以按  ctrl+F 来搜索你要的东西,如果有广告,不用理会,关掉就可以了,如 ...

  10. [Unity3D入门]入门级游戏项目"坦克狙击手"更新

    [Unity3D入门]入门级游戏项目"坦克狙击手"更新 在上一篇中我分享了一个尚未完全写好的入门级unity3d项目"坦克狙击手". 本文介绍最新版的" ...

随机推荐

  1. 如何编写一个 PowerShell 脚本

    PowerShell 脚本的后缀是 .ps1 前提: ps1 脚本可以帮忙我们快速修改文件内容,还不需要调用文件的底层 api,方便快捷 在编写 CMakeLists 时发现,项目不能够很好的使用 v ...

  2. C++ 多线程的错误和如何避免(6)

    加锁的临界区要尽可能的紧凑和小型 问题分析: 当一个线程在临界区内执行时,所有其他试图进入临界区的线程都会被阻止,所以我们应该保证临界区尽可能的小.比如, void CallHome(string m ...

  3. java个人博客

    效果浏览 首页 详情页 Aboutme 后台管理 管理/添加博客 添加分类 管理员管理 友情链接 访问地址 前台地址http://localhost 后台地址:http://localhost/adm ...

  4. Excel Undo-Redo的编程问题

    Excel Undo历史栈对外是不透明的. 代码对Excel表单的编辑操作会清空Excel内部的Undo历史. Application.OnUndo只支持一次撤销,并且不支持ReDo. 使用DDE的方 ...

  5. 【Azure Developer】use @azure/arm-monitor sdk 遇见 ManagedIdentityCredential authentication failed.(status code 500)

    问题描述 在使用 @azure/arm-monitor sdk 创建 MonitorClient对象时候,遇见错误 ManagedIdentityCredential authentication f ...

  6. 【Azure 事件中心】Event Hubs如何获取其中存放的历史消息

    问题描述 使用Azure Event Hub服务,除了正常的生产,消费消息以外,如果想拿到Event Hub中存储的历史消息?有什么方法呢? 问题解答 获取 Event Hubs 存储的历史消息,首先 ...

  7. 【Azure 存储服务】存储在Azure Storage Table中的数据,如何按照条件进行删除呢?

    问题描述 如何按条件删除 Storage Table 中的数据,如果Table中有大量的条记录需要删除,Java代码如何按条件删除 Table中的数据(Entity)? (通过Azure Storag ...

  8. 【Azure Developer】使用 Azure Python 查看 Azure 所有的 Alert rule

    问题描述 在Azure Alert 门户中,可以列举出所有Azure资源的Alert rule信息,如下图: 如果像通过Python SDK来获取所有的Alert Rule,有什么可以参考的代码吗? ...

  9. 【Azure 媒体服务】记录一个简单的媒体视频上传到Media Service无法播放问题

    问题描述 从本地上传到Azure Media Service Portal的视频,并且新增定位符后,无法播放.但是上传的其他视频是可以的.疑惑中!! 问题自查 自查发现,是视频的文件名中有个特殊符号. ...

  10. 【Azure 应用服务】App Server 部署后,Docker报错,找不到8080端口

    问题描述 App Service for Container.  Docker Image 推送到ACR(向 Azure 容器注册表), 配置App Service并部署成功了.查看Docker日志( ...