IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> unity简单复刻无敌破坏王 -> 正文阅读

[游戏开发]unity简单复刻无敌破坏王

使用unity简单复刻无敌破坏王总结

国庆突发奇想想简单复刻一下无敌破坏王,这里写一些总结,希望也能对大家有帮助

游戏截图:

在这里插入图片描述

基本思路:

时间有限,也只是简单复刻,所以只实现破坏方块的功能,画面算是广义上的2.5D游戏吧。

素材的准备:

这里主要说一下建筑裂纹的生成:使用PS的拼贴滤镜可以有类似效果

人物代码:

  • 移动部分是参考了油管上的一个YouTubers,但是不记得是谁了,总体上是参考的蔚蓝吧

  • 移动:

    • x轴上的移动:

      •         if (Input.GetAxisRaw("Horizontal") > 0)
                {
                    rb.velocity = new Vector3(Mathf.SmoothDamp(rb.velocity.x, WalkSpeed * Time.fixedDeltaTime * 60, ref velocityX, AccelerateTime), rb.velocity.y, 0);
                    //WalkSpeed为设置的基础速度,AccelerateTime为加速速率,引入AccelerateTime与DecelerateTime是为了让移动显得更加自然
                    sr.flipX = true;
                    anim.SetBool("flip", true);
                }
                else if (Input.GetAxisRaw("Horizontal") < 0)
                {
                    rb.velocity = new Vector3(Mathf.SmoothDamp(rb.velocity.x, WalkSpeed * Time.fixedDeltaTime * 60 * (-1), ref velocityX, AccelerateTime), rb.velocity.y, 0);
                    sr.flipX = false;
                    anim.SetBool("flip", false);
                }
                else
                {
                    rb.velocity = new Vector3(Mathf.SmoothDamp(rb.velocity.x, 0, ref velocityX, DecelerateTime), rb.velocity.y, rb.velocity.z);
                }
        

跳跃:

  • 为了使得跳跃的手感更加好也更加符合我们的直观感受,所以在跳跃的时候调整重力,即跳跃上升的时候减小部分重力,下降的时候加大部分重力

  • 平地跳跃:

            //重力调整, FallMultiplier与LowJumpMultiplier都是自己声明的变量
            if (rb.velocity.y < 0)
            {
                rb.velocity += Vector3.up * Physics2D.gravity.y * (FallMultiplier - 1) * Time.fixedDeltaTime;
            }
            else if (rb.velocity.y > 0 && Input.GetAxis("Jump") != 1)
            {
                rb.velocity += Vector3.up * Physics2D.gravity.y * (LowJumpMultiplier - 1) * Time.fixedDeltaTime;
            }
    
  • 墙面跳跃:

    • 当人物处于攀爬状态跳跃时,我们给人物一个反方向斜向上的速度,并且在极端时间内禁止玩家操控,这样也能优化手感并且更复合人的直观感受
    • 判断方向:
      • 推荐单独写一个接受方向的函数
      • 也可以直接判断Sprite的翻转或者判断接触的是左墙还是右墙

碰撞检测:

  • 碰撞检测方式多样,人物与地面墙面的碰撞检测我是直接用的射线检测。
    • 射线检测传送门:https://blog.csdn.net/paradox_l/article/details/120688209
    • 攻击的碰撞检测:使用相交球检测

鼠标检测:

  • 使用一个bool变量MouseDown来判断鼠标是否按下,按下为true,松开为false

  • 点按与长按的检测,当MouseDown为true时开始计时,当大于某一个值时为长按

  •     //鼠标检测
        void mouseDetection()
        {
            if(Input.GetMouseButtonDown(0))
            {
                mouseDown = true;
                mouseUp = false;
                hitCount++;
                /*hitCount的引入是为了记录上一次攻击状态,使得攻击动画播放连贯
                比如玩家鼠标单击一次后,角色出左拳,下一次玩家单击时则根据hitCount播放出右拳的动画
                */
            }
            if(Input.GetMouseButtonUp(0))
            {
                mouseUp = true;
                mouseDown = false;
            }
            if(mouseDown)
            {
                //click_time用于计时
                click_time += Time.deltaTime;
            }
            else
            {
                click_time = 0;
            }
            longPress =(click_time > 0.3f)? true: false;
        }
    

可破坏方块的代码:

  • 游戏中有可产生裂纹的黑色方块,无裂纹的彩色方块,我这里就只是粗略的写了可破坏类,两者可以做为子类继承于可破坏类。

  • 我想到的物体破坏的几种思路:

    • unity有自带的破碎插件如Fracturing & Destruction
    • 可以在达到一定的条件后销毁原物体并且在原物体位置生成一个已经切割好的物体(我是使用的这种方法)
    • 可以直接修改网格点的坐标来实现改变形状的效果
  • 物体破坏后力的添加:

    • unity有添加爆炸力的函数
    • 也可以直接用碰撞体的重叠来达到类似的效果
  • 物体材质的改变来模拟裂纹:

    • //继承于可破坏类的黑色方块
      	public Texture t1;
          public Texture t2;
      
          // Update is called once per frame
          public new void Update()
          {
              if(i == 1)
              {
              //re为renderer,已经在父类中获取
                  re.material.mainTexture = t1;
              }
              if(i > 1)
              {
                  re.material.mainTexture = t2;
              }
              if(i>3)
              {
                  Instantiate(obj, transform.position, transform.rotation);
                  Destroy(gameObject);
              }
          }
      

    场景效果:

    • 镜头抖动与镜头跟随都是直接由Cinemachine实现
    • 背景霓虹灯效的偷懒实现:当物体重叠时会产生z-fighting的现象…
    • 2D sprite应用3D光照:https://www.youtube.com/watch?v=flu2PNRUAso&t=1s
      • shader已上传GitHub

在这里插入图片描述

游戏与代码下载

itch.io :https://craftx.itch.io/wrick-it

github:https://github.com/craft-l/Unity_project

ps:项目所用背景图片来源于武汉插画师@[小鱼JohnStone]

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-10-12 23:48:06  更:2021-10-12 23:49:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/28 2:26:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码