unity 如何使用LineRenderer 動態劃線

我就廢話不多說瞭,大傢還是直接看代碼吧~

private LineRenderer line1;        
//畫線
line1 = this.gameObject.AddComponent<LineRenderer>();
//隻有設置瞭材質 setColor才有作用
line1.material = new Material(Shader.Find("Particles/Additive"));
line1.SetVertexCount(2);//設置兩點
line1.SetColors(Color.yellow, Color.red); //設置直線顏色
line1.SetWidth(5f, 10f);//設置直線寬度      
//設置指示線的起點和終點
line1.SetPosition(0, A.transform.position);
line1.SetPosition(1, B.transform.position);
Destroy(this.gameObject.GetComponent<LineRenderer>());

補充:Unity LineRenderer繪制物體行走路線

我是用的角色控制器(Character Controller)+LineRenderer做的

下面是代碼

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerTest : MonoBehaviour
{
    public GameObject clone;//這是個空物體  隻添加瞭一個LineRenderer組件
    public float speed = 5;
    public float jumpSpeed = 10f;
    public float luodi = 15;
    private Vector3 movePos = Vector3.zero;
    public CharacterController controller;
    private LineRenderer line;
    Vector3[] path;
    private float time = 0;
    List<Vector3> pos=new List<Vector3> ();
    void Awake()
    {
              path = pos.ToArray();//初始化
              line = clone.GetComponent<LineRenderer>();//獲得該物體上的LineRender組件
              line.SetColors(Color.blue, Color.red);//設置顏色
              line.SetWidth(0.2f, 0.1f);//設置寬度
    }
    void Update()
    {
        time += Time.deltaTime;
        if (time>0.1)//每0.1秒繪制一次
        {
            time = 0;
            pos.Add(transform.position);//添加當前坐標進鏈表
            path = pos.ToArray();//轉成數組
        }
        if (controller.isGrounded)//判斷人物是否落地
        {
            movePos = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
            movePos = transform.TransformDirection(movePos);
            movePos *= speed;
            if (Input.GetButton("Jump")) { 
                movePos.y = jumpSpeed;
              }
        }
        movePos.y -= luodi * Time.deltaTime;
        controller.Move(movePos * Time.deltaTime);
        if (path.Length!=0)//有數據時候再繪制
        {
            line.SetVertexCount(path.Length);//設置頂點數      
            line.SetPositions(path);//設置頂點位置
        }         
    }
}

補充:Unity組件 — LineRenderer動態添加碰撞

基礎知識:

選中要添加組件的gameObject,在Inspector面板,點擊“Add Component”按鈕,選中LineRenderer組件,添加。

cast Shadows : 蒙上陰影

Receive Shadows : 是否接受陰影

Dynamic Occludee : 是否動態遮罩

Materials 中的屬性:

size : 材質球的數量

Element : 具體的材質球

Positions 中的屬性:

size : 位置的數量

Element : 具體的位置

Use World Space : 是否使用世界坐標系,還是使用相對坐標系

Width : 線條的寬度

Color : 線條的顏色,註:如果沒有賦值材質,無論怎樣改變Color的值,顏色都不會有改變。

Corner Vertices : 可形成線條的圓角效果

End Cap Vertices : 影響線條的兩端的圓角效果。

註:當line Renderer擁有瞭材質,可以通過修改Color來改變顏色。當時當修改瞭Color後,line的顏色沒有改變,應該是Material和Color屬性結合不好。將Material修改為Sprites/Default,Color的顏色就可以成功的顯示在line上面瞭。

動態添加碰撞器(Polygon Collider2D)

