记得以前玩过一个叫《物理画线》的游戏,当时觉得上面画出的线具有物理效果挺好玩的。今天心血来潮想实现一下这个画线的功能,于是在网上找实现的方法,但是相关的博客非常的少(基本上没找到,大多只是绘制线,没有物理效果),后来自己经过一段时间的尝试,算是基本实现了绘制具有物理效果的线的功能。
步骤
1. 创建一个2D的工程,创建一个空场景,并创建一个材质球,并设置颜色(即:线颜色)
注意:摄像机的Tag必须为MainCamera,并且Projection为Orthographic模式

2. 创建一个空物体,并添加BoxCollider组件
- 作用:作为地面,防止线条落到屏幕外面

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;
}
}
