我想把技能做的比较牛逼,所以项目一开始我就在思考,是否需要一个灵活自由的技能系统架构设计,传统的技能设计,做法都是填excel表,技能需要什么,都填表里,很死板,比如有的技能只需要1个特效,有的要10个,那么表格也得预留10个特效的字段.在代码里面也是写死一些东西,要增加和修改,就得改核心代码,如果我要把核心部分做成库封装起来,就很麻烦了.

能不能做成数据驱动的方式呢?

改技能文件就行了,即使要增加功能,也只需要扩展外部代码,而不用改核心代码,

我是这么来抽象一个技能的,技能由一堆触发器组成,比如特效触发器,动作触发器,声音触发器,摄像机震动触发器等等,这些触发器到了某个条件就执行触发,触发条件一般是时间,如果有比较复杂的浮空技能,可以增加落地触发等.

自定义一个技能文件,代替excel表格,看起来是这样:

简单的技能:

每一行都是一个触发器,这些触发器,到了某个条件会自动触发.

上面的意思就是,第0秒开始面向目标,第0秒开始播放动作1000

复杂的技能:

这个技能能将目标打到空中,并完成3连击,然后从空中砸向地面,

CurveMove(0, 0.413, 104, 0, 0, 0, 0);的意思就是,第0.413秒,开始做曲线运动,让角色飞到空中,曲线运动的ID是104,

用这样的文件来配置一个技能,很灵活,也很快,

  1. private bool ParseScript(string filename)
  2. {
  3. bool ret = false;
  4. try
  5. {
  6. StreamReader sr = FileReaderProxy.ReadFile(filename);
  7. if (sr != null)
  8. ret = LoadScriptFromStream(sr);
  9. }
  10. catch (Exception e)
  11. {
  12. string err = "Exception:" + e.Message + "\n" + e.StackTrace + "\n";
  13. LogSystem.ErrorLog(err);
  14. }
  15. return ret;
  16. }
  17. private bool LoadScriptFromStream(StreamReader sr)
  18. {
  19. bool bracket = false;
  20. SkillInstance skill = null;
  21. do
  22. {
  23. string line = sr.ReadLine();
  24. if (line == null)
  25. break;
  26. line = line.Trim();
  27. if (line.StartsWith("//") || line == "")
  28. continue;
  29. if (line.StartsWith("skill"))
  30. {
  31. int start = line.IndexOf("(");
  32. int end = line.IndexOf(")");
  33. if (start == -1 || end == -1)
  34. LogSystem.ErrorLog("ParseScript Error, start == -1 || end == -1  {0}", line);
  35. int length = end - start - 1;
  36. if (length <= 0)
  37. {
  38. LogSystem.ErrorLog("ParseScript Error, length <= 1, {0}", line);
  39. return false;
  40. }
  41. string args = line.Substring(start + 1, length);
  42. int skillId = (int)Convert.ChangeType(args, typeof(int));
  43. skill = new SkillInstance();
  44. AddSkillInstanceToPool(skillId, skill, true);
  45. }
  46. else if (line.StartsWith("{"))
  47. {
  48. bracket = true;
  49. }
  50. else if (line.StartsWith("}"))
  51. {
  52. bracket = false;
  53. // 按时间排序
  54. skill.m_SkillTrigers.Sort((left, right) =>
  55. {
  56. if (left.GetStartTime() > right.GetStartTime())
  57. {
  58. return -1;
  59. }
  60. else if (left.GetStartTime() == right.GetStartTime())
  61. {
  62. return 0;
  63. }
  64. else
  65. {
  66. return 1;
  67. }
  68. });
  69. }
  70. else
  71. {
  72. // 解析trigger
  73. if (skill != null && bracket == true)
  74. {
  75. int start = line.IndexOf("(");
  76. int end = line.IndexOf(")");
  77. if (start == -1 || end == -1)
  78. LogSystem.ErrorLog("ParseScript Error, {0}", line);
  79. int length = end - start - 1;
  80. if (length <= 0)
  81. {
  82. LogSystem.ErrorLog("ParseScript Error, length <= 1, {0}", line);
  83. return false;
  84. }
  85. string type = line.Substring(0, start);
  86. string args = line.Substring(start + 1, length);
  87. args = args.Replace(" ", "");
  88. ISkillTrigger trigger = SkillTriggerMgr.Instance.CreateTrigger(type, args);
  89. if (trigger != null)
  90. {
  91. skill.m_SkillTrigers.Add(trigger);
  92. }
  93. }
  94. }
  95. } while (true);
  96. return true;
  97. }

文件的解析,也很简单

那么从代码上怎么实现呢?

1.触发器:

从同一个基类继承,

2.工厂模式来创建注册触发器,

在外部注册触发器的代码:

3.技能实例来管理触发器,

执行触发其实也可以写这里.

4.技能系统来管理所有技能

技能是可以复用的,技能系统就是一个技能池子,不停地new技能实例和回收技能实例

部分Public 接口代码:

总结一下思路,就是

SkillSystem 管理SkillInstance,创建和回收所有技能

SkillInstance 管理 SkillTrigger,负责触发器的触发.

SkillTrigger 就执行具体的效果.

代码封装上,可以把核心代码做成库,只开放触发器的扩展接口,项目已经在使用,很不错.

