相关文章推荐
千杯不醉的小刀  ·  小米再战短视频,推出“嘻瓜皮”App搞笑社区 ...·  8 月前    · 
可爱的领带  ·  android中关于 ...·  1 年前    · 
千年单身的充电器  ·  Will azur map is ...·  1 年前    · 
乐观的红豆  ·  Makefile : contains ...·  1 年前    · 
腼腆的红茶  ·  Java中枚举类型Enum的一种使用方式_5 ...·  1 年前    · 
Code  ›  【游戏开发实战】Unity实现水果忍者切水果的刀痕效果教程(两种 ...
unity
https://blog.csdn.net/linxinfa/article/details/114367076
迷茫的皮带
1 年前
      • 一、前言
      • 二、资源准备
      • 三、制作材质球
      • 四、背景图
      • 五、刀痕的实现,方式一: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 工程中。一张背景图、两张刀痕素材图。
        (注:两种刀痕素材图会分别用作用于下文中要说的 TrailRenderer 和 LineRenderer )。
        请添加图片描述 请添加图片描述 在这里插入图片描述
        如下,
        在这里插入图片描述
        注意图片设置勾选 Alpha Is Transparency 。
        在这里插入图片描述

        三、制作材质球

        创建三个材质球: bg 、 trail 、 trail_2 。
        其中 bg 材质球使用的 shader 为 Unlit/Texture 。
        在这里插入图片描述
        trail 和 trail_2 材质球使用的 shader 为 Mobile/Particles/Additive 。
        在这里插入图片描述

        四、背景图

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

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

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

        1、创建物体挂TrailRenderer组件

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

        2、编写TrailRendererBehaviour脚本

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

        // TrailRendererBehaviour.cs
        using 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组件,并设置Positions的Size为10,即:我们使用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));
                    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,测试效果如下:
        在这里插入图片描述

        Unity作为游戏开发平台之一,还是有很多实用的小技巧的,今天来学习一下怎样用两种方式来显示切水果游戏中的刀痕: 1.正常显示下的刀痕: 什么叫正常显示下的呢?我们所接触过的切水果游戏一般都是2D游戏,那我们知道,2D游戏可以用Unity直接来做,还可以使用NGUI、UGUI或者其他方法通过UI来实现。 所以我们第一种方法就是不借助UI来做。 首先来看看我们刀痕的素材:(需要的同学可以右键另 unity水果忍者制作 这几天学了一下切水果游戏的手游制作,大致了解操作运行过程,还在制作当中就先写一篇自己的思路吧; 首先收集和制作好ui素材,这些是一个项目开始的基石也是整个游戏最直观的东西,然后把收集来素材优化和规范命名并将一些水果和需要用到的ui图设置为预制体方便随时复制与调用(我用的都是网络教程里的已有素材资源); 接下来就是代码和ui界面的制作,由于只是练练手所以我只创建了两个场景,一个主页面场景和一个游戏场景。游戏代码的实施的话分为几个模块,一个是各类水果和陷阱奖品之类的预制体的复制调用以及被
 
推荐文章
千杯不醉的小刀  ·  小米再战短视频,推出“嘻瓜皮”App搞笑社区_腾讯新闻
8 月前
可爱的领带  ·  android中关于 button有三种状态的设置 enabled的设置_android button enable-CSDN博客
1 年前
千年单身的充电器  ·  Will azur map is supporting react-native? - Microsoft Q&A
1 年前
乐观的红豆  ·  Makefile : contains string - Stack Overflow
1 年前
腼腆的红茶  ·  Java中枚举类型Enum的一种使用方式_51CTO博客_java枚举类型enum用法
1 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号