using System.Collections;
using System.Collections.Generic;
using UnityEngine; 
public class MouseTrack : MonoBehaviour
{ 
    /// <summary>
    /// 獲取LineRenderer組件
    /// </summary>
    [Header("獲得LineRenderer組件")]
    public LineRenderer lineRenderer;
    //獲得鼠標跟蹤位置
    private Vector3[] mouseTrackPositions = new Vector3[20]; 
    private Vector3 headPosition;   //頭位置
    private Vector3 lastPosition;   //尾位置
    private int positionCount = 0;  //位置計數 
    [Header("設置多遠距離記錄一個位置")]
    public float distanceOfPositions = 0.01f;
    private bool firstMouseDown = false;    //第一次鼠標點擊
    private bool mouseDown = false;     //鼠標點擊 
    PolygonCollider2D polygonCollider;   //添加多邊形碰撞 
    void Start()
    {
        polygonCollider = gameObject.GetComponent<PolygonCollider2D>();
    } 
    void Update()
    { 
        //鼠標點擊的時候
        if (Input.GetMouseButtonDown(0))
        {
            polygonCollider.enabled = true;
            lineRenderer.positionCount = 20;
            firstMouseDown = true;
            mouseDown = true;
        }
        if (Input.GetMouseButtonUp(0))
        {
            mouseDown = false;
 
            //ClearColliderAndLineRenderer();
        }
        OnDrawLine();
        firstMouseDown = false;
    } 
    //畫線
    private void OnDrawLine()
    {
        if (firstMouseDown == true)
        {
            positionCount = 0;
            //頭坐標
            headPosition = Camera.main.ScreenToViewportPoint(Input.mousePosition + new Vector3(0, 0, 11));
            lastPosition = headPosition;
        } 
        if (mouseDown == true)
        {
            headPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition + new Vector3(0, 0, 11));
            //判斷頭坐標到尾坐標的距離是否大於記錄點位
            if (Vector3.Distance(headPosition, lastPosition) > distanceOfPositions)
            {
                //用於保存位置
                SavePosition(headPosition);
                positionCount++;
            }
            lastPosition = headPosition;
        } 
        //設置線性渲染器的位置
        SetLineRendererPosition(mouseTrackPositions);
    } 
    //保存位置
    private void SavePosition(Vector3 pos)
    {
        pos.z = 0;
        if (positionCount <= 19)
        {
            for (int i = positionCount; i < 20; i++)
            {
                mouseTrackPositions[i] = pos;
            }
        }
        else
        {
            for (int i = 0; i < 19; i++)
            {
                mouseTrackPositions[i] = mouseTrackPositions[i + 1];
            }
        }
        mouseTrackPositions[19] = pos;
 
        //創建碰撞路徑
        List<Vector2> colliderPath = GetColliderPath(mouseTrackPositions);
        polygonCollider.SetPath(0, colliderPath.ToArray());
    } 
    //計算碰撞體輪廓
    float colliderWidth;
    List<Vector2> pointList2 = new List<Vector2>();
    List<Vector2> GetColliderPath(Vector3[] pointList3)
    {
        //碰撞體寬度
        colliderWidth = lineRenderer.startWidth;
        //Vector3轉Vector2
        pointList2.Clear();
        for (int i = 0; i < pointList3.Length; i++)
        {
            pointList2.Add(pointList3[i]);
        } 
        //碰撞體輪廓點位
        List<Vector2> edgePointList = new List<Vector2>();
        //以LineRenderer的點位為中心, 沿法線方向與法線反方向各偏移一定距離, 形成一個閉合且不交叉的折線
        for (int j = 1; j < pointList2.Count; j++)
        {
            //當前點指向前一點的向量
            Vector2 distanceVector = pointList2[j - 1] - pointList2[j];
            //法線向量
            Vector3 crossVector = Vector3.Cross(distanceVector, Vector3.forward);
            //標準化, 單位向量
            Vector2 offectVector = crossVector.normalized;
            //沿法線方向與法線反方向各偏移一定距離
            Vector2 up = pointList2[j - 1] + 0.5f * colliderWidth * offectVector;
            Vector2 down = pointList2[j - 1] - 0.5f * colliderWidth * offectVector;
            //分別加到List的首位和末尾, 保證List中的點位可以圍成一個閉合且不交叉的折線
            edgePointList.Insert(0, down);
            edgePointList.Add(up);
            //加入最後一點
            if (j == pointList2.Count - 1)
            {
                up = pointList2[j] + 0.5f * colliderWidth * offectVector;
                down = pointList2[j] - 0.5f * colliderWidth * offectVector;
                edgePointList.Insert(0, down);
                edgePointList.Add(up);
            }
        }
        //返回點位
        return edgePointList;
    } 
    //設置線條渲染器位置
    private void SetLineRendererPosition(Vector3[] position)
    {
        lineRenderer.SetPositions(position);
    } 
    //用於清除碰撞和線性渲染
    void ClearColliderAndLineRenderer()
    {
        if (polygonCollider)
        {
            polygonCollider.enabled = false;
        }
        lineRenderer.positionCount = 0;
    } 
}

效果圖:

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。

推薦閱讀:

    None Found