zoukankan      html  css  js  c++  java
  • 技能系统的数据结构

    问题1. 技能如何储存和调用?

    游戏中上百个技能是如何储存的,如果调用的,不会是一起加载,if判断一个一个的吧?

    注:下方回答中蓝色的字体是我们游戏中的做法

    回答一

    主流的做法是通过 Add Buff 和DeBuff 来实现的,下面简单Buff的释放方式

    最简单的Buff需要有如下通用属性:

    1、生效时间->在添加到对象上后,作用的时间长度,一般有立即作用,延迟一段时间生效等等

    2、作用时间->指该Buff在对象身上作用的时间,生效后立即完全,如普通攻击,还有持续作用的,如中毒后持续扣血,眩晕等等

    3、作用对象->某些技能制定的对象的类型,如火球可能对熔岩巨人无效,就会在该中体现(注:我们的技能比较简单,Actor中有一列SkillId对应Skill表中的Id,未有此种特殊情况)

    4、作用方式->Buff会修改对象的哪些属性,如果增加火系列武器攻击力,中毒Buff可能会直接扣一定量的HP,以上几种是常见的Buff属性,Debuff也类似,之前可能通过策划填表实现,现在很多团队使用 LUA 脚本来实现(注:关于如何AddBuff,我们有一张Buff表,这张表里由策划填写,比如:策划想添加一个Buff:刀系列的武器 ATK 上升 20% ,那么他只需要填写这两列:MethodName:WeapontATKUpArgs:WeaponType|UpValue[方法名 参数1|参数2],然后程序解析Tab表,通过C#的反射执行 MethodName 方法,并传入相关的参数,这样这个Buff就实现了。考虑后面的运营需求,现阶段我们也正在加入 LUA 来调用C# 的方法,达到动态更新脚本的目的)

    除了 buff 之外,技能还有一些其他的要素

    比如 瞬发技能,持续施法技能,每个技能还有前摇等要素需要考虑,这些通常放在每个具体的技能逻辑内实现

    再有就是AOE技能,可能需要在制定的范围内查找攻击对象,这部分逻辑也会放在技能内实现,如果想了解更详细的,可以参考 Mongos的相关逻辑,国内厂商的相关逻辑或多或少和Mongos有相似或雷同。

    回答二

    技能是个对象,上面有些基本属性,技能只提供最基本到主流程,如引导时间,命中时间,命中次数。当技能发动时只在各个流程命中时抛出消息,各个消息节点上可以让策划插入各种事件,比如当技能读条开始时给自己加个 魔免buff,命中敌人时给自己加血,同时召唤出两个幻影。程序只需要生产,加血,分身,甚至改变天气之类的技能事件,策划通过技能编辑器组装出理论上无数种技能。(注:我们的项目现在还没做技能编辑器,现在阶段是有三张表:Skill,Buff,Bullet,具体为Skill可以AddBuff,也可以发出 Bullet,Bullet遇到Actor 引爆 再AddBuff;关于事件,Skill表有:发招前事件(包括预备动画,预备特效),发招中事件(发招中动画) 发招后事件(进入CD))

    回答三

    技能是通过一系列的触发条件组合起来的一个事件集合。不仅仅是BUFF这么简单,灵活点的做法是把技能描述层,技能本身属性层和效果层分开来处理。因为有时候一些道具也会产生相应的效果,这个时候单独做表就很混乱了。
    然后通过ID来填写这ID对应的描述,属性和效果,研发照着ID按图索骥实现具体效果就可以了。

  • 相关阅读:
    Quartz 基本概念及原理
    quartz-2.2.x 快速入门 (1)
    hive踩过的小坑
    spring profile 多环境配置管理
    win10窗口设置眼睛保护色
    优雅地在markdown插入图片
    Using Spring Boot without the parent POM
    isDebugEnabled作用
    Log 日志级别
    为什么要使用SLF4J而不是Log4J
  • 原文地址:https://www.cnblogs.com/zhaoqingqing/p/3903405.html
Copyright © 2011-2022 走看看