当前位置: 首页 > news >正文

宝安第一网站微软云怎么做网站

宝安第一网站,微软云怎么做网站,微信红包封面分销平台,做娱乐网站的意义目的前言 hi~ 大家好#xff01;欢迎大家来到我的全新unity学习记录系列。现在我想在2d横板游戏中#xff0c;实现一个角色的初始状态-闲置状态、移动状态、空中状态。并且是利用状态机进行实现的。 本系列是跟着视频教程走的#xff0c;所写也是作者个人的学习记录笔记。如有错…前言 hi~ 大家好欢迎大家来到我的全新unity学习记录系列。现在我想在2d横板游戏中实现一个角色的初始状态-闲置状态、移动状态、空中状态。并且是利用状态机进行实现的。 本系列是跟着视频教程走的所写也是作者个人的学习记录笔记。如有错误请联系我指正 观看教程链接https://www.udemy.com/course/2d-rpg-alexdev/ 教程游戏资源链接https://pan.baidu.com/s/1IlUbYlUB0LP0dQfQPkvjZA  提取码0721 目录 一、Unity和资源准备 二、状态机创建和Debug测试 1.有限状态机描述 2.有限状态机编码基础 三、动画控制器和动画组件 三、玩家初始状态制作 1.玩家闲置和移动状态的切换 2.玩家整体的翻转 3.玩家在地面状态和跳跃状态的切换 碰撞检测 4.玩家实现二段跳 一、Unity和资源准备 下载Unity制定好程序编辑器创建2D项目进入unity编辑器界面。我使用的版本2022.3.2f1c1 如上图所示如果没有Console组件程序控制台、Animation动画控制、动画组件如下图展示打开路径。 然后将我们的游戏资源导入游戏的美术资源如下图 导入成功后我们可以开始准备制作游戏了。 二、状态机创建和Debug测试 1.有限状态机描述 我一开始就提到了状态机。这里的状态机指的是unity中的有限状态机我们将使用它来控制接下来角色状态的转换。 我们从角色状态来具体到有限状态机有什么作用。 闲置状态、移动状态、跳跃状态。角色初始为闲置状态我们通过键盘上的a和d键切换角色的状态变为移动状态在闲置和移动状态地面状态中可以通过space切换角色为跳跃状态并且在第一段跳跃状态中可以切换为二段跳。 可以看到角色的状态有一个初始的状态并且我们可以随时的进行切换状态切换状态是存在条件的。并且一个状态实际上存在开始、执行、结束起始中间、结束的过程那么切换状态时均需要实现这些过程。 切换状态过程我可以以跳跃距离比如我们从闲置状态切换到跳跃状态跳跃状态的初始过程就需要我们给予一个向上的速度持续过程中不需要。 上述描述的其实就是有限状态机。做的就是将有限的一些状态通过条件决定切换。可以发现通过这个我们实际上就可以完成每个状态的独立。可以想象如果不存在状态机那么我们在编写角色状态切换时就需要同时考虑到其他状态的情况比如攻击时不可移动等那么随着新的状态加入我们需要自己写的限制条件就会越来越多导致编码困难。 2.有限状态机编码基础 回到我们的当前游戏上。有限状态机要完成的是状态的切换我们需要两个组件状态机StateMachine和对应的状态类型PlayerState。另外我们需要unity中的组件对他们进行一个调用此组件就是Player玩家组件Player。 括号中就是我们需要进行的C#编程文件。C#是一种面向对象语言接下来我们实现状态机的过程很多就是用的面向对象的思想类、继承、多态。 [Assets-Script] 首先说明一下编码的目的和基本过程我们需要通过Player来获取游戏对象的组件并且能够在游戏开始时通过其Unity脚本达成每帧调用MonoBehaviour。而我们的状态并不需要继承MonoBehaviour类也就不会参与到游戏的调用中顺便也节约了资源。另外状态机设置初始阶段和切换状态注意其中的三个过程开始、中间、结束。而Player状态则表示我们操作的角色所有状态的父类它不继承任何类状态机也是可以通过多态操作让角色状态做一些共同的事情比如随时检测玩家的Xspeed水平方向的输入这也是多态的目的。最后在Player中完成对这些状态对象的创建通过状态机在update中完成对某一状态的随帧调用然后在具体的状态中检测条件完成切换。 实际上有时候状态的切换此状态可能时一些状态的集合比如闲置和移动状态它们都是在地面上地面上随时可以进行跳跃。通过继承和多态我们可以随便完成这些集合切换的要求多态-子类对象调用重写的方法时会执行父类的被重写函数方法 利用下面一张图解释上面的说法 我们首先创建角色的闲置、移动状态PlayerState的子类在Player中完成基础的调用。代码如下 PlayerState using System.Collections; using System.Collections.Generic; using UnityEngine;public class PlayerSate {protected Player player; // 方便调用游戏中获取的资源protected StateMachine stateMachine; // 游戏状态机实现状态的切换protected string stateBoolName; // 状态名字 - 和后面游戏对象的动画机组件相关public PlayerSate(Player _player, StateMachine _stateMachine, string _stateBoolName){player _player;stateMachine _stateMachine;stateBoolName _stateBoolName;}// 开始状态public virtual void Enter(){}// 中间状态public virtual void Update(){}// 退出状态public virtual void Exit(){} }StateMachine using System.Collections; using System.Collections.Generic; using UnityEngine;public class StateMachine {public PlayerSate currentState { get; private set; } // 想让外界访问但是不允许修改// 初始状态public void Initialize(PlayerSate _startState){currentState _startState;currentState.Enter(); // 启动开始阶段}// 转换状态public void ChangeState(PlayerSate _newState){currentState.Exit(); // 前一个状态先退出currentState _newState;currentState.Enter(); // 执行开始阶段}}Player  using System.Collections; using System.Collections.Generic; using UnityEngine;public class Player : MonoBehaviour {#region Componentprivate StateMachine stateMachine;#endregion#region State // C#语法可以整理段落public PlayerIdleState idleState { get; private set; } // 后续在状态中可能会调用到但是不希望被修改public PlayerMoveState moveState { get; private set; }#endregion// 初始化变量private void Awake(){stateMachine new StateMachine();idleState new PlayerIdleState(this, stateMachine, Idle);moveState new PlayerMoveState(this, stateMachine, Move);}void Start(){stateMachine.Initialize(idleState); // 一开始为闲置状态}void Update(){stateMachine.currentState.Update(); // 多态调用 父类对象调用重写方法实现同种类型展示出不同的效果}}然后我们在Unity层次界面内创建空对象将Player脚本挂接上去。这样游戏加载时就能加载Player脚本代码。点击游戏窗口敲f键时观察代码控制台查看状态的切换。 注意红色标注按此时控制台显示的重复信息会显示成数字置于消息框右下角避免刷屏。 另外在脚本编辑过程中子类生成虚函数和构造函数时点击选中当前类名alt enter键可以快速构造 可以看到此时我们的脚本已经可以完成基础的转换的演示那么我们让它实际运行起来展示对玩家基础状态的演示。 三、动画控制器和动画组件 在正式制作之前先介绍一下Unity内的动画组件。窗口的创建先前布局时已经说过其中Animator就是动画控制器在这里可以制作动画切换条件动画顺序等。那么在动画控制之前我们还需要一段一段的动画通过Animation进行控制将美术资源中的动画一张一张连续播放出来。 我们在美术资源中找到角色精灵图 在此精灵图中实际上已经都切分好了这里简单介绍一下如何切分精灵图的本质是由一张一张的图组合而成到Unity中进行切分而已 模式中我们选中Multiple多个模式选择图片编辑器Sprite Editor进行编辑 在如何切分中我们可以选择三种进行切分看好如何切分这也和美术资源整理时相关尽量每张子图一致Point表示这张图的支点有时图片不一致时利用此存在对齐的效果。切分好后按apply进行应用。 应用完后Pixels Per Unit表示单位像素数在此可以设计图片大小...... 我们将其中一张闲置图片拖到场景界面上此时Unity会为我们默认创建一个对象命名为Animator将其挂载在Player对象下成为子对象调整子对象的距离将我们父对象的中心点对号角色对象的中心点。 为Animator组件添加 Animator组件其就是动画控制的组件另外此对象为空我们需要在文件中进行创建不同的动画控制对象以便不同的对象控制不同的状态动画。 上图为创建玩家控制器的过程可以利用文件夹进行分类 将对象托拽到玩家子对象Animator组件Animator上去在选择此对象的状态的条件下查看动画控制窗口Animator就可以看到如下图 这个就很容易看出和我们的状态机对应的关系但是存在一个任意状态。也就是说在没有状态机的条件下我们也可以进行创作角色状态转换只不过互相之间的制约需要玩家自己控制非常麻烦。 最后在看一下某一段动画编辑。选中玩家动画控制器的情况下点击下图中的Create就可以创建一段动画序列。 将角色一段闲置动画序列拖进此窗口在此窗口的右边三小点上选择Show Sample Rate来控制动画的播放速度。 可以像上图那样观察角色动画状态。 移动类似创建。这样在动画控制窗口我们可以创建条件来决定动画状态的切换了。其中右键角色状态选择make transition创建动画过渡连线在右边窗口的Animation的创建条件因为状态机的切换与Player组件挂钩使用通用的Bool所以创建两个条件Idle和Move作为切换条件。点击连线选择条件切换控制前后两端动画的退出状态和过度状态这里两个切换我们均不设置退出时间和转换持续时间。 就这样对动画序列和动画控制的基本了解到此结束需要更详细的了解请前去学习。 三、玩家初始状态制作 首先我们需要在player玩家脚本上获取角色的动画控制组件以便设置条件为true控制动画的播放每次在切换或者初始状态的时对条件进行控制公共操作在父类上进行。另外我们需要我们的角色拥有重力所以需要Unity中的组件Rigidbody 2D对玩家进行基本的物理控制。所以对Player注意获取的组件还存在子类的组件脚本和PlayerState脚本的修改如下 player PlayerState 设置玩家物理控制组件的基本状态 禁止Z轴旋转这和我们重力下降相关同时需要调整参数插值和重力检测为连续。因为重力元素作用到碰撞器上后角色由于形状因素由于是2D平面导致z轴旋转让其倒下 然后创建一个简单平台增加角色和平台的碰撞器存在碰撞器才能发生碰撞以及检测。需要注意碰撞器的类型和2D状态。效果如下 初始状态研究完毕开始游戏我们就会看到玩家角色掉落并且不会发生图片z轴翻转。 1.玩家闲置和移动状态的切换 动画序列和动画控制我们在之前的步骤已经完成现在我们只需要在脚本里进行控制即可实现此状态的切换。 由于状态机初始状态就是闲置状态一开始我们角色就应该播出闲置动画。在闲置的动画状态类里由于此时状态是此在游戏对象的随帧Update调用中当我们检测到玩家按下了a和d键Unity中存在Horizontal对AD的检测使用方法GetAxis进行检测即可时应该从闲置状态切换到移动状态。但是即然存在移动我们就需要方向上的确定获取的ad状态存在方向由于多种状态需要此值可以设计xSpeed检测方向于PlayerState上。 移动状态需要进行移动我们通过Player脚本获取其脚本进行速度位移。但是速度位移的很多状态下都需要进行控制我们将其方法设计到Player下形参传递x和y方向上的速度即可。初始和中间过程均需要维持速度。当检测到xSpeed为0时移动状态应该转换为闲置状态并且闲置状态的速度应该为0所以在闲置状态的开始状态速度设置为0。 由于我们需要能够在Unity中自由控制玩家的速度在Player声明空开变量MoveSpeed来控制角色位移速度。  脚本编写 Player PlayerState PlayerIdleState  PlayerMoveState 我们试着运行一下 可以看到我们实现了角色闲置状态和移动状态的切换。但是此时发现一个bug角色图片只有向右的动画没有向左的动画需要重写制作动画设置条件吗并不需要我们利用脚本就可以控制。  2.玩家整体的翻转 我们是不是只需要角色在往左移动的时候将角色整体向左翻转即可 那么我们只需要控制角色方向切换移动时能够进行控制翻转而我们输入的xSpeed正好可以管控角色输入的方向。但是需要注意翻转时比如x0向左翻转但是必须控制当前情况需要为向右的状态如果本来是向左的状态那么翻转就失败了。 控制是否左右的变量我们设置在PlayerisRight bool并且为了之后的碰撞检测线的翻转问题我们留下positionDir指定玩家-1为左移动1为右移动。初始均为右移动。因为翻转是随时的并且在改变速度时才可翻转那么我们设置在Player上的意义又多了一个。将Dir设置为公开isRight设置为私有并且为true。start时检测外界是否修改修改需要设置对应false。这样翻转才正确。 Player 修改上述文件即可我们查看效果即可。  3.玩家在地面状态和跳跃状态的切换 在之前的状态机中我们已经谈过我们处于地面状态时移动和闲置均可以进行跳跃。利用类与对象基础的关系我们床在移动和闲置类的父类玩家状态类的子类由此地面类进行控制玩家从地面状态到跳跃状态的切换。 跳跃状态在一开始需要一个向上的速度我们需要空开jump跳跃数据进行控制。但是跳跃状态存在两种动画向上跳动画向下跳动画。那么我们如何控制这两种动画的切换呢 首先通过动画序列创建向上跳和向下跳的动画序列之前的资源进行寻找。然后在动画控制界面我们做一点不一样的事情此时条件变成了一个float数从1到-1.我们通过创建混合树的方式控制角色在空中时的状态 然后玩家跳跃后在PlayerState可为其添加角色下落速度方向为其修改整个空中状态。 因为此时为状态树模式我们控制的状态在同一时刻存在一种状态所以常见的无限跳bug也解决了但是玩家落地的时候如何判定为落地状态呢能只是简单的判断y方向上为0吗比如玩家滑行模式中flyy方向速度为0不应该为闲置状态我们需要的是碰撞检测。 碰撞检测 我们需要实现一个地面碰撞检测为了方便后续我们同步实现墙体检测滑墙和登墙跳操作。 地面检测我们通过Unity的Physics2D中的Raycast向量检测进行。此函数能够在空间中确定一个从起点到上、下、左、右方向的距离的一个向量并且可指定layerMask层级蒙版来检测特定的layer当此向量检测到存在对应的碰撞体时就会返回相应个数实际我们只需要知道碰撞到即可 墙面检测类似。那么我们想要将其形象化的表示出来才能进行更好的调节参数。表示出来我们可以使用Gizmos中的DrawLine功能就能进行绘画向量由起始和终点位置决定。并且为了更好的进行调节实现起点位置的GameObject可以公开出去这样我们可以自由决定检测的起始位置。 另外你是否存在这种想法玩家跳跃时表明一个状态即可墙体检测IsGroundCheck随时在update。是的如果只是维持一个文件表明此跳跃空中状态的化由于初始给予向上速度和IsGroundCheck可能重叠导致跳跃失败的情况出现。可自行测试 综上我们的设计思路如下分成两个文件表示跳跃的上跳和下跳也和之后的实现相关 代码整理 首先文件确定如下 PlayerAirState文件表示空中状态为PlayerJumpState和PlayerFallState的父类能执行一些共同的事情比如update检测YDir空中能随时的确定x速度和方向后续的多段跳功能。JumpState表示上跳过程Enter给予向上的速度Player脚本设计JumpSpeed确定数值。update只需检测如果玩家刚体速度小于0进行切换到下落状态。FallState表示下落过程注意Update检测是否地面碰撞。分开的主要原因错开初始向上速度和地面检测重叠一起导致跳跃失败 Player文件new上述状态并且提供Draw方法和向量检测暴露一些属性决定位置和数值大小。 Player PlayerAirState using System.Collections; using System.Collections.Generic; using UnityEngine;public class PlayerAirState : PlayerState {public PlayerAirState(Player _player, StateMachine _stateMachine, string _stateBoolName) : base(_player, _stateMachine, _stateBoolName){}public override void Enter(){base.Enter();}public override void Exit(){base.Exit();}public override void Update(){base.Update();player.SetVelocity(xDir * player.moveSpeed, player.rb.velocity.y);// 随时控制跳跃的上跳和下跃状态player.animator.SetFloat(YDir, player.rb.velocity.y);} }PlayerJumpState using System.Collections; using System.Collections.Generic; using UnityEngine;public class PlayerJumpState : PlayerAirState {public PlayerJumpState(Player _player, StateMachine _stateMachine, string _stateBoolName) : base(_player, _stateMachine, _stateBoolName){}public override void Enter(){base.Enter();// 初始给玩家一个向上跳的动作player.SetVelocity(player.rb.velocity.x, player.jumpSeed);}public override void Exit(){base.Exit();}public override void Update(){base.Update();if (player.rb.velocity.y 0) stateMachine.ChangeState(player.fallState);} }PlayerFallState using System.Collections; using System.Collections.Generic; using UnityEngine;public class PlayerFallState : PlayerAirState {public PlayerFallState(Player _player, StateMachine _stateMachine, string _stateBoolName) : base(_player, _stateMachine, _stateBoolName){}public override void Enter(){base.Enter();}public override void Exit(){base.Exit();}public override void Update(){base.Update();// 地面检测如果碰撞到了地面转换为闲置状态if (player.IsGroundCheck()) stateMachine.ChangeState(player.idleState);} }Player中地面和墙体检测表现效果 4.玩家实现二段跳 那么我们要实现二段跳如何实现设想一下是不是我们只要能在跳跃状态中在检测一下空格键转换为跳跃状态是否就能实现多段跳功能 但是只是上述那个条件就可以造成无限跳了。为了限制为2段跳我们不妨设计一个计数器记录为2个每往上跳一次--落地时恢复为2在空中状态中按下空格键时检测计数器是否0即可。那么此计数器必须在状态切换时始终唯一所以该变量就设在Player中去Jump文件控制--Fall文件确定恢复。双段跳就可以简单的实现出来了 Player PlayerAirState PlayerJumpState PlayerFallState 实际效果
http://www.hkea.cn/news/14390301/

