在Unity中通过动态画线来实现碰撞(2D)

之前在很多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;

        }

    }

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容