Unity 实用教程之 简单地图导航循环长箭头实现
1、打开Unity,新建一个空工程,具体如下图
2、在场景中,新建一个Shader,并打开编辑代码,具体如下图
3、Shader的具体代码如下:
Shader"Custom/TransparentOverlay"
{
Properties
{
_MainTex ("MainTex(RGBA)",2D) = "white" {}
}
SubShader
{
LOD 100
Cull Off Lighting Off ZWrite Off ZTest Always
Blend SrcAlpha OneMinusSrcAlpha
Tags
{
"Queue" ="Overlay"
"IgnoreProjector" ="True"
"RenderType" ="Transparent"
}
Pass
{
SetTexture[_MainTex]
}
}
}
4、在工程中,导入一张箭头图片,并新建一个Material,把Material的Shader改成刚才新建的Shader,贴图设置为导入的箭头图片,具体如下图
5、在场景中新建一个“Plane”,设置如下图,并且把刚才新建的Material,赋给“Plane”,具体如下图
6、在场景中新建一个脚本,并打开进行编辑,具体如下图
7、脚本具体代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MapLine : MonoBehaviour {
private Vector3 startPos = Vector3.one;
private Vector3 endPos = Vector3.one;
private Vector3 rotation = Vector3.zero;
private Material material;
private bool isMove;
private Vector2 moveDir;
private Vector2 resetOffset;
void Awake()
{
isMove = false;
moveDir = new Vector2(0, 0.01f);
resetOffset = new Vector2(0, 100);
material =GetComponent<Renderer>().material;
}
/// <summary>
/// 设置材质的Offset的属性,让箭头移动起来
/// </summary>
private void Update()
{
if(isMove)
{
if (material.mainTextureOffset ==resetOffset)
material.mainTextureOffset =moveDir;
material.mainTextureOffset += -moveDir;
}
if(Input.GetKeyDown (KeyCode.A)){
SetLine (new Vector3 (0, 0, 0), new Vector3 (5,0,5));
}
}
public void SetLine(Vector3 startPos,Vector3 endPos)
{
this.startPos = startPos;
this.endPos = endPos;
transform.localScale = Vector3.one *0.05f;
transform.position = startPos;
transform.eulerAngles = Vector3.zero;
var scale = transform.localScale;
var lineLong = CalLineLong() * 2;
scale.z = scale.z * lineLong;
transform.localScale = scale;
rotation.y = CalLineAngle() ;
transform.eulerAngles = rotation;
material.mainTextureScale = new Vector2(1, lineLong);
transform.Translate(0,0,lineLong / 4,Space.Self);
//因为贴图箭头的方向不对,这里角度纠正,刚刚好 Y + 180
transform.eulerAngles += new Vector3(0, 180, 0);
isMove = true;
}
/// <summary>
/// 计算行军路线长度
/// </summary>
private float CalLineLong()
{
return Mathf.Sqrt(Mathf.Pow(startPos.x- endPos.x, 2) + Mathf.Pow(startPos.z - endPos.z, 2));
}
/// <summary>
/// 计算行军路线角度
/// </summary>
private float CalLineAngle()
{
//斜边长度
float length = Mathf.Sqrt(Mathf.Pow((startPos.x- endPos.x), 2) + Mathf.Pow((startPos.z - endPos.z), 2));
//对边比斜边 sin
float hudu =Mathf.Asin(Mathf.Abs(startPos.z - endPos.z) / length);
float ag = hudu * 180 / Mathf.PI;
//第一象限
if ((endPos.x - startPos.x) >= 0&& (endPos.z - startPos.z >= 0))
ag = -ag + 90;
//第二象限
else if ((endPos.x - startPos.x) <=0 && (endPos.z - startPos.z >= 0))
ag = ag - 90;
//第三象限
else if ((endPos.x - startPos.x) <=0 && (endPos.z - startPos.z) <= 0)
ag = -ag +270;
//第四象限
else if ((endPos.x - startPos.x) >=0 && (endPos.z - startPos.z) <= 0)
ag = ag + 90;
return ag;
}
}
8、脚本编译正确,回到Unity界面,把脚本赋给“Plane”,具体如下图
9、运行场景,结果如下图
10、到此,《Unity 实用教程之 简单地图导航循环长箭头实现》讲解结束,谢谢