【游戏开发实战】Unity实现水果忍者切水果的刀痕效果教程(两种实现方式:TrailRenderer、LineRenderer)

news/2024/12/2 17:01:56/

文章目录

      • 一、前言
      • 二、资源准备
      • 三、制作材质球
      • 四、背景图
      • 五、刀痕的实现,方式一:TrailRenderer
        • 1、创建物体挂TrailRenderer组件
        • 2、编写TrailRendererBehaviour脚本
        • 3、运行测试
      • 六、刀痕的实现,方式二:LineRenderer
        • 1、创建物体挂LineRenderer组件
        • 2、编写LineRendererBehaviour脚本
        • 3、运行测试

一、前言

嗨,大家好,我是新发,相信很多人都玩过水果忍者,在屏幕上滑手指头切水果,效果如下:
在这里插入图片描述
这个手指头滑来滑去的刀痕效果,如果使用Unity如何实现呢?
今天我就来讲讲两种实现方式:
方式一:TrailRenderer
方式二:LineRenderer
最终两种方式的效果如下。
TrailRenderer方式的效果 LineRenderer方式的效果
Demo工程我已上传到GitHub,感兴趣的同学可以自行下载学习(注:我使用的Unity版本为:2019.4.17f1c1
GitHub地址:https://github.com/linxinfa/UnityLineRendererAndTrailRendererDemo
在这里插入图片描述

二、资源准备

先把必要的资源导入到Unity工程中。一张背景图、两张刀痕素材图。
(注:两种刀痕素材图会分别用作用于下文中要说的TrailRendererLineRenderer)。
请添加图片描述 请添加图片描述 在这里插入图片描述
如下,
在这里插入图片描述
注意图片设置勾选Alpha Is Transparency
在这里插入图片描述

三、制作材质球

创建三个材质球:bgtrailtrail_2
其中bg材质球使用的shaderUnlit/Texture
在这里插入图片描述
trailtrail_2材质球使用的shaderMobile/Particles/Additive
在这里插入图片描述

四、背景图

先在场景中创建一个平面,赋值bg材质球,这样背景的显示就完成了。
在这里插入图片描述

五、刀痕的实现,方式一:TrailRenderer

TrailRenderer组件可以很方便地实现一个拖尾效果,我们只需控制所挂的物体的移动即可出现拖尾效果。

1、创建物体挂TrailRenderer组件

首先,在场景中创建一个空物体,重命名为trailrenderer
在这里插入图片描述
挂上TrailRenderer组件。并设置一下各个参数:
Width:线段宽度;
Time:线段持续时间;
Min Vertex Distance:点与点之间的最小距离;
Color:线段颜色;
Texture Mode:线段贴图填充模式;
Materials:材质球;
在这里插入图片描述

2、编写TrailRendererBehaviour脚本

接着就是使用脚本来获取鼠标的位置并控制物体的移动。
创建一个脚本:TrailRendererBehaviour,挂到物体上,
在这里插入图片描述
代码如下:

// TrailRendererBehaviour.csusing UnityEngine;public class TrailRendererBehaviour : MonoBehaviour
{public TrailRenderer trailrenderer;Transform mSelfTrans;/// <summary>/// 线段的z轴坐标/// </summary>const float LINE_POS_Z = 10;void Awake(){mSelfTrans = transform;}void Update(){if(Input.GetMouseButtonDown(0)){// 停止划线,防止坐标瞬移导致出现一个拖尾trailrenderer.emitting = false;var mousPos = Input.mousePosition;mSelfTrans.position = Camera.main.ScreenToWorldPoint(new Vector3(mousPos.x, mousPos.y, LINE_POS_Z));return;}if(Input.GetMouseButton(0)){trailrenderer.emitting = true;var mousPos = Input.mousePosition;mSelfTrans.position = Camera.main.ScreenToWorldPoint(new Vector3(mousPos.x, mousPos.y, LINE_POS_Z));}}
}

3、运行测试

运行Unity,测试效果如下:
在这里插入图片描述

六、刀痕的实现,方式二:LineRenderer

LineRenderer组件可以很方便地实现划线功能,不过,不像TrailRenderer那样可以自动根据物体移动划出拖尾痕迹,需要我们自己去计算划痕的每个点的坐标并赋值给LineRenderer的点。

1、创建物体挂LineRenderer组件

首先,创建一个空物体,重命名为linerenderer
在这里插入图片描述
挂上LineRenderer组件,并设置PositionsSize10,即:我们使用10个点来画线。
在这里插入图片描述
记得设置一下材质球:
在这里插入图片描述

2、编写LineRendererBehaviour脚本

创建一个LineRendererBehaviour脚本,挂到物体上。
在这里插入图片描述
我们在LineRendererBehaviour脚本中去获取鼠标移动的位置并设置给LineRenderer组件的各个点的坐标。
代码如下,基本我都写了清晰的注释,大家应该能看懂。

// LineRendererBehaviour.cs
using UnityEngine;public class LineRendererBehaviour : MonoBehaviour
{public LineRenderer linerenderer;/// <summary>/// 线段的z轴坐标/// </summary>const float LINE_POS_Z = 10;/// <summary>/// 线段的点的数量/// </summary>const int LINE_POS_CNT = 10;/// <summary>/// 坐标点的数组/// </summary>Vector3[] mLinePosList = new Vector3[LINE_POS_CNT];/// <summary>/// 鼠标的屏幕坐标/// </summary>Vector3 mMouseScreenPos;/// <summary>/// 是否是按下/// </summary>bool mFire = false;/// <summary>/// 上一次是否是按下/// </summary>bool mFirePre = false;/// <summary>/// 是否是刚按下/// </summary>bool mFireDown = false;/// <summary>/// 是否是抬起/// </summary>bool mFireUp = false;/// <summary>/// 坐标的起始和终止坐标点/// </summary>Vector2 mStart, mEnd;/// <summary>/// 坐标点索引/// </summary>int mLinePosIndex = 0;/// <summary>/// 线段的alpha通道值/// </summary>float mTrailAlpha = 0f;void Update(){// 鼠标的位置mMouseScreenPos = Input.mousePosition;mFireDown = false;mFireUp = false;mFire = Input.GetMouseButton(0);if (mFire && !mFirePre) mFireDown = true;if (!mFire && mFirePre) mFireUp = true;mFirePre = mFire;// 画线DrawLine();// 设置线段颜色,主要是设置alpha值,慢慢变淡SetLineColor();}void SetLineColor(){if (mTrailAlpha > 0){// 黄色linerenderer.startColor = new Color(1, 1, 0, mTrailAlpha);// 红色linerenderer.endColor = new Color(1, 0, 0, mTrailAlpha);// 慢慢变透明mTrailAlpha -= Time.deltaTime * 2;}}/// <summary>/// 画线/// </summary>void DrawLine(){// 鼠标按下if (mFireDown){mStart = mMouseScreenPos;mEnd = mMouseScreenPos;mLinePosIndex = 0;mTrailAlpha = 1;AddTrailPoint();}// 鼠标滑动中if (mFire){mEnd = mMouseScreenPos;var pos1 = Camera.main.ScreenToWorldPoint(new Vector3(mStart.x, mStart.y, LINE_POS_Z));var pos2 = Camera.main.ScreenToWorldPoint(new Vector3(mEnd.x, mEnd.y, LINE_POS_Z));// 滑动距离超过0.1才算作一次有效的滑动if (Vector3.Distance(pos1, pos2) > 0.01f){mTrailAlpha = 1;++mLinePosIndex;// 添加坐标点到数组中AddTrailPoint();}mStart = mMouseScreenPos;}// 将坐标数组赋值给LineRenderer组件SetLineRendererPos();}/// <summary>/// 添加坐标点到数组中/// </summary>void AddTrailPoint(){if (mLinePosIndex < LINE_POS_CNT){for (int i = mLinePosIndex; i < LINE_POS_CNT; ++i){mLinePosList[i] = Camera.main.ScreenToWorldPoint(new Vector3(mEnd.x, mEnd.y, LINE_POS_Z));}}else{for (int i = 0; i < LINE_POS_CNT - 1; ++i){mLinePosList[i] = mLinePosList[i + 1];}mLinePosList[LINE_POS_CNT - 1] = Camera.main.ScreenToWorldPoint(new Vector3(mEnd.x, mEnd.y, LINE_POS_Z));}}/// <summary>/// 将坐标数组赋值给LineRenderer组件/// </summary>void SetLineRendererPos(){for (int i = 0; i < LINE_POS_CNT; ++i){linerenderer.SetPosition(i, mLinePosList[i]);}}
}

3、运行测试

运行Unity,测试效果如下:
在这里插入图片描述


http://www.ppmy.cn/news/911298.html

相关文章

android 水果忍者源码,Fruit Ninja(水果忍者)游戏源代码下载、分析(下)---可运行Android,Ios,Window,Mac,Html5平台...

背景&#xff1a; 这一篇是结尾篇&#xff0c;主要分析检测&#xff0c;游戏结束和保存最高分&#xff1b; ps&#xff1a; 1 CocosEditor已发布新版本&#xff0c;现在提供6个实战demo学习&#xff0c;包括flappy &#xff0c;popstar &#xff0c;fruitninja&#xff0c;moon…

水果忍者(数学 叉积)

水果忍者 题目 2010年风靡全球的“水果忍者”游戏&#xff0c;想必大家肯定都玩过吧&#xff1f;&#xff08;没玩过也没关系啦~&#xff09;在游戏当中&#xff0c;画面里会随机地弹射出一系列的水果与炸弹&#xff0c;玩家尽可能砍掉所有的水果而避免砍中炸弹&#xff0c;就…

付费水果忍者破解

前言 闲着无聊手机上下载了一款手机游戏玩玩&#xff0c;正在玩的时候突然弹出了付费对话框&#xff0c;刚开始我还纳闷怎么没广告&#xff0c;这么良心&#xff0c;原来是在这里等着呢&#xff0c;如下图&#xff1a; 作为一个逆向初学者突然有一股冲动&#xff0c;能不能…

7-45 水果忍者 (30 point(s))

2010年风靡全球的“水果忍者”游戏&#xff0c;想必大家肯定都玩过吧&#xff1f;&#xff08;没玩过也没关系啦~&#xff09;在游戏当中&#xff0c;画面里会随机地弹射出一系列的水果与炸弹&#xff0c;玩家尽可能砍掉所有的水果而避免砍中炸弹&#xff0c;就可以完成游戏规定…

L3_12水果忍者

这个题是一个思维题 首先看需求&#xff0c;找一个直线&#xff0c;能够成功割到所有垂直的直线&#xff0c;并输出这条直线上的任意两个整数点 所以我们应该先去找直线&#xff0c;然后再自己确定一个小规则&#xff0c;找到固定的点 这里我们选择了(a[i].x,a[i].miny)作为…

Python制作经典游戏案例-水果忍者(附源码等文件)

目录 前言代码展示总结 前言 大家好&#xff0c;我是辣条哥&#xff0c;今天给大家分享一款我以前特爱玩的游戏&#xff0c;水果大战&#xff0c;今天我就教大家使用python把这款游戏制作出来。我们先来看效果 点击跳转文末 相关的一些音乐文件&#xff0c;还有代码文件都在文…

PTA 水果忍者

7-15 水果忍者 &#xff08;30 分) 2010年风靡全球的“水果忍者”游戏&#xff0c;想必大家肯定都玩过吧&#xff1f;&#xff08;没玩过也没关系啦~&#xff09;在游戏当中&#xff0c;画面里会随机地弹射出一系列的水果与炸弹&#xff0c;玩家尽可能砍掉所有的水果而避免砍中…

L3-012 水果忍者

题目&#xff1a; 2010年风靡全球的“水果忍者”游戏&#xff0c;想必大家肯定都玩过吧&#xff1f;&#xff08;没玩过也没关系啦~&#xff09;在游戏当中&#xff0c;画面里会随机地弹射出一系列的水果与炸弹&#xff0c;玩家尽可能砍掉所有的水果而避免砍中炸弹&#xff0c…