Unity LineRenderer 之 鼠标轨迹记录和拖尾实现
1、本届案例实在透视摄像机下获得鼠标的屏幕坐标转为世界坐标,鼠标的屏幕坐标要做调整,原理可参见之前的百度经验《Unity 注意事项 之 屏幕坐标转世界坐标的注意》(链接如下),若已有了解,可忽略此
1、打开Unity,新建一个空工程,注意,此时摄像机的透视摄像机,具体如下图

2、在工程中,导入一个图片,后期作为材质贴图使用,具体如下图

3、新建一个材质“Material”,其中“Shader”改为“Paticle/Additive”(去掉贴图的背景),把导入的贴图赋予材质,具体如下图

4、在场景中,新建一个“GameObject”,并添加一个“LineRenderer”组件,新建的材质赋给“LineRenderer”,并设置点的个数为10个,其他设置具体如下图

5、给“GameObject”添加一个脚本“MouseTrack”,具体如下图

6、编辑脚本“MouseTrack”,思路大概如下:首先设置变量,然后在Update检测鼠标按下抬起,接着记录鼠标坐标,最后把保存的点赋给“LineRenderer”即可。(需要注意的是:透视摄像机下的鼠标点屏幕转世界坐标时,需要设一下Z值,正交摄像机则不需要),具体的代码和代码说明如下图


7、“MouseTrack”脚本的具体内容如下;
using UnityEngine;
public class MouseTrack : MonoBehaviour {
/// <summary>
/// 获取LineRenderer组件
/// </summary>
[Header("获得LineRenderer组件")]
public LineRenderer lineRenderer;
private Vector3[] mouseTrackPositions = new Vector3[10];
private Vector3 headPosition;
private Vector3 lastPosition;
private int positionCount = 0;
[Header("设置多远举例记录一个位置")]
public float distanceOfPositions = 0.01f;
private bool firstMouseDown = false;
private bool mouseDown = false;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
if(Input.GetMouseButtonDown (0)) {
firstMouseDown = true;
mouseDown = true;
}
if(Input.GetMouseButtonUp (0)){
mouseDown = false;
Debug.Log ("mouseDown:"+mouseDown.ToString ());
}
OnDrawLine ();
firstMouseDown = false;
}
private void OnDrawLine(){
if(firstMouseDown == true){
positionCount = 0;
headPosition = Camera.main.ScreenToWorldPoint (Input.mousePosition + new Vector3 (0, 0, 10));
lastPosition = headPosition;
}
if (mouseDown == true) {
headPosition = Camera.main.ScreenToWorldPoint (Input.mousePosition + new Vector3 (0, 0, 10));
if (Vector3.Distance (headPosition, lastPosition) > distanceOfPositions) {
SavePosition (headPosition);
positionCount++;
}
lastPosition = headPosition;
} else {
mouseTrackPositions = new Vector3[10];
}
SetLineRendererPosition (mouseTrackPositions);
}
private void SavePosition(Vector3 pos){
pos.z = 0;
if (positionCount <= 9) {
for (int i = positionCount; i < 10; i++) {
mouseTrackPositions [i] = pos;
}
} else {
for(int i = 0; i < 9; i++){
mouseTrackPositions [i] = mouseTrackPositions [i + 1];
}
mouseTrackPositions [9] = pos;
}
}
private void SetLineRendererPosition(Vector3[] positions){
lineRenderer.SetPositions (positions);
}
}
8、脚本编译正确,回到Unity界面,把“LineRenderer”赋给脚本,具体如下图

9、运行场景,在屏幕上点击鼠标,并滑动,即可看到,鼠标拖尾效果,具体如下图

10、到此《》讲解结束,谢谢