1. 程式人生 > >使用lineRender畫線時不能在UI圖上顯示線的問題解析

使用lineRender畫線時不能在UI圖上顯示線的問題解析

LineRenderer 線渲染器

畫線

  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後畫的線就會顯示在圖片上了