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

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

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

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

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

简单的技能:

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

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

复杂的技能:

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

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

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

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

文件的解析,也很简单

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

1.触发器:

从同一个基类继承,

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

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

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

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

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

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

部分Public 接口代码:

总结一下思路,就是

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

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

SkillTrigger 就执行具体的效果.

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

Unity教程之-Unity游戏技能Skill系统架构设计相关推荐

  1. RPG游戏经典的系统架构

    RPG游戏经典的系统架构设计 : bigword 游戏引擎就是使用这种架构,我认识的很多rpg游戏公司的同事也大致采用了这种架构方式. loginapp : 登陆服务器,主要负责player 的登陆请 ...

  2. 系统架构设计师教程-学习-记录(1)系统架构师知识结构

    系统架构设计师教程-学习-记录(1)系统架构师知识结构 初 记 系统架构师知识结构 系统架构师具备的能力 初 欢迎进qq群交流:546496965 学习<系统架构设计师教程>,初心是为了学 ...

  3. 架构思维成长系列教程(七)- 大型电商系统架构设计

    背景 大型电商网站,指的是每日用户访问量达到数百万,每日页面访问量达到数千万乃至上亿级别的网站,达到这个规模的电商网站在国内不多. 内容 架构设计分为两部分:应用架构设计和基础架构设计 应用架构设计: ...

  4. 插件式架构设计实践:插件式系统架构设计简介

    本系列博文将使用微软RIA技术解决方案Silverlight以及扩展性管理框架Managed Extensibility Framework(MEF),以插件式架构设计为导线,分享本人在从事基于微软S ...

  5. 插件式架构设计实践一:插件式系统架构设计简介

    本系列博文将使用微软RIA技术解决方案Silverlight以及扩展性管理框架Managed Extensibility Framework(MEF),以插件式架构设计为导线,分享本人在从事基于微软S ...

  6. 《程序员》2014年11月刊:电商峰值系统架构设计

    双11来临之际,<程序员>以"电商峰值系统架构设计"为主题,力邀京东.当当.小米.1号店.海尔商城.唯品会.蘑菇街.麦包包等电商企业,及商派.基调网络等服务公司,分享电 ...

  7. 什么是系统架构设计:关于架构演进理论

    什么是系统架构设计:关于架构演进理论 在过去软件开发过程发展的很长一段时间内,软件架构表现为一种集中式的单块(Monolithic)式,即先对系统进行分层,然后通过单个进程进行部署和维护,典型的分层体 ...

  8. 《系统架构设计》-01-架构和架构师概述

    文章目录 1. 架构的基本定义 1.1 架构组成理论 1.1.1 系统元素 1)概念 2)静态结构和动态结构 1.1.2 基本系统属性 1.1.3 设计和发展原则 1.2 架构的决策理论 1.2.1 ...

  9. java系统架构设计,2022最新

    Java中23种设计模式的详细解析Java开发中23种设计模式详细介绍设计模式介绍设计模式分类设计模式六大原则开闭原则(Open Close Principle)里氏代换原则(Liskov Subst ...

最新文章

  1. 文件的记录c语言程序,计算机二级-C语言-程序填空题-190110记录-文件写入与文件读出显示...
  2. 超 31% 生成文本涉暴力色情,GPT-3 模型在 AI Dungeon 游戏里疯狂「飙车」!
  3. Android Studio使用Lint进行代码检查
  4. 大数据时代医疗行业爆发 政策壁垒仍是最大障碍
  5. 手动建立Mysql表实体类技巧
  6. Mware HA实战攻略之五VMwareHA测试验收
  7. java实验金额转换_java 数字金额转换中文金额
  8. Quartz业务类无法注入Spring对象问题
  9. Golang 入门系列(十一)Go语言实现webapi
  10. c#调用c++ delegate callback
  11. 进程间通信(未完成)
  12. ip的增删改查以及网络设定
  13. [简单分页]C#+JQUERY+ORACLE分页效果 ----转载
  14. python与队列入门
  15. 网页设计中最常用的字体
  16. 染用计算机语言,着色器语言
  17. 线程池与Threadlocal
  18. 一套不错的php,一套不错的PHP笔试题-附答案.pdf
  19. 深入理解android 博客,深入理解Android中ViewGroup
  20. Python实现Excel随机抽取数

热门文章

  1. FA-关于固定资产的类别重分类
  2. shell批处理 FFmpeg 批量转换格式 webm转MP4
  3. 【FPGA】串口以命令控制温度采集
  4. 安卓日志:拍照、文件读取的问题
  5. 【Linux】Linux基础
  6. Django - ContentType
  7. adb、logcat
  8. 【awk】awk 常用命令
  9. BurpSuite配置抓取HTTPS数据包
  10. ucenter与其它应用结合时出现通信失败,ucenter应用原理与调试