实现效果如下:

本工程已上传到GitHub,感兴趣的同学可自行下载学习。
GitHub地址:https://github.com/linxinfa/UnityPhysicsDrawLine

物理画线的核心就是:物理+画线。

物理:
想要有物理特性,最简单的做法就是挂碰撞体(Collider)和刚体(Rigidbody)组件。
画线:
可以使用LineRenderer组件来实现画线功能。

1、创建物体挂组件

创建一个空物体,重命名为Line,挂上EdgeCollider2D、Rigidbody2D和LineRenderer组件。

2、设置组件参数

设置一下LineRenderer组件的参数。
Position:坐标点;
Width:线宽度;
Color:线颜色(支持渐变);
Corner Vertices:拐弯处的顶点数量(让拐弯圆滑一点);
End Cap Vertices:线段头尾的顶点数量(让线段头尾圆滑一点);
Use World Space:是否使用世界坐标(不要勾选);
Materias:材质球。

设置一下EdgeCollider2D组件的参数。
Edge Radius:边界碰撞体的半径。
Points:边界碰撞体的坐标点(要与LineRenderer的点一致)。

边界碰撞体设置完之后效果如下:

最后是Rigidbody2D组件的参数。主要是Gravity Scale:重力缩放值;这个值越大,物体受到的重力越大,掉落的加速度就越大。
加粗样式

3、运行测试

为了模拟掉落到地上的效果,我们加个地面。

运行测试效果如下:

4、结论

理论存在,实践验证成功。那么,接下来就是如何使用代码来实现鼠标画线了,关键的点就是把鼠标的坐标设置为线的点。

两个脚本,一个Line.cs负责线段的绘制,一个LinesDrawer.cs负责检测鼠标和生成线段与点。

1、Line.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;/// <summary>
/// 线脚本
/// </summary>
public class Line : MonoBehaviour
{public LineRenderer lineRenderer;public EdgeCollider2D edgeCollider;public Rigidbody2D rigidBody;/// <summary>/// 点数组/// </summary>[HideInInspector] public List<Vector2> points = new List<Vector2>();[HideInInspector] public int pointCount = 0;/// <summary>/// 画线过程中点与点的最小距离/// </summary>float pointsMinDistance = 0.1f;float circleColliderRadius;/// <summary>/// 添加点/// </summary>/// <param name="newPoint"></param>public void AddPoint(Vector2 newPoint){if (pointCount >= 1 && Vector2.Distance(newPoint, GetLastPoint()) < pointsMinDistance)return;points.Add(newPoint);++pointCount;// 添加圆形碰撞var circleCollider = this.gameObject.AddComponent<CircleCollider2D>();circleCollider.offset = newPoint;circleCollider.radius = circleColliderRadius;// Line RendererlineRenderer.positionCount = pointCount;lineRenderer.SetPosition(pointCount - 1, newPoint);// 边界碰撞体的点if (pointCount > 1)edgeCollider.points = points.ToArray();}/// <summary>/// 获取最后一个点/// </summary>/// <returns></returns>public Vector2 GetLastPoint(){return lineRenderer.GetPosition(pointCount - 1);}/// <summary>/// 是否启用物理特性/// </summary>public void UsePhysics(bool usePhysics){rigidBody.isKinematic = !usePhysics;}/// <summary>/// 设置线颜色/// </summary>/// <param name="colorGradient"></param>public void SetLineColor(Gradient colorGradient){lineRenderer.colorGradient = colorGradient;}/// <summary>/// 设置画线的点与点之间的最小距离/// </summary>/// <param name="distance"></param>public void SetPointsMinDistance(float distance){pointsMinDistance = distance;}/// <summary>/// 设置线宽度/// </summary>/// <param name="width"></param>public void SetLineWidth(float width){lineRenderer.startWidth = width;lineRenderer.endWidth = width;circleColliderRadius = width / 2f;edgeCollider.edgeRadius = circleColliderRadius;}
}

2、LinesDrawer.cs

using UnityEngine;/// <summary>
/// 画线控制器
/// </summary>
public class LinesDrawer : MonoBehaviour
{public GameObject linePrefab;public LayerMask cantDrawOverLayer;int cantDrawOverLayerIndex;[Space(30)]public Gradient lineColor;public float linePointsMinDistance;public float lineWidth;Line currentLine;Camera cam;private void Start(){cam = Camera.main;cantDrawOverLayerIndex = LayerMask.NameToLayer("CantDrawOver");}private void Update(){if (Input.GetMouseButtonDown(0))BeginDraw();if (null != currentLine)Draw();if (Input.GetMouseButtonUp(0))EndDraw();}// 画线逻辑-----------------------------------------------------------------------// 开始画线void BeginDraw(){// 实例化线预设currentLine = Instantiate(linePrefab, this.transform).GetComponent<Line>();// 设置参数currentLine.UsePhysics(false);currentLine.SetLineColor(lineColor);currentLine.SetPointsMinDistance(linePointsMinDistance);currentLine.SetLineWidth(lineWidth);}// 画线进行中void Draw(){var pos = cam.ScreenToWorldPoint(Input.mousePosition);// 防止线与线之间交叉RaycastHit2D hit = Physics2D.CircleCast(pos, lineWidth / 3f, Vector2.zero, 1f, cantDrawOverLayer);if (hit)EndDraw();elsecurrentLine.AddPoint(pos);}// 画线结束void EndDraw(){if (null == currentLine) return;if (currentLine.pointCount < 2){Destroy(currentLine.gameObject);}else{currentLine.gameObject.layer = cantDrawOverLayerIndex;currentLine.UsePhysics(true);currentLine = null;}}
}

