使用lineRender画线时不能在UI图上显示线的问题解析

来源:互联网 发布:土工cbr试验量算法 编辑:程序博客网 时间:2024/06/05 01:20

LineRenderer 线渲染器

  • 属性

  • SetWidth

    设置线的开始和结束的宽度。

  • SetColors

    设置线的开始和结束的颜色。

  • SetVertexCount

    设置线段数。

  • SetPosition

    设置线段的位置。

  • useWorldSpace
    如果启用,该线被定义在世界级坐标空间。

画线

  bool isMouseDown;//鼠标是否按下;
    GameObject obj;// 有lineRender组件的预制体
    List<Vector3> points = new List<Vector3>();//声明一个Vector类链表;存储点的坐标
    // Use this for initialization
    void Start () {
    
    }
    
    // Update is called once per frame
    void Update () {
        if (Input.GetMouseButtonDown(0)) {//鼠标按下;
            points.Clear();//每次划线前清空数据,这样每次的线不会相互影响;
            obj = GameObject.Instantiate(Resources.Load("MyProjectRes/Huaduoxian2d1")) as GameObject;
            obj.transform.parent = MainUI.GetInstance.m_uiSelectParent.transform;
            isMouseDown = true;
            obj.transform.localScale = Vector3.one;
        }
        if (Input.GetMouseButtonUp(0)) {//鼠标抬起;
            isMouseDown = false;
        }
        if (isMouseDown) {
            Vector3 position = Input.mousePosition;//获取鼠标位置,属于二维坐标;

            position = Camera.main.ScreenToWorldPoint(position);//屏幕坐标转世界坐标,z轴为摄像机的;
            position.Set(position.x, position.y, 0f);//z轴远离摄像机,可以观察到;
            points.Add(position);//坐标存放在list中;
            Huaduoxin2d3 line1 = obj.GetComponent<Huaduoxin2d3>();
            line1.Draw(points);
        }
    }

将上面脚本绑在主摄像机上

obj预制体上绑下面脚本,要有lineRender组件,这里加了边缘碰撞器,为了是线可以发生物理效果

    LineRenderer line;//划线类;

    EdgeCollider2D edge;//边缘碰撞器;
    List<Vector2> points = new List<Vector2>();//声明一个二维链表;
    void Awake() {
        line = GetComponent<LineRenderer>();
        edge=GetComponent<EdgeCollider2D>();
    }
    // Use this for initialization
    void Start()
    {
    }
    // Update is called once per frame
    void Update (){
       
    }

    public void Draw(List<Vector3> _points)//Draw方法;
    {
        //line.material = new Material(Shader.Find("Unlit/Transparent Colored"));
        line.SetVertexCount(_points.Count);//设置点数量;
        for (int i = 0; i < _points.Count; i++)
        {
            line.SetPosition(i, _points[i]);//每个赋值;
            points.Add(new Vector2(_points[i].x, _points[i].y));//添加;
        }
        if (points.Count > 1)
            edge.points = points.ToArray();//点数大于1就赋值给边缘碰撞其的数组;
    }


这样就可以实现画线在屏幕上,但是如果加上UI图片,线不能显示在图片了,被图片遮挡了,就是下面的效果

为了让线不被遮挡,我发现原因是因为UICamera的属性Clear Flags

Clear Flags 清除标记

       相机在渲染时会存储颜色和深度信息。屏幕的未绘制部分是空的,默认情况下会显示天空盒。当你使用多个相机时,每一个都将自己的颜色和深度信息存储在缓冲区中,还将积累大量的每个相机的渲染数据。当场景中的任何特定相机进行渲染时,你可以设定清除标记以清除缓冲区信息的不同集合

Skybox 天空盒

     默认设置。在屏幕上空的部分将显示当前相机的天空盒。如果当前相机没有设置天空盒,它会默认使用渲染设置(在Edit->Render Settings里)中选择的天空盒。然后它将退回使用背景颜色。

Solid Color 纯色

     屏幕上的空的部分将显示当前相机的背景颜色。

Depth Only 仅深度

    不同的深度显示的优先级不同,优先级高的会覆盖优先级低的物体,第一人称fps中,玩家手里的枪就是如此,纪要显示场景,又要显示枪,需要不同的深度去控制显示,设置一个深度为0的相机来绘制环境,还要另一个深度为1的相机单独绘制武器。该武器相机的清除标记应设置为仅深度。这将保持环境的图形显示在屏幕上,枪被绘制出来,不透明的部分将完全覆盖任何已绘制的事物

Don't Clear 不清除

不清除任何颜色或深度缓存。其结果是,每帧绘制在下一帧之上,造成涂片效果。最好是与自定义着色器一起使用

我选择了Don't Clear后画的线就会显示在图片上了





0 0
原创粉丝点击