Blink

纸上得来终觉浅,绝知此事要躬行

Unity:使用LineRenderer绘制具有物理效果的线

记得以前玩过一个叫《物理画线》的游戏,当时觉得上面画出的线具有物理效果挺好玩的。今天心血来潮想实现一下这个画线的功能,于是在网上找实现的方法,但是相关的博客非常的少(基本上没找到,大多只是绘制线,没有物理效果),后来自己经过一段时间的尝试,算是基本实现了绘制具有物理效果的线的功能。

步骤

1. 创建一个2D的工程,创建一个空场景,并创建一个材质球,并设置颜色(即:线颜色)

注意:摄像机的Tag必须为MainCamera,并且Projection为Orthographic模式

《Unity:使用LineRenderer绘制具有物理效果的线》

2. 创建一个空物体,并添加BoxCollider组件

  • 作用:作为地面,防止线条落到屏幕外面
    《Unity:使用LineRenderer绘制具有物理效果的线》

3. 编写脚本

注意:添加LineRenderer组件时,要将LineRenderer组件的useWorldSpace设置为false

line.useWorldSpace = false;
如果不设置为false,LineRenderer不会随着GameObject下落

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DrawLine : MonoBehaviour
{
    [SerializeField]
    private float lineWidth = 0.1f; // 线的宽度
    [SerializeField]
    private Material material;// 线的颜色材质球
    private LineRenderer line;// 绘制的线
    private int count = 0;// 线上点的个数
    private List<Vector2> posList = new List<Vector2>(); // 所有点的位置

    private void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            StartDraw();
        }

        if (Input.GetMouseButton(0))
        {
            Drawing();
        }

        if (Input.GetMouseButtonUp(0))
        {
            EndDraw();
        }
    }

    // 开始绘制
    private void StartDraw()
    {
        // 开始绘制前重置上一次绘制的数据
        posList.Clear();
        count = 0;
        // 创建一个空物体并添加LineRenderer组件
        GameObject lineGo = new GameObject("Line");
        line = lineGo.AddComponent<LineRenderer>();
        // 设置LineRenderer的材质
        line.material = material;
        // 设置LineRenderer的开始和结束的宽度
        line.startWidth = line.endWidth = lineWidth;
        // 重点:设置lineRenderer不使用世界空间,如果设置为true,lineRenderer不会受到所在GameObject的位置影响
        line.useWorldSpace = false;
    }

    // 绘制中
    private void Drawing()
    {
        count++;
        line.positionCount = count;
        Vector2 v = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 0));
        line.SetPosition(count - 1, v);
        posList.Add(v);
    }

    // 结束绘制
    private void EndDraw()
    {
        // 添加边缘碰撞器,并设置点和边缘半径
        EdgeCollider2D col = line.gameObject.AddComponent<EdgeCollider2D>();
        col.points = posList.ToArray();
        col.edgeRadius = 0.05f;
        // 添加刚体
        Rigidbody2D rig = line.gameObject.AddComponent<Rigidbody2D>();
        rig.useAutoMass = true;
        rig.collisionDetectionMode = CollisionDetectionMode2D.Continuous;
    }
}

效果

《Unity:使用LineRenderer绘制具有物理效果的线》

点赞

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注