5.3.4 制作背包界⾯
背包界⾯是此实例中的重点,因为它的屏幕适配⽐较有代表性。当屏幕⽐较“瘦⾼”时,道具列表中能显⽰更多道具项,⽽屏幕⽐较“矮胖”时,显⽰的道具项会变少。但这些都不影响玩家通过下拉滑动查看所有道具,如图5-37所⽰。
⾸先⽤⼀个Panel给整个道具框定位,由于窗⼝允许较⼤的伸缩幅度,因此可以采⽤让横向、纵向都拉伸的⽅式,如图5-38所⽰。
背包界⾯横向、纵向都采⽤伸缩⽅式,且距离上下左右都有⼀定距离。这样做出来的效果可适配范围会⾮常⼤。⼤体位置确定了,接下来道具列表的主体就是⼀个单独的ScrollView。由于已经做好了背包界⾯的整体定位,因此滚动区域作为⼦物体,只需要横向、纵向全拉伸,且距离上下左右都为0,就可以填满整个背包界⾯。
接下来制作每个单独的⼩道具项⽬。为简单起⻅,每个道具项只⽤1张底图、1个图标和1个⽂本组成,其中底图是⽗物体,图标和⽂本是底图的⼦物体。做好之后把整个物体作为prefab,未来使⽤时根据背包⾥的道具创建更多项⽬,并填到Scroll View中即可。
Scroll View的功能已经⽐较强⼤了,⽽且它的横向、纵向滚动条会⾃动隐藏。我们的主要⼯作就是把表⽰每⼀个道具的控件填在ScrollView⾥⾯。⽅法也很简单,就是把所有的内容都作为ScrollView/Viewport/Content的⼦物体,只要放在Content下,就会被⾃动识别
了。
在实际项⽬中,需要⽤脚本创建道具项⽬,同样也是将创建好的项⽬作为Content的⼦物体即可,如图5-39所⽰。
背包制作完成后,就可以运⾏游戏进⾏测试。测试的重点是调节Game窗⼝⼤⼩时观察屏幕适配效果是否合理,以及背包界⾯的滑动效果是否正确。
到这⾥考虑屏幕适配的游戏界⾯就基本制作完成了,下⼀⼩节将对⾎条等细节进⾏优化。
5.3.5 利⽤进度条制作⾎条
Unity提供的滑动条可以很⽅便地修改外形,因此改为⾎条也毫⽆问题,甚⾄还能做成环形、圆形,并加⼊扇形动画。
⾸先新建⼀个滑动条,将其拉伸⾄合适的⻓度和宽度。进度条⼤体都是⽤九宫格图⽚制作的,因此可以随意拉伸⽽不破坏其外形。作为⾎条时不需要滑动⼿柄,将⼦物体Handle Slide Area/Handle隐藏即可,不需要删除。
接下来⽤⿏标修改滑动条组件的Value,从左到右滑动,会发现到达最⼤值时,滑动条的外观没有全满。其修改⽅法是,将⼦物体FillArea的右边距改⼩⼀些,如把默认的15 改为5。这样⾎条就⼏乎做好了,接着修改颜⾊。只需找到⼦物体FillArea/Fill,然后修改其中的图⽚颜⾊即可。如果需要⽆底图⾎条,只需隐藏⼦物体Background即可。
当前的⾎条⽤的依然是默认素材,只是换了颜⾊。但它有⼀个缺点,由于九宫格图⽚不能⽆限缩⼩,因此值为0时填充的颜⾊不会完全消失。更好的⽅法是利⽤Unity的“Image Type: Filled(图⽚类型:填充)”这⼀功能,其关键思路如下。
01 修改整个滑动条的⼤⼩,让⻓宽基本符合准备的图⽚⽐例。
02 修改Background和Fill两张图⽚,必要时可以设置为保持⻓宽⽐。
03 Background图⽚保持Simple模式,⽽Fill图⽚则改为Filled(填充)模式,然后可以选择各种填充⽅法,横向、纵向、圆环等都可以,还可以进⼀步指定移动⽅向。
04 微调Fill Area物体的位置,让填充物与背景对⻬。此⽅法制作的⾎条不仅效果多样,对图⽚⼏乎也没有要求,如图5-
40所⽰,⽽且不存在值最⼤时不满,值最⼩时不空的情况,值得尝试。
第6章 脚本与动画系统
动画是游戏中最吸引⼈的元素之⼀,⼈们很容易被精美的动画、华丽的特效所吸引。不过从纯技术的⾓度来看,动画算是⼀个辅助性的系统。⼤部分游戏,特别是早期游戏,即便去掉所有动画,游戏依然能够正常运⾏。
不过,现代的⼀些动作游戏采⽤了逻辑与动画深度结合的设计⽅法。在这类游戏中,⼈物的跑步、⾛路和攻击等动作直接控制着⾓⾊的位置,这种技术被称为“Root Motion(根⾻骼动画)”。
现在Unity对2D动画、3D动画、帧动画和根⾻骼动画等类型均有较好的⽀持,本章会有所侧重地讲解它们。并且随着本章的学习,读者会发现在制作动画的过程中,脚本起到了联系逻辑与动画的作⽤,其地位⾄关重要。现代游戏应当具备⽣动、真实和流畅的动作,这对相关的编程技术也提出了挑战。
6.1 动画系统基本概念
动画的基本概念有帧、帧动画与2D/3D⾻骼动画等,现代游戏开发中还加⼊了动画融合、动画状态机等相关的概念。本节将对这些概念做总体的阐述。
6.1.1 动画的基本概念
1. 帧
在古代⼀幅字画叫⼀帧,⽽在计算机中,每次渲染完毕⼀幅画⾯并显⽰出来,这⼀幅图就是⼀帧。
连续切换的帧就形成了动态的画⾯。每秒刷新帧的次数称为帧率,单位是“FPS(Frames Per Second,帧/秒)”,也可以简称为“帧”。传统电影每秒显⽰24帧就可以保证良好的动态效果。由于游戏与电影显⽰原理的不同,游戏⾄少需要30帧才能感到流畅,⽽要保证良好的视觉体验则最好是能达到60帧。在电⼦竞技领域中,也会追求更⾼的帧率,以获得⽐赛中的优势。
作为⽤户当然希望帧率尽可能稳定,但在游戏运⾏过程中,设备不⼀定能维持稳定的帧率。当运算负载较⾼时,Unity就会降低画⾯和逻辑的更新次数。
⼩提⽰
帧间隔时间Time.deltaTimeUnity会记录每⼀帧开始时间与上⼀帧时间的差值,保存到Time.deltaTime属性中。开发者通过查询Time.deltaTime,就可以知道实际上当前帧相⽐前⼀帧过去了多少秒(实际时间),利⽤此时间可以对逻辑速度进⾏修正。在动画系统底层已经考虑了这种修正,让动画播放帧率与真实的时间流逝相匹配。
2. 帧动画
帧动画是最古⽼、也最容易理解的⼀种动画技术。它是事先准备好动画中的每⼀帧画⾯,然后依次播放,如图6-1所⽰。
传统⼿绘动画⽚将帧动画技术发展到了很⾼的⽔平,2D游戏也⾃然借⽤了这⼀技术,只不过将拍摄动画换成了计算机处理。帧动画⾄今活跃于许多卡通⻛格的游戏中,特别是“像素画”⻛格与帧动画是绝配,不仅⻛格讨巧,⽽且降低了美术⼯作量。
帧动画的优点:简单直接、技术门槛低,美术设计师在⼀定范围
内可以⾃由发挥。
帧动画的缺点:美术制作的⼯作量较⼤,占⽤的存储空间也较⼤(每⼀帧都需要完整保存),⽬前主要⽤于2D游戏。 3. 3D⾻骼动画
早期的3D动画是由设计师编辑模型各部分的位置、旋转等,直接制作出动作。这有点类似于橡⽪泥⼿⼯动画,要让⼈物⾛路就要不断调整头、⾝体、⼿臂和腿等各个部分的位置,这导致最初的3D动画⼯作量⼤,⽽且很难做出真实的⼈类动作。
随着技术的发展,出现了“⾻骼动画”这⼀技术。⾻骼动画的技术思想简单来说,是将⼈物模型与⼀个类似⽕柴棍组成的⾻架绑定在⼀起,每⼀段⽕柴棍(⾻骼)关联着模型的⼀部分,这样只需要移动和旋转⾻架,⼈物就会跟着做出各种动作了。“⾻骼动画”这⼀技术不仅节省了⼯作量,⽽且动作效果也变得更⾃然。三维模型的⾻骼如图6-2所⽰。
图6-2 在3D设计软件中绑定和调整⾻骼
另外,同⼀套⾻骼数据可以应⽤于体型相近的不同⾓⾊模型上,这样就可以批量地制作更多的⾓⾊。实践中甚⾄可以将⼀套⾻骼和动画适配到另⼀套不同的⾻骼模型上,这称为“重定向”。
Unity对3D动画、3D⾻骼动画均有较好的⽀持,如标准的FBX⽂件(⼀种常⽤的3D模型和动画⽂件格式)。
在Project窗⼝中选中FBX⽂件,可以在Inspector窗⼝内看到导⼊设置,导⼊设置具有Model(模型)、Rig(⾻骼绑定)、Animation(动画)和Materials(材质)4个选项,如图6-3所⽰。其中的Rig选项中,可以选择的动画类型为None(⽆⾻骼)、Legacy(旧版系统)、Generic(通⽤型)和Humanoid(⼈形),⽬前主要使⽤后两者。如果是⼈形⾻骼模型,则选择Humanoid选项,在其他情况下(没有⾻骼或不是⼈形⾓⾊)都可以选择Generic选项。Unity对常⽤的⼈形⾻骼有优
化,功能更多,使⽤也更⽅便。
⼩提⽰
⾻骼动画与第⼀部3D动画电影根据维基百科的相关资料,⾻骼动画技术最早于1988年被提
出。
世界上第⼀部纯粹的3D动画电影是《玩具总动员》(ToyStory,反⽃奇兵),于1995年上映。不过在它之前,也有⼀些影⽚和短⽚采⽤了3D动画技术。
4. 2D⾻骼动画
随着⾻骼动画的发展,⼈们发现2D动画其实也可以借⽤⾻骼动画技术。它的思路是,将2D⾓⾊⾝体的各个部分切割开,做成独⽴的图⽚,如头、胸、腹、臂和腿等,然后绑定⼀个2D的“⽕柴”组成的⾻骼,通过调整⾻骼,也可以让2D⾓⾊活灵活现地动起来,如图6-4所⽰。这种做法能够提⾼动画制作效率,同时也能提⾼资源利⽤率、显著节约存储空间。
⽬前Unity对2D⾻骼动画也有较好的⽀持,可以借助官⽅扩展包2DAnimation直接制作2D⾻骼动画,也可以使⽤更专业的2D⾻骼动画软件,如Spine和Dragonbones,借助相关插件导⼊Unity中使⽤。
6.1.2 动画融合
3D⾻骼动画和2D⾻骼动画都有⼀个共同的特点:动画被抽象化、数据化了,计算机能够表⽰帧与帧之间的联系,甚⾄能直接计算出两帧之间的过渡状态。动画设计师只需要指定⼀个动作中的关键⼏个帧(关键帧),其他的帧(过渡帧)可以利⽤数学算法进⾏插值计算(线性插值或其他插值算法)。
以此类推,不仅同⼀个动作的各个关键帧之间可以⾃动计算过渡帧,⽽且不同动作之间也可以计算过渡帧。再进⼀步,如果动画设计师提供了“慢⾛”和“疾跑”两个动作,甚⾄还可以通过插值计算出慢跑、中速跑等更多介于慢⾛和疾跑之间的动作。这种在不同动作之间⾃动计算过渡状态的技术称为“动画融合”。
Unity对动画融合有很好的⽀持,在动画状态机中有专⽤的融合树(Blend Tree),它⽀持⼀个或两个维度的动画融合。“两个维度”指的是两种运动⽅式,如常⽤的“转⾝”和“前进”就是两个维度,利⽤BlendTree可以混合出慢⾛并快速左转,或者快⾛并慢速右转等不计其数的动作。第6.4节会详细讲解Blend Tree技术。
注意,在帧动画中,动画的每⼀帧都是相对独⽴的。帧动画的数据没有抽象化、数据化,就不可能进⾏动画融合。因此,如果是采⽤帧动画技术制作的游戏,就不⽤考虑动画融合。
6.1.3 动画状态机
⽬前,⼏乎所有的Unity游戏在制作动画时都要⽤到动画状态机(Animator),动画状态机⽬前已经是游戏开发的标准配置。但是,作为Unity的学习者应当明⽩,理论上来说动画状态机并不
是必需的。特别是对采⽤帧动画制作的游戏来说,帧动画本质就是图⽚的切换,那么只要及时切换图⽚,⾃然就能正确播放动画。因此,⽤脚本直接修改图⽚也并⽆不可,不⼀定⾮要使⽤动画状态机。
只是在实际游戏开发中,利⽤动画状态机可以统⼀动画制作的思路,包括2D动画、3D动画、⾻骼动画和动画融合等。因此,Unity逐渐摒弃了其他的动画管理⽅法,⽽统⼀⽤动画状态机组件管理所有动画。
⼩知识
已经淘汰的Animation组件读者在某些资料中可能会看到Animation组件,它也可以指定物体的动画并播放。但是其功能过于单⼀,完全可以被Animator替代,因此现在⼏乎看不到它的⾝影了。
1. 理解动画状态机
要理解使⽤“动画状态机”的必要性,需要思考⼀个问题:假设有站⽴、下蹲、⾛/跑和跳跃4种动画,那如何编程来描述动画状态,以便在不同的动画之间切换?其初步思考结论如下。
①在地⾯上速度为0时,站⽴。这是默认动画。
②在站⽴状态下速度⼤于0,切换为⾛或跑的动画,根据移动速度改变帧切换速度。
③在站⽴状态下跳跃,切换为跳跃动画。
④在⾛/跑的状态下跳跃,也切换为跳跃动画。
⑤在跳跃状态下落地,切换为站⽴动画。如果速度不为0,站⽴动画会⽴即切换到⾛/跑动画。
⑥在站⽴状态下下蹲,切换为下蹲动画。
⑦在下蹲状态下站⽴,切换为站⽴动画。
以此类推,逐个分析清楚每⼀个动画状态及转移条件,就可以得出动画切换的思路。“思路”有⼀种明显的模式:当前处于某个状态,如果发⽣某件事,就切换到另⼀个状态。
这种思路在编程中极其有⽤,它有⼀个专门的名称——状态机(State Machine)。虽然本⽂是在动画系统中初次提到状态机,但实际上状态机的应⽤极为⼴泛,包括在游戏逻辑架构和AI系统中都经常能⽤到它。
状态机在任意时刻都具有⼀个“当前状态”,并且默认会保持这⼀状态,只有在满⾜某个条件时,才会切换到另⼀个状态。也就是说,状态机有两个要素:状态和状态转移。
⽤脚本直接实现状态机,只需要⽤⼀个变量保存当前状态,根据游戏逻辑切换状态即可。⽽对于动画系统来说,将状态机思想应⽤于管理动画状态极为合适,具有很好的通⽤性。Unity所提供的动画状态机组件,就是专门⽤来管理动画状态,以及动画之间的切换和过渡的。
2. 动画状态机设计举例
以⼀个简单的2D游戏——《超级⻢⾥奥兄弟》初代为例,介绍设计动画状态机的基本思路。
⾸先,假设有站⽴、⾛/跑、跳跃和下蹲4种动画(暂时去掉刹⻋、发射⽕球等其他动作)。如果将每种动画看成⼀种状态,⽤⽅框表⽰,状态之间的切换⽤箭头表⽰,那么就可以得到⼀个状态转移图,如图6-5所⽰。注意图中箭头有明确的⽅向,有些切换是双向的,⽽有些切换是单向的。
从图中可以看出,站⽴可以切换到下蹲、跳跃或⾛/跑,但跳跃不能直接切换到下蹲。跳跃也不能直接切换到⾛/跑,跳跃状态唯⼀的出⼝是站⽴状态。与跳跃类似,下蹲状态也只能切换到站⽴状态。虽然看似少了⼀些状态转移,但在跳跃或下蹲时利⽤瞬间的站⽴作为中转状态,那么就可以过渡到⾛/跑的状态了。
图6-5是根据经验设计的,最终还要根据实际动画效果调整。虽然动画状态转移图的设计没有固定的⽅法,但是⼀定要符合实际需要。当然也完全可以在4种状态之间画满双向箭头,只不过那样做会增⼤逻辑处理的复杂性,得不偿失。
有了基本的状态转移图,之后还要具体指定状态转移条件。⼀般转移条件是⽤专门的变量表⽰的,如可以⽤⼀个speed变量表⽰⾓⾊当前的速度,⽤crouch变量代表下蹲,⽤jump变量代表跳跃。在站⽴状态下speed⼤于0,就切换到⾛/跑状态;在⾛/跑状态下jump变成true,就切换到跳跃。这些变量都是动画专⽤变量,只要在脚本中改变它们的值,就可以让动画状态机按需求改变状态。
注意,在下蹲状态下仅有让crouch变成false,才能退出下蹲状态,除此以外即使速度变化,也不会退出下蹲状态。这种思路很清晰,进⼀步降低了⽤脚本管理的难度。在Unity中,实际的动画状态机设计如图6-6所⽰,它包含了动画状态转移图和变量列表。
文章来源:https://www.toymoban.com/news/detail-849264.html
⼩提⽰
蹲下时跳跃会怎样?
玩过《超级⻢⾥奥兄弟》系列作品的玩家都知道,这部游戏是允许在下蹲时跳跃的。但前⾯的动画状态机在下蹲和跳跃之间没有箭头,如何解释呢?
再重新玩⼀遍游戏会发现,在下蹲时跳跃,虽然能够跳起来,但⻢⾥奥依然保持下蹲姿势,这与前⾯的设计相符。
这也印证了在很多游戏中(使⽤根⾻骼动画的游戏除外),⾓⾊的运动与动画⽆关,动画只是表现层的东⻄。即使把主⾓变成⼀个⼩球,也不影响游戏的运⾏。
文章来源地址https://www.toymoban.com/news/detail-849264.html
到了这里,关于Unity 3D脚本编程与游戏开发(3.2)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!