Unity LineRenderer 之 鼠标轨迹记录和拖尾实现

2025-11-16 21:00:27

1、本届案例实在透视摄像机下获得鼠标的屏幕坐标转为世界坐标,鼠标的屏幕坐标要做调整,原理可参见之前的百度经验《Unity 注意事项 之 屏幕坐标转世界坐标的注意》(链接如下),若已有了解,可忽略此

1、打开Unity,新建一个空工程,注意,此时摄像机的透视摄像机,具体如下图

Unity LineRenderer 之 鼠标轨迹记录和拖尾实现

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

Unity LineRenderer 之 鼠标轨迹记录和拖尾实现

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

Unity LineRenderer 之 鼠标轨迹记录和拖尾实现

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

Unity LineRenderer 之 鼠标轨迹记录和拖尾实现

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

Unity LineRenderer 之 鼠标轨迹记录和拖尾实现

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

Unity LineRenderer 之 鼠标轨迹记录和拖尾实现

Unity LineRenderer 之 鼠标轨迹记录和拖尾实现

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”赋给脚本,具体如下图

Unity LineRenderer 之 鼠标轨迹记录和拖尾实现

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

Unity LineRenderer 之 鼠标轨迹记录和拖尾实现

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

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