Line Renderer 是一个有用的工具,可让您在游戏中绘制线条。 它可以用作游戏的函数或调试标记。 在这里,让我们创建一个程序,根据基本用法在 Line Renderer 上移动。
目录
如何使用 Line Renderer 和基础知识
首先,我们来基本学习如何使用它。
在场景中放置 Line Renderer
首先,调用 Line Renderer 以便在游戏中使用它的过程。
- GameObjectMenuHierarchy 菜单。 ... 更多 在 Effects>Line 中创建
- 将 Component>Line Renderer 添加到空游戏对象
进行初始设置的最简单方法是通过 Effects。
关键组件属性
您应该了解一些属性。 如果您不知道可以在检查器中设置什么,您可能会感到困惑,因此我将向您介绍。
财产 | 效果等 |
---|---|
场景工具 | 您可以增加用于在 Line Renderer 中编辑线条的工具 点数量。 |
位置 | 如果组成线的每个点的坐标可以确认为 2021 或更高,则可以通过拖放来交换顶点编号。 |
宽度 | 调整直线的粗细,使用 Animation Curve 控制 从尖端到末端的粗细 |
颜色 | 颜色 |
拐角顶点 | 直线接头的曲线可以平滑。 数字越大,越平滑,但网格数也会相应增加 |
End Cap Vertices(结束端顶点) | 在起点和终点处可以 四舍五入的数字越多,它就会越平滑,但网格的数量会相应地增加 |
使用世界空间 | 如果选中,它将是一个绝对坐标系 |
材料 | 材料 |
Order In Layer | 渲染上下文排序 层 |
如何添加顶点
我认为这可能是最简单的。
- 在 Scene Tools 中选择 "+" 按钮
- 您将处于顶点追加模式
- 输入:鼠标位置
- 单击场景中要添加顶点的位置。
- 完成添加顶点
- 再次按下 "+" 按钮可取消顶点添加模式
如何在 Input 中使用 Physics Raycast?
Physics Raycast 为凹凸不平的碰撞箱和其他内容创建顶点。 当您想要从地板到墙壁划线时,这很有用。
编辑您提出的观点
您创建的顶点也会在场景视图中进行编辑。 如果要进行精细的数值调整,请从 Positions (位置) 调整值。
- 在 Scene Tools 中选择看起来像破损的串饺的图标
- 进入顶点编辑模式(适合名称)
- 选择要移动的顶点
- 左键单击顶点上的黄点
- 验证是否显示 MoveTool 箭头
- 移动到要更改的位置
- 顶点编辑模式退出
- 再次选择串饺
- 即使选择完全不同的游戏对象,它也将被取消
奖励:LineMover
从这里开始,我将介绍一些使用 Liner Renderer 的有用功能。 介绍通过跟踪您创建的线路来移动的程序
LineMover 脚本
在下面的脚本中,附加到 LineMover 的游戏对象沿 Line 移动。 逻辑是以 speed 设置的速度向下一个点移动。
- 将其粘贴到要在行上移动的游戏对象中
- 设置要移动到 Inspector 的 Line Renderer。
- 当您玩 Unity 时,它会独立工作
- 如果要调整速度,请增加或减少 speed 的值。
cs
using UnityEngine;
using System;
public class LineMover : MonoBehaviour
{
[SerializeField] private LineRenderer lineRenderer;
[SerializeField] private float speed = 1f;
private int currentIndex;
public EventHandler OnEndReached;
private void Start()
{
Initialize(0,speed,lineRenderer);
}
public void Initialize(int index, float speed, LineRenderer lineRenderer)
{
enabled = true;
currentIndex = index;
this.speed = speed;
this.lineRenderer = lineRenderer;
transform.position = this.lineRenderer.GetPosition(currentIndex);
}
public static (Vector3 targetPosition, bool isEnd) GetTargetPosition(ref int index, float moveSpeed, Vector3 currentPosition, LineRenderer lineRenderer)
{
int nextIndex = index + 1;
if (lineRenderer.positionCount <= nextIndex)
{
return (lineRenderer.GetPosition(index)+ lineRenderer.transform.position, true);
}
var nextPosition = lineRenderer.GetPosition(nextIndex) + lineRenderer.transform.position;
float distance = Vector3.Distance(currentPosition, nextPosition);
if (distance < moveSpeed)
{
index += 1;
return GetTargetPosition(ref index, moveSpeed - distance, nextPosition, lineRenderer);
}
else
{
Vector3 direction = (nextPosition - currentPosition).normalized;
return (currentPosition + direction * moveSpeed, false);
}
}
private void Update()
{
var result = GetTargetPosition(
ref currentIndex,
speed * Time.deltaTime,
transform.position,
lineRenderer);
transform.position = result.targetPosition;
if (result.isEnd)
{
OnEndReached?.Invoke(this, EventArgs.Empty);
enabled = false;
}
}
}
如果要接收 move completed,可以通过接收 OnEndReached 的 EventHandler 来检查它。该程序可能需要根据应用程序进行更改。
由于上述程序只更新 transform.position,所以如果想结合物理行为,需要使用 Rigidbody MovePosition 什么的。 顺便说一句,同样的东西也被用来移动寿司游戏的盘子。