利用LineRenderer组件设计导航箭头。
//导航箭头
Shader "Custom/NavPathArrow"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_ScrollXSpeed("X Scroll Speed", Range(-20, 20)) = 2
_ScrollYSpeed("Y Scroll Speed", Range(-20, 20)) = 2
}
SubShader
{
//Overlay、Transparent
Tags { "Queue" = "Overlay" "RenderType"="Overlay" "IgnoreProjector" = "True" "PreviewType" = "Plane" }
LOD 100
//双面渲染
Cull Off
//关闭光照
Lighting Off
//关闭深度写入
ZWrite Off
//开启深度测试
ZTest Always
//Alpha混合
Blend SrcAlpha OneMinusSrcAlpha
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
float4 _MainTex_ST;
half _ScrollXSpeed;
half _ScrollYSpeed;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
return o;
}
fixed4 frag(v2f i) : SV_Target
{
fixed2 uv = i.uv;
fixed t = frac(_Time.y);//[0,1)
uv.x += _ScrollXSpeed * t;
uv.y += _ScrollYSpeed * t;
fixed4 col = tex2D(_MainTex, uv);
return col;
}
ENDCG
}
}
}
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 导航箭头
/// </summary>
public class NavPathArrow : MonoBehaviour
{
[SerializeField]
private LineRenderer lineRenderer;
[SerializeField]
private int lineWidth = 5;
[SerializeField]
private List<Transform> points = new List<Transform>();
private List<Vector3> vectors = new List<Vector3>();
private void Awake()
{
lineRenderer.alignment = LineAlignment.View;
lineRenderer.textureMode = LineTextureMode.Tile;
lineRenderer.startWidth = lineWidth;
lineRenderer.endWidth = lineWidth;
}
// 绘制路径
private void DrawPath()
{
vectors.Clear();
points.ForEach(p => {
if (p.gameObject.activeInHierarchy)
vectors.Add(p.position);
});
if (vectors.Count != lineRenderer.positionCount)
lineRenderer.positionCount = vectors.Count;
for (int i = 0; i < vectors.Count; i++)
lineRenderer.SetPosition(i, vectors[i]);
}
private void Update()
{
DrawPath();
}
}