Unity3D手游开发日记(2) - 技能系统架构设计的更多相关文章

  1. Unity3D手游开发日记(6) - 适合移动平台的水深处理

    市面上大部分的手机游戏,水面都比较粗糙,也基本没发现谁做过水深的处理. 水深的处理在PC平台比较容易,因为很容易获得每个像素的深度,比如G-Buffer,有了像素的深度,就能计算出每个像素到水面的距离 ...

  2. Unity3D手游开发日记(9) - 互动草的效果

    所谓互动草,就是角色跑动或者释放技能,能影响草的摆动方向和幅度. 前面的文章早已经实现了风吹草动的效果,迟迟没有在Unity上面做互动草,是因为以前我在端游项目做过一套太过于牛逼的方案.在CE3的互动 ...

  3. Unity3D手游开发日记(4) - 适合移动平台的热浪扭曲

    热浪扭曲效果的实现,分两部分,一是抓图,二是扭曲扰动.其中难点在于抓图的处理,网上的解决方案有两种,在移动平台都有很多问题,只好自己实现了一种新的方案,效果还不错. 网上方案1. 用GrabPass抓 ...

  4. Unity3D手游开发日记(8) - 运动残影效果

    2D游戏的残影很简单,美术做序列帧图片就行了,那么3D游戏的残影美术做不了,得靠程序员动态创建模型来处理. 实现原理也很简单: 1.间隔一定时间创建一个残影模型 GameObject go = Gam ...

  5. Unity3D手游开发日记(7) - 适合移动平台的天气效果

    腾讯的天涯明月刀的天气很棒,以前我也在CE3的基础上做了一个效果差不多的,但是在手机上,还是斜下固定视角的游戏,是否还需要一个天气系统? 而且没有G-Buffer的支持,很多牛逼效果实现不了,比如角色 ...

  6. Unity3D手游开发日记(5) - 适合移动平台的植被随风摆动

    一直在思考怎么让场景更有生机,我觉得植被的随风摆动是必不可少的.CE3引擎的植被bending就做得特别棒.我也准备在手机上做一套. 先分析一下植被摆动常见的几种做法.其实不管哪种做法,核心就是让植被 ...

  7. Unity3D手游开发日记(3) - 场景加载进度条的完美方案

    我以为做个进度条很简单,分分钟解决,结果折腾了一天才搞定,Unity有很多坑,要做完美需要逐一解决. 问题1:最简单的方法不能实现100%的进度 用最简单的方法来实现,不能实现100%的进度,原因是U ...

  8. Unity3D手游开发日记(1) - 移动平台实时阴影方案

    阴影这个东西,说来就话长了,很多年前人们就开始研究出各种阴影技术,但都存在各种瑕疵和问题,直到近几年出现了PSSM,也就是CE3的CSM,阴影技术才算有个比较完美的解决方案.Unity自带的实时阴影, ...

  9. Unity3D手游开发实践

    <腾讯桌球:客户端总结> 本次分享总结,起源于腾讯桌球项目,但是不仅仅限于项目本身.虽然基于Unity3D,很多东西同样适用于Cocos.本文从以下10大点进行阐述: 架构设计 原生插件/ ...

随机推荐

  1. java 多路分发

    1.概念 一个函数处理多种类型,其实和多态差不多. 但是要处理两种或者多种类型的数据时,就需要判断每种类型以及每种类型所对应的处理.(PS:我只是在走别人的老路,网上一搜这种概念,博客一大堆,我不知道 ...

  2. Linux 安装Redis<单机版>(使用Mac远程访问)

    阅读本文需要先阅读安装Redis<准备> redis依赖 yum install gcc-c++ 解压 cd redis压缩包所在目录 tar -xvf redis-4.0.10.tar. ...

  3. 利用Pillow给图片添加重点框(适用UI自动化测试)

    效果图 一个简单的例子 安装Pillow 在cmd窗口/终端输入: pip install pillow 如果被墙,下载巨慢的话,可以临时替换豆瓣源 pip install pillow -i htt ...

  4. Centos6升级至openssh-7.5p1

    最近公司有几台服务器需要搬至甲方(政府单位),所以在安装服务时用的是16年的openssh7.3pl, 今天通知我们有漏洞,需要再一次升级,看到官方文档上版本已升级至7.5,所以干脆直接搞7.5 具体 ...

  5. 拉格朗日乘子法与KKT条件 && SVM中为什么要用对偶问题

    参考链接: 拉格朗日乘子法和KKT条件 SVM为什么要从原始问题变为对偶问题来求解 为什么要用对偶问题 写在SVM之前——凸优化与对偶问题 1. 拉格朗日乘子法与KKT条件 2. SVM 为什么要从原 ...

  6. How to pass an Amazon account review

    Have you ever sold products on Amazon? How about sold so much within the first week that amazon deci ...

  7. Knight Moves(广搜BFS)

    Description A friend of you is doing research on the Traveling Knight Problem (TKP) where you are to ...

  8. Scrum立会报告+燃尽图 03

    此作业要求:[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2190] 一.小组介绍 组长:王一可 组员:范靖旋,王硕,赵佳璐,范洪达,祁 ...

  9. Python:模块学习——sys模块

    sys模块常见函数和变量 sys.argv:命令行参数,实现从程序外部向程序传递参数 [注]:(1) sys.argv[0] 表示代码本身的文件路径 (2)sys.argv是一个元组,可以用[ ]提取 ...

  10. BETA事后总结

    目录 所有成员 项目宣传视频链接 贡献比例 工作流程 组员分工 本组 Beta 冲刺站立会议博客链接汇总 燃尽图 原计划.达成情况及原因分析 组员:胡绪佩 组员:周政演 组员:庄卉 组员:何家伟 组员 ...