2021-9-4 爆肝一整天,关于2D横板游戏中攀爬楼梯的考虑

游戏 游戏 1812 人阅读 | 0 人回复

<
150346jrujt9knuqk0z1rk.jpg


昔日份闭于2D横板游戏中攀爬楼梯的思索



弁言

从前以为2D横板游戏建造起去很俭朴,却不知一个小小的行动便需求思索那么多要素。经由过程对那个小小的2D横版游戏的设想,我对那些开辟出好玩炫酷两全冲击脚感,不断揣摩进步游戏的机能及劣化的开辟者们的敬意情不自禁啊!!!
闭于攀爬楼梯思索

150347dc3oll858llazv8v.jpg

整体思索



  • 玩家正在梯子大将不克不及阁下挪动,不克不及腾跃
  • 增长梯子上的停止动绘,包管正在梯子上停止时没有会呈现本天攀爬的状况
玩家站正在1处



  • 按下s键,仍应播放下蹲行动,而没有是攀爬下降行动,无横曲标的目的受力
  • 按下w键,播放攀爬上降行动,受力背上
玩家站正在2处



  • 按下w键,没有播放攀爬上降动绘,无横曲标的目的受力
  • 按下s键, 播放攀爬下降动绘,受力背下
玩家经由过程腾跃去到3处



  • 按下w键,播放攀爬上降动绘,受力背上
  • 按下s键,播放攀爬下降动绘,受力背下
1处降至3处 战 2处降至3处



  • 临时出念到有甚么可思索的
3处降至2处



  • 截至播放攀爬上降动绘,播放站坐动绘
  • 没有影响腾跃(检测盒子检测到的没有再是空中)
  • 下蹲无效
  • 抵达桥的极点后,桥上是能够站坐的
3处降至1处



  • 截至播放攀爬下降动绘,播放站坐动绘
  • 没有影响腾跃(检测盒子检测到再次变成空中)
  • 没有影响下蹲
其他思索



  • 抵达梯子甚么处所能够攀爬,假如太宽,大要会呈现出有借助梯子而是悬空攀爬的状况
  • 被进犯便会失落降
打点计划及代码

状况极端庞大,颠末今日一成天的调试,我才成功得完成我关于攀爬的各类需供。
动绘前提

150347c4714zhp8xp8tfgg.jpg



  • 很较着,我将腾跃取下落分隔,然后又将背上攀爬,背下攀爬,截至攀爬分隔。
  • 原来连线依旧较为俭朴的,由于将转换形态工夫设置为0,为经由过程不断调试,发明多条连线尽管没有需求转换工夫,但假如出有间接连通的线,仍会呈现很多分歧常理的bug。比方到梯子顶部仍没法完毕攀爬动绘的状况。因而,颠末不断调试,我增长了许多连线。
打点代码(非完整代码)

本人入手敲一敲哦,便会发明那此中依旧很消耗脑细胞的。
起首是一些设置

  1.     [Header("空中检测盒子的下度")]
  2.     public float BoxHeight = 0.2f;
  3.     [Header("空中检测层")]
  4.     public LayerMask groundMask;
  5.     [Header("桥检测层")]
  6.     public LayerMask bridgeMask;
  7.     [Header("攀爬速率")]
  8.     public float ClimbSpeed = 10.0f;
  9.     private bool isOnLadder = false; // 能否正在梯子上
  10.     private bool isClimb = false; // 能否正正在攀爬
  11.     [HideInInspector]
  12.     public bool bridgeBottom = false; // 能否正在梯子底
  13.     [HideInInspector]
  14.     public bool bridgeTop = false; // 能否正在梯子顶
  15.     private Animator _animator;
  16.     private Rigidbody2D _rigidbody2D;
  17.     private Collider2D _collider2D;
  18.     private Collider2D BridgeCollider;
  19.     private Vector2 playersize; // 玩家巨细
  20.     private Vector2 boxsize; // 检测盒子尺微暇
  21.     // 一切形态参数的id界说
  22.     #region
  23.     private int id_run;
  24.     private int id_jump;
  25.     private int id_fall;
  26.     private int id_climbup;
  27.     private int id_climbdown;
  28.     private int id_onladder;
  29.     private int id_bridgebottom;
  30.     private int id_bridgetop;
  31.     private int id_crouch;
  32.     private int id_hurt;
  33.     #endregion
复造代码
初初化

  1.     void Awake()
  2.     {
  3.         _animator = GetComponent<Animator>();
  4.         _rigidbody2D = GetComponent<Rigidbody2D>();
  5.         _collider2D = GetComponent<Collider2D>();
  6.         playersize = GetComponent<SpriteRenderer>().bounds.size;
  7.         boxsize = new Vector2(playersize.x * 0.3f, BoxHeight);  // 设置检测盒的巨细
  8.         healthscontroller = GameObject.FindGameObjectWithTag("healths").GetComponent<HealthsController>();
  9.         BridgeCollider = GameObject.FindGameObjectWithTag("bridgetop").GetComponent<Collider2D>();
  10.         // 一切形态参数转为其id,进步机能
  11.         #region
  12.         id_run = Animator.StringToHash("run");
  13.         id_jump = Animator.StringToHash("jump");
  14.         id_fall = Animator.StringToHash("fall");
  15.         id_climbup = Animator.StringToHash("climbup");
  16.         id_climbdown = Animator.StringToHash("climbdown");
  17.         id_onladder = Animator.StringToHash("onladder");
  18.         id_bridgebottom = Animator.StringToHash("bridgebottom");
  19.         id_bridgetop = Animator.StringToHash("bridgetop");
  20.         id_crouch = Animator.StringToHash("crouch");
  21.         id_hurt = Animator.StringToHash("hurt");
  22.         #endregion
  23.     }
