之前在很多2D游戏中,发现有些小游戏可以通过手指动态在屏幕中绘制线来阻挡小球碰撞。好奇实现方法,所以自己学习了一下,效果还行。
参考链接:https://www.bilibili.com/video/BV1Et41177to?from=search&seid=6793552372166214965
主要用到的组件是Line Render、dege ColliderBox2D

1、具体实现逻辑是,通过获取手指在屏幕上的坐标并转换成世界坐标,赋值给LineRender组件来生成mesh线
2、将赋值给LineRender的点数据记录到List中,在绘制mesh线完成后。将数据全部赋值给degeColliderBox2D碰撞体
3、关于设置一些其他的参数startWidth 、endWidth 设置线宽
lr = newLine.GetComponent<LineRenderer>();
lr.startWidth = LineWidth;
lr.endWidth = LineWidth;
4、设置碰撞体大小的参数edgeRadius
edgeCollier.edgeRadius = LineWidth / 2;
下面是组件配置截图和代码,有兴趣的可以研究下。因为很简单,所以我说的比较笼统,如果你看不懂,可以看看我发的参考链接,那个是视频比较详细,一步步教你怎么做

源码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DrawColliderLine : MonoBehaviour
{
public GameObject line;
public GameObject Knob;
// 线宽
private const float LineWidth = 0.1f;
private LineRenderer lr;
private EdgeCollider2D edgeCollier;
private int index;
private Vector3 upPoint = Vector3.zero;
private List<Vector2> colliderPos = new List<Vector2>();
void Start()
{
}
void Update()
{
// 鼠标按下创建一条线的obj
if(Input.GetMouseButtonDown(0))
{
// 清理上一条线的是碰撞盒数据
colliderPos.Clear();
GameObject newLine = Instantiate(line, line.transform.position, Quaternion.identity).gameObject;
newLine.transform.SetParent(this.transform);
edgeCollier = newLine.GetComponent<EdgeCollider2D>();
lr = newLine.GetComponent<LineRenderer>();
lr.startWidth = LineWidth;
lr.endWidth = LineWidth;
index = 0;
}
// 鼠标按住不放,根据鼠标位置添加点位置
if (Input.GetMouseButton(0))
{
Vector3 point = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 1));
if (lr != null)
{
if(upPoint != point)
{
// 设置LineRender点数量和位置
index++;
lr.positionCount = index;
lr.SetPosition(index - 1, point);
// 记录需要碰撞的位置
colliderPos.Add(new Vector2(point.x, point.y));
upPoint = point;
}
}
}
// 鼠标抬起,结束画线,并根据数据生成碰撞盒
if (Input.GetMouseButtonUp(0))
{
// 设置LineRender点碰撞和位置
edgeCollier.points = colliderPos.ToArray();
edgeCollier.edgeRadius = LineWidth / 2;
Knob.GetComponent<Rigidbody2D>().gravityScale = 1f;
}
}
}