Unity3d LineRenderer画线

1、  画多条线

画多条线需要在场景中放置多个GameObject,因为一个GameObject只能添加一个LineRenderer Component。

2、  线段样式

线段的样式由LineRenderer组件的材质控制

3、  坐标系

LineRenderer使用了2种坐标系:World和Location。在设置目标点的时候需要注意你使用的坐标系是哪一种。

Location:

复制代码

transform.LookAt(rh.point); //GameObject始终面对目标点
lineRenderer = (LineRenderer)gameObject.GetComponent ("LineRenderer"); lineRenderer.useWorldSpace=false; lineRenderer.SetWidth(0.1f,0.1f);     Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); if(Physics.Raycast(ray,out rh)){           lineRenderer.SetPosition(0, Vector3.forward*rh.distance);//方向*距离,典型的Location坐标系用法         }
复制代码

World:

复制代码
void Start () {
        gameObject.SetActive(false);
        lr = gameObject.GetComponent(typeof(LineRenderer)) as LineRenderer;            
        lr.SetWidth(0.1f,0.1f);
    }
    
    // Update is called once per frame
    void Update () {    
        if(Input.GetMouseButtonUp(0)){
            
            //Get click position
            Ray ray = Camera.mainCamera.ScreenPointToRay(Input.mousePosition);
            lr.SetVertexCount(lineSeg+1);
            if(Physics.Raycast(ray,out rh)){                
                pointPos.Add(DrawLine(rh));
            }            
        }
        
        if(Input.GetMouseButtonUp(1)){
            //destroy point
            DestroyLine();
        }
        
        
    }
    
    
    GameObject DrawLine(RaycastHit pointPos){

                //Display point
                GameObject gb_pointer = GameObject.Instantiate(pointer) as GameObject;
                gb_pointer.transform.position =pointPos.point + (transform.position - pointPos.point) * 0.01f; 
                gb_pointer.transform.rotation = Quaternion.LookRotation (pointPos.normal, Camera.mainCamera.transform.up);
                Vector3 laserpos = new Vector3();
                laserpos.x= 90.0f;
                laserpos.y= gb_pointer.transform.position.y;
                laserpos.z= gb_pointer.transform.position.z;
                gb_pointer.transform.eulerAngles = laserpos;
                lr.SetPosition(lineSeg,pointPos.point);   //设置目标点的坐标,使用的是world坐标系
                lineSeg++;
                return gb_pointer;
    }
    
    void DestroyLine(){
    
        int arrayLength = pointPos.Count;
        if(arrayLength > 0){
            GameObject.Destroy(pointPos[arrayLength-1]);
            pointPos.RemoveAt(arrayLength-1);        
            lr.SetVertexCount(--lineSeg);
        }
    }
复制代码

 

 

posted @   星尘  阅读(34734)  评论(3编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示