复造代码
然后,重面去了,各种状况阐发

  1.     // Update is called once per frame
  2.     void Update()
  3.     {
  4.         // 判定能否抵达梯子顶
  5.         #region
  6.         if (bridgeTop)
  7.         {
  8.             isClimb = false;
  9.             _animator.SetBool(id_bridgetop, true);
  10.         }
  11.         else
  12.         {
  13.             _animator.SetBool(id_bridgetop, false);
  14.         }
  15.         #endregion
  16.         // 判定能否抵达梯子底
  17.         #region
  18.         if (bridgeBottom)
  19.         {
  20.             isClimb = false;
  21.             _animator.SetBool(id_bridgebottom, true);
  22.         }
  23.         else
  24.         {
  25.             _animator.SetBool(id_bridgebottom, false);
  26.         }
  27.         #endregion
  28.     }
  29.     private void FixedUpdate()
  30.     {
  31.         // 判定正在空中上则下跌截至
  32.         if (IsOnGround())
  33.         {
  34.             StopFall();
  35.             _animator.SetBool(id_climbdown, false);
  36.             _animator.SetBool(id_bridgebottom, true);
  37.         }
  38.                
  39.                 // 判定正在梯子顶部
  40.         if (IsOnBridge())
  41.         {
  42.             StopFall();
  43.             bridgeTop = true;
  44.             BridgeCollider.isTrigger = false; // 氛围墙能否有碰碰
  45.             _animator.SetBool(id_climbup, false);
  46.             _animator.SetBool(id_crouch, false);
  47.         }
  48.         else
  49.         {
  50.             bridgeTop = false;
  51.         }
复造代码
最主要的几面阐发(前提时正在梯子范畴内乱)


  • 正在梯子底部按下w键,施行背上攀爬
  • 正在梯子顶部按下s键,施行背下攀爬
  • 没有正在梯子顶部按下w键,施行背上攀爬
  • 没有正在梯子底部按下s键,施行背下攀爬
  • 按下w大概s键后抬起,施行截至攀爬
  1.         // 攀爬楼梯相干
  2.         if (isOnLadder)
  3.         {
  4.             _animator.SetBool(id_onladder, true);
  5.             1.if (Input.GetButton("Climb") && bridgeBottom)
  6.             {
  7.                 ClimbUp();
  8.             }
  9.             2.else if(Input.GetButton("Crouch") && bridgeTop)
  10.             {
  11.                 BridgeCollider.isTrigger = true;
  12.                 ClimbDown();
  13.             }
  14.             3.else if (Input.GetButton("Climb") && !bridgeTop)
  15.             {
  16.                 ClimbUp();
  17.             }
  18.             4.else if (Input.GetButton("Crouch") && !bridgeBottom)
  19.             {
  20.                 ClimbDown();
  21.             }
  22.             5.if (Input.GetButtonUp("Climb") || Input.GetButtonUp("Crouch"))
  23.             {
  24.                 StopClimb();
  25.             }
  26.         }
  27.         else
  28.         {
  29.             _animator.SetBool(id_onladder, false);
  30.             BridgeCollider.isTrigger = true;
  31.         }
  32.     }
复造代码
两个检测函数

  1.    // 操纵检测盒子检测人物能否正在空中上
  2.    private bool IsOnGround()
  3.    {
  4.        Vector2 boxcenter = (Vector2)transform.position + (Vector2.down * playersize.y * 0.5f);
  5.        return Physics2D.OverlapBox(boxcenter, boxsize, 0, groundMask);
  6.    }
  7. // 操纵检测盒子检测人物能否正在梯子顶部
  8.    private bool IsOnBridge()
  9.    {
  10.        Vector2 boxcenter = (Vector2)transform.position + (Vector2.down * playersize.y * 0.5f);
  11.        return Physics2D.OverlapBox(boxcenter, boxsize, 0, bridgeMask);
  12.    }
复造代码
思索梯子上的受力状况

正在梯子上停止的话该当是没有动的,因而,要将重力倍数设置为0
[code]    ///     /// 改动上降下落重力巨细的函数,可让人物出有飘飘的觉得,提拔玩家体验    ///     private void BetterJump()    {        if (_rigidbody2D.velocity.y > 0 && !isClimb)        {            _rigidbody2D.gravityScale = JumpUpGravity;        }        else if (_rigidbody2D.velocity.y <span class="token operator">
1、本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,按照目前互联网开放的原则,我们将在不通知作者的情况下,转载文章;如果原文明确注明“禁止转载”,我们一定不会转载。如果我们转载的文章不符合作者的版权声明或者作者不想让我们转载您的文章的话,请发帖留言提供原创证明,我们将积极配合您!
2、本网站转载文章仅为传播更多信息之目的,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何损失或损害承担责任。
3、任何透过本网站网页而链接及得到的资讯、产品及服务,本网站概不负责,亦不负任何法律责任。
4、本网站所刊发、转载的文章,其版权均归原作者所有,如其他媒体、网站或个人从本网下载使用,请在转载有关文章时务必尊重该文章的著作权,保留本网注明的“稿件来源”,并自负版权等法律责任。
回复

使用道具 举报

 
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则