Unity角色技能及技能编辑器设计之概念篇

时间:2024-04-06 20:32:30

概览

首先给大家展示一下我们一个游戏中设计的技能及编辑器
Unity角色技能及技能编辑器设计之概念篇

构思

我们很少能听到关于技能的一个定义或描述,那么,如果我们需要用程序思维来概括技能,我们应该怎么措辞才比较准确?当然,对于不同的游戏,技能的设计复杂度也大不一样,复杂的可以复杂到如Dota每个角色的主动被动技能,简单的可以简单到益智类游戏一个技能只是使用一下道具。如何庖丁解牛,我想最直接的想法就是找到技能的基本组成要素。然后基于这些要素,我们再做加法或者简单,就能游刃有余。

1.技能要素

  • 触发机制–何时以某种方式开启技能的生命周期
  • 技能事件–描述技能发生的原子信息
  • 事件效果–对当前游戏环境造成改变

2.技能的简单定义

技能,是以一种规定的方式进行触发,由一系列技能表现串联的,并对当前游戏环境造成相应影响的事件的集合。它一般具有一定的生命周期,会对游戏数值产生改变,有相应的动画、特效及音效表现。

设计

我们有了一个对技能的简单定义之后,对技能的要素有了一个清晰的把握,对我们设计数据结构,从而有效的描述技能,是有很大帮助的。如何进行抽象,如何设计配置,是我们接下来要思考的问题。

1.Unity下的技能的数据结构及配置设计

Q1:利用Unity的动画控制系统Animator进行事件和表现的绑定?

比较了解Unity中动画系统的同学都知道,Unity中的Animator提供在时间轴上添加Event,而且Event上可以添加脚本,脚本里面可以处理技能事件逻辑,比如释放特效、音效和角色动画等等。我们来看看这个描述技能的过程:

  • 优点:
    • 利用自带的时间轴和Event 事件,方便易用
  • 缺点:
    • 对美术资源的依赖强,需等到各种资源到位才能大致设计出一个完整技能
    • 产生大量技能事件脚本,不易扩展
    • 容易产生冗余帧

Q2:设计数据结构如链表或树来描述技能事件,并做编辑支持?

技能事件无非是一连串 Action 的有效集合,一般的技能都是前一个技能事件发生完,接着触发下一个技能事件,这很明显就是一个链表的结构。比较复杂的技能会出现分支的情形,这种情况下我们可以设计技能树,或者利用继续利用链表,在此基础上增加一些特殊的判定方式。
* 优点:
- 不受表现的制约,设计上灵活且独立,各部门并行开发
- 程序上易扩展,好维护
* 缺点:
- 无编辑器支持,需花一定精力进行编辑器扩展

Q3:那么我们采取哪种方式来定义技能?

我的选择是第二种方式,即设计出一套自己的数据结构来定义技能事件和技能属性,再对整套的数据结构进行编辑器的可视化编辑支持。
原因是:
- 大型游戏开发中,团队协作效率压倒一切,让各部门解除依赖,并行开发
- 编辑器的开发让后续的开发可扩展性强,一次消耗,长期受益

Q4:配置采用Json、XML还是其他?

答案是采用 Unity 自带的 yamal 格式的配置结构–ScriptableObject。
原因是:
- 是ScriptableObject 是Unity 原生支持的一种序列化方式,天生友好支持编辑器扩展

2.Unity下的技能编辑器的设计

策划同学在迭代设计游戏角色和怪物的技能时,必然要面对的一个问题就是工具的设计和优化。量大,复杂度高决定了我们必须扩展编辑器来优化这个Work-Flow。