相关文章:

  • 沈阳做网站哪家公司好国外饮品网站
  • 网站服务器有问题怎么办啊汕头高端网站建设方法
  • 网站搜索排名优化怎么做医疗网站建设比较好的
  • 网站制作窍门商铺装修
  • 常州网站建设招聘邵阳市今天新闻
  • iis如何做网站管理器低价网站建设顺德
  • 河北省网络科技网站百度竞价排名是什么
  • 天津企业网络建站网络规划设计师大纲
  • 建立门户网站荣昌集团网站建设
  • 杭州网页模板建站wordpress页面显示文章列表
  • 网站开发国内外现状研究php空间放多个网站
  • 做茶叶网站的素材seo优化排名易下拉技巧
  • 物流系统规划课程建设网站连云港市网站建设
  • 佛山网站建设科技公司网站的360快照怎么做
  • cps网站建设网站未备案做经营被罚款
  • 建设银行征信中心个人信用查询官方网站深圳泰安建设公司怎么样
  • 网站申请支付宝接口wordpress 多标签
  • 小工厂怎么做网站flash网站开发教程
  • 网页网站建设的ppt模板下载免费影视网站建设
  • 网站程序和空间区别合肥网站维护
  • 做商城网站要哪些流程图网站做快照怎么做
  • 电子商务网站开发报价网页美工设计教案
  • 美食网站建设的功能中国宁波网天一论坛
  • 南昌自助建站php商场网站开发经验
  • 九讯鹿网站建设企业营销策划案例分析
  • 西安博威建设工程有限公司招聘网站兼职设计师平台
  • 前端网站建设和维护做旅游网站毕业设计
  • 手机 网站 尺寸电脑网络连接不上怎么解决
  • 简约大气的网站商城网站开发项目文档
  • 哪些网站的活动策划做的好卖鞋做哪个网站好