unity实战之无敌破坏王

爱上游戏开发

共 1855字,需浏览 4分钟

 ·

2021-10-16 13:58

作者: paradox_l

来源: https://blog.csdn.net/paradox_l/article/details/120688273

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

游戏截图

基本思路

时间有限,也只是简单复刻,所以只实现破坏方块的功能,画面算是广义上的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的翻转或者判断接触的是左墙还是右墙
  • 当人物处于攀爬状态跳跃时,我们给人物一个反方向斜向上的速度,并且在极端时间内禁止玩家操控,这样也能优化手感并且更复合人的直观感受
  • 判断方向:
  • 推荐单独写一个接受方向的函数

  • 也可以直接判断Sprite的翻转或者判断接触的是左墙还是右墙

碰撞检测

  • 碰撞检测方式多样,人物与地面墙面的碰撞检测我是直接用的射线检测。

    • 射线检测传送门:https://blog.csdn.net/paradox_l/article/details/120688209
    • 攻击的碰撞检测:使用相交球检测

鼠标检测

  • 使用一个bool变量MouseDown来判断鼠标是否按下,按下为true,松开为false
  • 点按与长按的检测,当MouseDown为true时开始计时,当大于某一个值时为长按

微信搜索公众号 [爱上游戏开发],回复 “资料”,免费领取 200G 学习资料!

//鼠标检测
   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)? truefalse;
   }

可破坏方块的代码

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

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

    • 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);
        }
    }

场景效果

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

游戏与代码下载

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

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

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

-- END --


公众号后台回复「资料」获取超多学习福利

>>> 点击进入技术讨论群 <<<
▽想深入了解么?

长按/扫码关注我吧↑↑↑


觉得不错就点个在看

浏览 43
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报