将原来的Line保存为预设,并挂上Line脚本,赋值对应的变量。

添加一个Layer:CantDrawOver,目的是防止画线的时候线与线交叉(也可以防止线与其他被标记为CantDrawOver层的物体交叉)。

在场景中创建一个空物体,重命名为LineDrawer,并挂上LineDrawer脚本,赋值对应的参数。

六、最终运行效果

TapTap物理画线游戏,使用Unity实现2D物理画线功能相关推荐

  1. 【游戏开发实战】TapTap物理画线游戏,教你使用Unity实现2D物理画线功能,看到我为你画的彩虹了吗

    文章目录 一.前言 二.思考 三.验证我们的思考 1.创建物体挂组件 2.设置组件参数 3.运行测试 4.结论 四.撸起袖子写代码 1.Line.cs 2.LinesDrawer.cs 五.场景 六. ...

  2. python 物理引擎 摩擦力_参赛作品2-phenom的2D物理引擎

    全球图形学领域教育的领先者.自研引擎的倡导者.底层技术研究领域的技术公开者,东汉书院在致力于使得更多人群具备内核级竞争力的道路上,将带给小伙伴们更多的公开技术教学和视频,感谢一路以来有你的支持.我们正 ...

  3. Unity Physics2D 2d物理引擎游戏 笔记

    2d 材质 里面可以设置 摩擦力 和 弹力 Simulated:是否在当前的物理环境中模拟,取消勾选该框类似于Disable Rigidbody,但使用这个参数更加高效,因为Disable会销毁内部产 ...

  4. Unity 使用LineRenderer做画线游戏

    前段时间公司要求做一款画线游戏,经历了许多坑之后,最终确定使用LineRenderer来做,然后又是一系列的坑,好在最后还是做出来了,给大家分享下代码: using System.Collection ...

  5. 【游戏开发创新】Unity+人工智能,让小朋友的画成真,六一儿童节一起来画猫猫吧(Unity | 人工智能 | 绘图 | 爬虫 | 猫妖)

    文章目录 一.前言 二.一起来画猫猫 三.爬虫,无穷只猫 四.猫猫作品展 五.Unity制作讲解 1.界面素材 2.UGUI制作界面 3.分辨率适配 4.如何检测鼠标事件 5.世界坐标转局部坐标 6. ...

  6. Unity 3D游戏六:打飞碟物理引擎

    文章目录 前言 游戏要求 游戏分析 游戏实现 总结 选做题:打靶游戏 前言 中山大学数据科学与计算机学院3D游戏课程学习记录博客. 游戏代码: gitee 游戏视频: bilibili 参考师兄的博客 ...

  7. 基于Unity的2D小游戏 SpeedDown 开发笔记(学习bilibili@[M_Studio]的教学视频

    基于Unity的2D小游戏 SpeedDown 开发笔记(学习bilibili@M_Studio的教学视频) 主要内容:在Sunnyland游戏的设计基础上,新增了物理组件Joint系列.DrawGi ...

  8. Unity简单2D游戏开发

    Unity简单2D游戏开发 前言: 近日比较无聊,在b站找了一个up主,跟着他的教程来做游戏--开发一个简单的2D游戏 用 Tilemap 绘制场景 新建一个2D项目,在Unity Asset Sto ...

  9. 2022-05-01 Unity核心3——2D物理系统

    文章目录 一.刚体 Rigid Body 2D 二.碰撞器 Collider 2D 三.物理材质 Material 2D 四.恒定力 Constant Force 2D 五.2D 效应器 Effect ...

最新文章

  1. 如何在Mac OSX Yosemite中将Ruby版本2.0.0更新到最新版本?
  2. Python3.5 Day1作业:实现用户密码登录,输错三次锁定。
  3. Floating-point exception
  4. 微信红包的支撑架构原理是什么?
  5. final,finally,finaliz的区别(Java)
  6. Oracle创建表,并添加默认值和备注
  7. PCM设备E1保护切换功能介绍
  8. html文件下的flag,推荐一个SAM文件中flag含义解释工具
  9. 项目私活 【抢小米手机软件】可以做的朋友,可以联系社区
  10. CKeditor的几种配置方式
  11. MapReduce的map流程
  12. ESP32-CAM 摄像头学习
  13. 兔子进洞算法_下兔子洞:一个varnishreload错误的故事-第1部分
  14. 实现财务自由的十大步骤
  15. 等保中级测评师复习大纲2019版
  16. 2022广东省安全员A证第三批(主要负责人)特种作业证考试题库及模拟考试
  17. 从概念到代码在6个小时内:交付我的第一个Windows Phone应用
  18. 苹果手机怎么更换微信视频铃声
  19. 基于GPT-4的免费代码生成工具
  20. SpringMVC总结-SpringMVC的运行流程以及简单运用

热门文章

  1. python 中/ 与 //的作用、用法
  2. ubuntu安装postfix+esmtp验证配置
  3. 曾经写过得太监小说4《无名》
  4. OneDrivet账号怎么解封
  5. Flutter 视频播放器组件封装
  6. cplex小白感悟—前言
  7. MATLAB轻松绘制地图路线——已知及未知坐标下的处理方法(1)
  8. 快速幂算法和大整数求模
  9. 会声会影2022永久免费版新手小白必备视频剪辑工具
  10. matlab 图形绘制,MatLab图形绘制功能