# KFGF For Unity 游戏开框架 **Repository Path**: kookoo/KFGF ## Basic Information - **Project Name**: KFGF For Unity 游戏开框架 - **Description**: FKGF 开方游戏框架 KaiFang Game Framework 对街机单机游戏使用Unity引擎进行 - **Primary Language**: C# - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 4 - **Created**: 2020-12-23 - **Last Updated**: 2026-03-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # KFGF For Unity ![logo](/Resources/images/logo2.png)   ## 介绍 *** * 开方游戏框架 Kai Fang Game Framework For Unity * 对街机类游戏快速开发的框架使用Unity引擎进行游戏开。 * 快速对接硬件开发。并对接各种硬件。 * 在开发游戏时不需关心硬件如何工作,专心放在业务处理逻辑上。 * 对于一些新手对接硬件开发比较困惑,不知如何下手,快速方案。 *   ## 架构 *** * 环境架构说明 ![流程图](/Document/images/KFGFfash.png) 硬件通过 IO板,再通过 COM 接口 连接电脑 另一种件设备,是直接通过 USB 连接电脑   在你的项目中对硬件开是基于KFGF开发的,对接硬件的事交级KFGF来完成。你可以定义业务事件处理游戏逻辑就可以了。到实机测时通过配置KFGF就可以进行了。在开发中如何测试,可以通过配置键盘事件来模拟来完成开发过程中的测试。 ## 主要功能 *** 1. com硬件对接 IO版,吐卡器,吐票器,扫码器,方向盘 通过配置就能接入硬件,无需再关心异步多线程问题 2. 后台管理器集成 启动后台界面 ,投币统计,分数统计,配置 等可以自定义统计数据 通过接口数据直接进入到后台,配置直接开箱即用。 3. usb设备对接组件 扫码器 摄像头 拍照功能 4. 游戏场景管理 异步加载场景 启动后展示指定场景 5. 游戏发布打包安全加密 不能直接通过文件启动,需要通过服务程序,服务程序通过认证后才能使用,开发过程无需关心此过程 框加己集成验证请求服务的真实性。 6. 游戏升级(开发中)   ## 安装 *** 1. 通下[https://gitee.com/kookoo/KFGF ](https://gitee.com/kookoo/KFGF)载下载放到 Assets 目录下 。 使用 git clone _git@gitee.com:kookoo/KFGF.git_ 2. 错误:第三方包冲突,通过删己加载的第三方包只留一个包就可 3. 错误:name 'Ports' does net exits 和 'SerialPort' could not be found 这是编译 net的库不支持com接口包,  需要在工程中找到 **Project Settings/Player** 项 **Conffiguration** 下的 APi Compatibility Level* 更换 支持就行 **" .NET Standard 2.0 "** 更成 **" .NET 4.x"** 4. 错误: 后台perfab脚本链接丢失。 重新找到脚本关链   #### 目录结构 * Document 编写一些文档 * Scripts 框架所有代码 * 1. Editor 编辑器代码目录 * 1. modes 数据模型目录 * 1. Plugins 自定义插件,或己修改过的插件 * 1. app 框架应用的内容 * 1. cores 核心代码 * 1. Components 组件代码,可以拿来就可以使用的可以放到人的游戏中 * Resources 资源源文件 * Other 其他支持内容 * Plugins 引用第三方插件 * Scenes 样例 实例 ###### 在你的项目中的目录 /Assets/KFGF/   ## 设计结构 ***   ## 使用说明 *** 1. 实制案例项目开发中提取出来的,所以没有经过大量Unity版本开发测试,本实例基于 unity 2018,unity2019 版本 开发,所以对于低版本发现有问题可以向我提出建议。 2. 部分引用基他插件来完成,确保你己安装相应的插件,或己引入相同插件相同的冲突问题自行解决。 3. 案例项目只在 window 10 64bit 系统上运行,如是其他系统上运行,如有问题自行修复。 #### 第三方插件 框架引入了第三方插件,如果工程己有,产生冲突,可以在Plugins 中删除。要注意版本的关系。可能会导致程序不能如期运行。   ## 开发 ***   ### 快速开始   1. 在启动游戏启动第一个场景中启动 FK框架类中 Awake()中 `KFGame.KF.Instantiation();` 或者可以引用命名空间 `using KFGame;` ###### 样例 using System.Collections; using System.Collections.Generic; using UnityEngine; using KFGame; public class KFMainScene : MonoBehaviour { void Awake() { KF.Instantiation(); } void Start() { } // Update is called once per frame void Update() { } } KF 框架是全局共享,你可以在任何的地方引用。   2. 如何接收KF事件? 需要先注则侦听KF 事件 `kf.kfevents.addLisener([回调函数],[事件类型]);` * 回调函数 你需在处理事件的函数 * 事件类型 是可以自定义的,也可以使用框架预定义的类型,发出事件和接收的事件类型需要一致否则收不到事件。 * 在你的回调函数中处理业务,这样硬件事件会影射到这里,也可以模拟事件影射到这里,使用相同的名字就可以,得到唯一类型的事件产生。 * 在你不需时 注销事件侦听, `kf.kfevents.removeLisener([回调函数],[事件类型]);` ###### 样例 void OnKFEvent(KFEvent e){ //投币 if(e.isEvent("KFE_STATISTICS_COINT")){ //todo 处理投币后的逻辑 } if(e.isEvent("BUTTON_A") && e.status==1){ //todo 处理按下A后的逻辑 } } void Awake(){ ///注册事件 KF.kf.kfevents.addLisener(OnKFEvent,KFEventManger.TYPE_KFEVENT_GAME); } void OnDestroy(){ //注销 KF.kf.kfevents.removeLisener(OnKFEvent,KFEventManger.TYPE_KFEVENT_GAME); }   #### 组件   ##### 事件管理器与事件 KFEventManger 管理事件接收和分发。由KFGF框架来维护。 1. 可以自定义你自己的事件由 KFEventMange代理分发。 2. 注册侦听器来接收事件。 3. 可以继承 IKFEvent 来接收事件,通过继承接口得到事件,可以接收到所有事件类型的事件。 需要实现 void OnKFEvent(string type,KFEvent e); 4. 主动发送自定义事件 Pop(KFEvent e);push(KFEvent e); 函数发送事件, 例: KF.kf.kfevents.Pop(e); 立刻发出事件 KFEventManger.Instantiation().push(e); 加入到队列中,等待框架自行分发。 5. 事件管理器的实例,KFEventManger.Instantiation()获得实例,还可以使用框架 KF.kf.kfevents   ##### 键盘模拟事件 开发前,通常关注在游戏业备逻辑本身,但需要测试怎么办,通常使用键盘模拟。所以键盘模拟事件在开发中也是很重要的一部分。接下来,我们通过配置来启动键盘模拟发出事,到真实设备时,配置的事件与模拟事件一致就能完成任务不需修改任何代码。 代码如下: void Awake(){ KF.kf.kfevents.addLisener(onKFEvnet); } void onKFEvent(KFEvent e){ if(e.isEvnet("P1InCoin")){ //TODO } if(e.isEvnet("P1InCoin")){ //TODO } } 需要引入空间 using KFGame; 然后配置 在 kfkeyslisent.ini [event2] //一个事件一个组 可自定义名字 name=E_F1 //模拟事件名 eventName=P1InCoin //事件名称 对应的代码中的名称 targettype=KFEE_TYPE_KFEVENT_GAME //事件类型,默契认就是 KFEE_TYPE_KFEVENT_GAME 可以不写或自定义 keycode=f1 //按键名 小写 keytype=1 // 1代表按下 发出事件 [event3] name=E_F2 eventName=P2InCoin keycode=f5 keytype=1   ### 如何接入设备?   ##### 1.扫码枪 扫码器通常可以扫二维码 和条形码,提取内容。内容相对是固定的易被复制批量。 (1)usb 扫码器 USB扫码器主要是通过模拟键盘,使用比较间单。但不能区分设备当多个设备接入时,不能区分是哪一台设备输入的。 FKQRCode 是一个普通的功能组件,引用或实例化就可以使用。可以扫二维码读取内容 组件路径 KFGF/scripts/plugins/QRCode/KFQRCode.cs 通过设备代理,返回扫到的内容 addListener(ReadQRCode onCode); //添加一个侦听 是否读到码 功能: 1.制定条件,设定码数据长度 codeLength 2.添加前缀,过虑无效的码 3.是否可以重复刷同一张卡,canRepeat=true; (2)com 扫码器 读取数据通过 com接口,可以方便读取区分设备数据,并可以进行交互。   ##### 2.吐票器 KFTicketDeviceIOCOM 组件,基础通用组件,类像吐券,吐卡,吐彩蛋等,都可以使用。 组件路径 KFGF/scripts/plugins/KFTicketDeviceIOCOM.js 组件与普通组件一样使用。 var ticketdevice = gameObject.AddComponent(); 使用前需要配置一些参数并初始化后才能正确的工作。 ticketdevice.device= 定义设备名称 ticketdevice.device_io_send_eventname= 发送到吐票器的接口名 ticketdevice.device_io_callback_eventname = 吐票器返回信号接口名 ticketdevice.device_io_stop_eventname = 停止吐票接口名 ticketdevice.init(); //初始化 ... 需要时还有些其他项需要设备 让机器吐票 ticketdevice.send(票的数量);机器就会自动吐票 如需要得到吐票信息可以侦到吐票器己吐票信息 ticketdevice.addListener( sendTicket tick); 使用前需要配置接口 请参考 配置项   ##### 3.吐卡器 吐卡器与吐票器功能相同 使用方法可以参考 吐票器   ##### 4.摄像头 PhotoCam 摄像头功能组件,是一个组件功能与普通的功能组件使用方法没有区别。可以实例化对象使用,也可以拖到你的组件中使用。 组件路径 KFGF/scripts/plugins/camera/PhotoCam.cs *功能显示 参数:showimage 指定UI中的的RawImage类型对象,就可以显示摄像头中的内容。 * 当有多个摄像头时,可以通过 deviceIndex 指定使用第几个摄像头 * 读取摄像头图片数据发送到网络 pngBytes() ; 读取到当前摄像头截图的png字节数据 PhotoCam.ImgToBase64String( pngBytes()); 图片数据转换成 base64 的字符串,就可随意传送。 当接到回图片 Base64 的图片数据时,可以通过 Base64ToImg(string imgbase64);转换成sprite,这样就可以放到游戏中显示出来。 * 图片存到本地 copPoto(); 拍照功能,自定保存到本地 Assets/StreamingAssets/photo/ 路径下 还可以使用 PhotoCam.save(); 保存你的图片,可以指定目录。 delete(); 册除本地的图片。 *   #### 如何接入硬件配置? 是否能正确与硬件通信,这一步骤比较关键。 通常我们需要写一些功能现com 接口进行通信,使用到系统com接口组件。 本框架同样需要使用到系统com接口组件,来完成的,只是封装了结构通过配置来完成驱动最后转换成事件驱动输出。 ![流程图](/Document/images/comdataevent.png) 我们需要用到三种配置文件,完成自动化处理过程。 配置存放目录 : assets/StreamingAssets/KFConfig/   1. **com 接口配置, 只要与com接口通信息都需要配置这些信息。** 接口名,比特率,数据位等。是否能接收到数据这是很关键的。 文件:kfseralportconfig.ini KFGF 技持多COM接口绑定,配置使ini格式配置。每一个组为一个接口配置。 [COM_1] //接口配置组一组一个配置 name =COM1 //配置的名字 enter =true //这个接口配置是否生效 comName=com5 //接口的名字 在系统中可以查到 baudRate=115200 //比特率 dateBit=8 //数据位 一般为8 flowControl=0 //流控制 parity =0 //奇偶校验 stopBit=1 //停止位 formatType =07 //检验有效数据 方式 16进制 formatLangth=18 //检验有效数据 固定长度 数字 formatStart=AA //检验有效数据 固定起始值 16进制 当数据有固定开始 formatEnd=CD //检验有效数据 固定结束值 16进制 当数据有固定结束 formatSizeIndex=1 //检验有效数据 数据长度位 位置 当数据是不固定长度 formatParity=N+1 //检验有效数据 校验方法 名字 formatSendParity=CRC_HL //发送数据时添加校验方法 formatType 参数据说明,使用十六进制格式 | 参数数值 | 描述作用意义 | | ---- | ---- | | 0x01 | formatLangth 起作用,需要配置止参数,固定长 | | 0x02 | formatStart 起作用,需要配置止参数 ,接数据都帧头,必不可少| | 0x04 | formatEnd 起作用,需要配置止参数 ,带固定结束符 | | 0x08 | formatSizeIndex 起作用,需要配置止参数 ,接收数据是不固定长度的,通常需要使用长度控制| | 0x10 | formatParity 起作用 ,需要配置止参数,| | 0x20 | formatSendParity 起作用,需要配置止参数 ,强制在发送数据时,数据后面的自动添加验证| 参数数值设置方法 把所需的数值相加得到16进制值就是需要设置的值 例:接口数据需要验证 “固定开始值”和“固定结束” 和“固定长度" 0x01+0x02+0x04 =0x07 设置 formatType=07   2. **解析配置,接口事件 告诉KF 如何接收 com 发过来的信息。** 配置文件: kfseralportevents.ini [event_coin1] //接口事件组 一组一个事件 com =COM1 //接口配置的名字 指数据来自那个接口 tag =1 //添加标签 enter =true //当启动时,启作用,如果只是模板,设为 false type=read //接口事件类型 从设备读取[read] 发送到设备 [write] name=InCoin //事件名字 通过名字查找事件 dataType =07 //检验数据 类型 16进制 dataIndex=18 //事件数据检验起始位置 dataLength=1 //数据长度 通常是1bit checkdata=0A //检验信号值 16进制 只有位置包这个值才是有效信息 des = 1号投币器投币 //描述信息,帮助检查是否配置正确 templateData = AA51330000012CD //发送数据模板 当type=write 时才有作用 sendnumber=5 //连续发送多少次数据 sendtime =0.1 //持续发送数据多长时间 fiterName =Ticket_Back //事件名称 通过设备返回信息进行计数 isEnd=true //是否是结束事件 EndDataName=Ticket_stop //停止事件,当事件完成后,需isEnd=true 当停止时需要发送停止事件 dataType 参数据说明,使用十六进制格式. 为了事件起作,需要对数据进行一些检验的方法,让事件生产 当type=read 时作用如下 | 数值 | 描述作用 | | ---- | ---- | | 0x01 | 任意内容,数据内容可以是任意值,符合数据格式的所有数据 一但有信号就会发出信息包含0x00,一般用于持续输出信号 | | 0x02 | 包函值 ,与checkdata数据相同 ,对比相同字符段 开始位置和字符段 | | 0x04 | 非0x00 值, 字符段 ,开始位置 和段长度 (按下时持续接收信信号)直到收到0x00停止 | | 0x08 | 开关型,与checkdata数据相同发出一次 ,取消数据时发出一次, 发出二个信号开和关 ,可以通过ischeck判断是开还是关,开始位置,和字符段 (如:键盘, 按钮按下和弹起二个事件)| | 0x10 | 轮值型,只发生变动时的信号,开始位置,和段长度 (变换灯) | | 0x20 | 最新数据,信号最后一次收到的数据的。接收信息不及时情况,拿最新的数据,不是历史数据,丢失历史包, 开始位置和段长 (如:方向盘 持续并复盖得最新的值) | 当type=write 时作用如下 | 数值 | 描述作用 | | ---- | ---- | | 0x01 | 持续发送,直到有事件停止,或主动让他停下来 | | 0x02 | 计时发送,sendtime 起作用,需要配置止参数,时间到后自动停止 | | 0x04 | 计数发送,sendnumber 起作用,需要配置止参数, 自动停止| | 0x10 | 合并模式,同时发送的数据,通过合并后统一发送| | 0x20 | 批次模式, 分批次发送,不进行合并 | | 0x40 | 独占模式,同一时间只有止数据发送,直到止数据完成停止,其他数据才能被发送 | | 0x80 | 回调事件计数, 能接收事件进行计算被返多少次,直到完成后自动停止 |   3. **事件转换配置, 解析正确的数据将获得一个事件** 那么这个事件需要发送出去,需要转换成 KFEvent 事件,发给KF事件管理器代理发送事件,这样在我们的游戏里注册侦听就可以接收到 KFEvent 事件。 配置文件: kfseralporteventstofkevent.ini [event_coinevent] // 一组一个事件 fromevent =backview //接口事件名 toevent=KFE_SCENT_BACKVIEW_OPEN //KFEvent 事件名 游戏中通过名字识别事件 可自定义 type =KFE_TYPE_DEFAULT // KFEvent 类型 游戏接收分类处理,可自定义 tag=12 //标签 des =07 //描述备注 通过这个配置,才能接口事件配置的事件生效,否则需要到代码中主动启动侦听才启作用 #### 任务 框架提供任务管理功能服务。KFTaskManager管理 IKFTask接口,由框架配置一些常规任务 * 启动事运行 * 定时间隔运行 * 关闭游戏前运行 * 自定义推送运行 * 清空所有任务 * 添加任务 * 移除指定任务 * 运行指定任务   #### 场景管理 * 关卡场景管理 * 加载 * 预加载   #### 后台 * 启动后台 通常情况下 F12 启动后台 * 后台界面设置 * 统计 通常需要使用到一些数据记录,并统计。后台统计是报表形式展示,比如 投币量,吐票量,得分情况等。   * 设置 ![设置样式](/Document/images/backSetting.png) 通过发布游戏后,启动设置页可以设置一些参数据供游戏动态使用的的功能。 代码中读取配置的值 KF.kf.setting.temValue(string name); KF.kf.setting.ItemBool(string name); KF.kf.setting.ItemIntegre(string name); KF.kf.setting.ItemDouble(string name); KF.kf.setting.ItemFloat(string name); 需要对应的类型使用。需要更多的内容项,可以在配置中添加。 使用的功能类 KFSetting 如有关API 可以查阅原码   * 添加后功能页   #### 网络 HTTP网络 发送数据,接收数据,网络地址 Socket 网络     ###发布 ##### 授权 授权发布:如需要对游戏进行授权才能运行应用,需要配合授权服务程序。否则你的游戏启动不成功。 默认是不授权,如需要授方式, 需要在游戏启动初始框架后,设置 ` KF.authentication=true; ` 发布后,程序就不能直接运行了。需要授权应程序来运行,授权应用程序请链接进我的 _授权应用程序_   #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request   #### 特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)