[toc]本篇中讨论角色的相关工作流程 我们知道ECS系统,可以给玩家添加移动、血量、攻击组件,能想到的都可以加; 角色可以很灵活的被操作,也可能是剧情模式、自动寻路模式; 角色有专属的动作,比如站立、奔跑、打招呼、跳舞,比如剧情动作、技能动作; 需要有装备系统,玩家可以更换衣服、鞋子、武器,个别职业可能还有法宝; 游戏里面可能有很复杂的Buff系统,各种护盾、异常状态,攻防数据变化; 还可能需要捏人系统,可以自定义高矮胖瘦、脸部细节、胸大小,但是要解决形变与装备、动作的兼容问题; 要规划一个供美术人员的工作流,定义如何设计新角色、新装备、新技能效果,文件放在哪,如何测试。 程序员也需要一个工作流,定义文件加载方式、必要数据、换装流程,以及更复杂的测试。 要解决各项系统的冲突点不容易,可能使工作量成倍增加; 比如:换装系统,同一件胸甲,牛头人和血精灵都要能穿戴,出了新角色地精以后,又得增加工作量; 比如:捏人系统,角色高度变化以后,弯腰拾取动作就不一定准确了,除非是用IK驱动的; 很显然,多数的游戏都不会这么麻烦,只会选择部分特性作为游戏的特色。 角色系统是玩家的自留地,是交互的基本单位,是游戏内容的执行者,是额外数据的生产者。 玩家上线后可以PVE、PVP、经商,或者看着人物发呆、在聊天频道挥洒汗水。 可以说,游戏上线前,调了半年、3年什么的,多半是角色方面的内容,剩下的都属于世界机制。

怎么换装

对于程序员来说,换装相当于替换两个模型的mesh,也就是SkinedMeshRenderer组件; 我们定义初始模型为模板,要替换的装备位暂时是胸甲,可以额外再添加装备位; 胸甲可能有多个子mesh,比如领带这种装饰物,都迁移到模板上去; 模板上只有骨骼,可选带皮肤,皮肤本身也是mesh,换装后被装备遮挡; 将胸甲的多个mesh的bones和rootbone映射到模板,换装完成; 为了方便美术人员工作,还得通知美术人员应该如何设计新角色、新装备,比如: 新角色为一个使用预设的骨骼名的裸模,如果不包含皮肤,就只剩骨架; 装备模型采用同一套骨骼为基础,可以自定义新骨骼,皮肤在骨架上时装备就不带皮肤。 自定义新骨骼: 比如胸、领带、短裙、长裙、尾巴,这些软骨并不适合放在骨架上。 皮肤位置: 放在骨架或者装备上,主要是给美术用来做空间参考,处理不好就是穿模。 像崩坏3这种游戏,一个角色一套模型,删除了看不见的面(衣服下面没有皮肤),实现优化; 换装功能会导致失去这种优化,多个mesh遮挡,浪费了一些性能。 捏人带来的额外影响: 由于人物的形变,但是贴图没有变,模型表面出现细节变化: 腰部变得特别细的话,显得腰部的贴图细节特别多,和周围对比起来不像是一块布做的; 胸变得特别大或者特别小时,对应着贴图细节的重新分布,失真更明显; 所以捏人只能在合理范围内微调,这样,一套贴图才能在波动范围内使用。 捏人没有额外的性能开销,但是要捏的美需要丰富的经验。 换装流程举例: 有换装需求的角色和没换装需求的角色分开,尽可能优化; 模板放一个文件夹,每种装备分别放一个文件夹; 换装流程:异步加载模板后⇒异步添加装备元素⇒合成模型⇒OnLoaded 非换装流程:异步加载模板后⇒OnLoaded 每个模型,也就是AssetBundle实例,加载后待命,避免需要取消任务,统一合成。