【全栈环境搭建】Fantasy和ZMFrameWork整合

 1.环境搭建

一、Fantasy框架下载1.https://github.com/qq362946/Fantasy.git2.修改 Fantasy/examples/Server/Main/NLog.config 配置打印日志文件:<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"><targets async="true"><target name="ServerDebug" xsi:type="File"encoding="UTF-8"createDirs="true"autoFlush="false"keepFileOpen="true"concurrentWrites="true"openFileCacheTimeout="30"openFileFlushTimeout="60"fileName="${basedir}/../Logs/Server/Server${date:format=yyyyMMdd}/${logger}.${var:appId}.${date:format=yyyyMMddHH}.Debug.log"layout="${longdate} ${callsite:className=false:methodName=false:fileName=true:includeSourcePath=false:skipFrames=2} ${message}"/></targets><targets async="true"><target name="ServerInfo" xsi:type="File"encoding="UTF-8"createDirs="true"autoFlush="false"keepFileOpen="true"concurrentWrites="true"openFileCacheTimeout="30"openFileFlushTimeout="60"fileName="${basedir}/../Logs/Server/Server${date:format=yyyyMMdd}/${logger}.${var:appId}.${date:format=yyyyMMddHH}.Info.log"layout="${longdate} ${callsite:className=false:methodName=false:fileName=true:includeSourcePath=false:skipFrames=2} ${message}"/></targets><targets async="true"><target name="ServerWarn" xsi:type="File"encoding="UTF-8"createDirs="true"autoFlush="false"keepFileOpen="true"concurrentWrites="true"openFileCacheTimeout="30"openFileFlushTimeout="60"fileName="${basedir}/../Logs/Server/Server${date:format=yyyyMMdd}/${logger}.${var:appId}.${date:format=yyyyMMddHH}.Warn.log"layout="${longdate} ${callsite:className=false:methodName=false:fileName=true:includeSourcePath=false:skipFrames=2} ${message}"/></targets><targets async="true"><target name="ServerError" xsi:type="File"encoding="UTF-8"createDirs="true"autoFlush="false"keepFileOpen="true"concurrentWrites="true"openFileCacheTimeout="30"openFileFlushTimeout="60"fileName="${basedir}/../Logs/Server/Server${date:format=yyyyMMdd}/${logger}.${var:appId}.${date:format=yyyyMMddHH}.Error.log"layout="${longdate} ${callsite:className=false:methodName=false:fileName=true:includeSourcePath=false:skipFrames=2} ${message}"/></targets><targets async="true"><target name="ServerTrace" xsi:type="File"encoding="UTF-8"createDirs="true"autoFlush="false"keepFileOpen="true"concurrentWrites="true"openFileCacheTimeout="30"openFileFlushTimeout="60"fileName="${basedir}/../Logs/Server/Server${date:format=yyyyMMdd}/${logger}.${var:appId}.${date:format=yyyyMMddHH}.Trace.log"layout="${longdate} ${callsite:className=false:methodName=false:fileName=true:includeSourcePath=false:skipFrames=2} ${message}"/></targets><targets async="true"><target name="ConsoleColor" xsi:type="ColoredConsole"useDefaultRowHighlightingRules="false"layout="${longdate} ${callsite:className=false:methodName=false:fileName=true:includeSourcePath=false:skipFrames=2} ${message}"><highlight-row condition="level == LogLevel.Debug" foregroundColor="DarkGreen" /><highlight-row condition="level == LogLevel.Info" foregroundColor="Gray" /><highlight-row condition="level == LogLevel.Warn" foregroundColor="Yellow" /><highlight-row condition="level == LogLevel.Error" foregroundColor="DarkRed" /><highlight-row condition="level == LogLevel.Fatal" foregroundColor="Red" /></target></targets><rules><!-- 控制台 调试或编辑器启动的时候会调用--><logger ruleName="ConsoleTrace" name="Server" level="Trace" writeTo="ConsoleColor" /><logger ruleName="ConsoleDebug" name="Server" level="Debug" writeTo="ConsoleColor" /><logger ruleName="ConsoleInfo" name="Server" level="Info" writeTo="ConsoleColor" /><logger ruleName="ConsoleWarn" name="Server" level="Warn" writeTo="ConsoleColor" /><logger ruleName="ConsoleError" name="Server" level="Error" writeTo="ConsoleColor" /><!-- 服务端日志输出文件 发布到服务器后会调用--><logger ruleName="ServerDebug" name="Server" level="Debug" writeTo="ServerDebug" /><logger ruleName="ServerTrace" name="Server" level="Trace" writeTo="ServerTrace" /><logger ruleName="ServerInfo" name="Server" level="Info" writeTo="ServerInfo" /><logger ruleName="ServerWarn" name="Server" level="Warn" writeTo="ServerWarn" /><logger ruleName="ServerError" name="Server" level="Error" writeTo="ServerError" /></rules>
</nlog>二、客户端下载1.下载铸梦三件套: https://github.com/ZMteacher/ZMFrameWork2.删除Fantasy下的客户端Fantasy\examples\Client\Unity3.把ZMFrameWork/ZMFrameWork 重命名为 ZMFrameWork/Unity, 放到之前删除的Unity目录 三、修改FantasyZMFrameWorkDemo\Fantasy\.gitignore内容,增加#############其它配置##################!examples/Client/Unity/Assets/ZMPackages/Library四、客户端导入Fantasy框架客户端包Window->Package Manager->Add package from disk->Fantasy\Fantasy.Unity\Fantasy.Unity\package.json五、修改 Client\Unity\Packages\manifest.json下的引用为相对路径"com.fantasy.unity": "file:../../../../Fantasy.Unity/Fantasy.Unity",六、生成前后端协议把 Fantasy\examples\Tools\NetworkProtocol\Run.bat 建立快捷键 协议.bat,放到桌面上,点击生成前后端协议七、服务器导入配置扩展包: Fantasy\Fantasy.Packages\Fantasy.ConfigTable八、生成策划配置Fantasy\examples\Tools\ConfigTable\Run.bat 建立快捷键 Excel.bat, 放到桌面上, 点击生成配置(TODO 目前看客户端配置生成有点问题)九、Main.cs // 客户端入口初始化ZMAssetFrameWork // Awake资源热更  // Start初始化ZMUIFrameWork进入HallWorld弹出LoginWindow登录界面 // SampleScene/GameMain/UIRoot/LoginWindow笔记:各种的初始化顺序的定制:Assets/ZMPackages/ZMGCFrameWork/Runtime/HallWorldScriptExecutionOrder.csPrefabMain下的各种Window快速拖拽模板:Assets\ZMPackages\ZMUI\ThirdLibrary\UGUI-Editor\PrefabsModelAB包路径配置:    Assets/ZMPackages/ZMAsset/AssetsPathConfig.cs生成的Prefab的位置:    Assets/GameData/Hall/Prefabs/Window生成的脚本的位置:Assets/Scripts/HallWorld

2.客户端常用模块

1.pb和json互转

using Newtonsoft.Json;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class ProtoBuffConvert
{public static void ToJson<T>(T proto){Debug.Log(typeof(T).Name + JsonConvert.SerializeObject(proto));}public static void PrintRequest<T>(T proto){Debug.Log("->>>" + typeof(T).Name + JsonConvert.SerializeObject(proto));}public static void PrintResponse<T>(T proto){Debug.Log("<<<-" + typeof(T).Name + JsonConvert.SerializeObject(proto));}
}

2.网络模块封装

using System;
using Fantasy;
using Fantasy.Async;
using Fantasy.Network;
using Fantasy.Network.Interface;
using UnityEngine;public class NetworkManager
{private static NetworkManager _instance;public static NetworkManager Instance{get{if (_instance == null){_instance = new NetworkManager();}return _instance;}}private Scene _scene;private Session _session;public async FTask Init(){Fantasy.Platform.Unity.Entry.Initialize(GetType().Assembly);_scene = await Fantasy.Platform.Unity.Entry.CreateScene();Debug.Log("Fantasy Init");}public void Connect(string url, Action successAction = null){Debug.Log($"开始连接服务器url={url}");_session = _scene.Connect(url, //NetworkProtocolType.KCP, // async () =>{Debug.Log($"连接服务器url={url}成功!!!");_session.AddComponent<SessionHeartbeatComponent>().Start(3000);successAction?.Invoke();},() => { Debug.Log($"连接服务器url={url}失败!!!"); }, //() => { Debug.Log($"与服务器url={url} 断开连接!!!"); }, //false, //2000 //);}public void Send<MSG>(IMessage message) where MSG : IMessage{ProtoBuffConvert.PrintRequest((MSG)message);_session.Send(message);}public async FTask<RES> SendCallMessage<REQ, RES>(IRequest request) where REQ : IRequest where RES : IResponse{ProtoBuffConvert.PrintRequest((REQ)request);RES response = (RES)await _session.Call(request);ProtoBuffConvert.PrintResponse(response);return response;}public void Disconnect(){_session.GetComponent<SessionHeartbeatComponent>().Stop();_session.GetComponent<SessionHeartbeatComponent>().Dispose();_session.Dispose();}
}

3.http模块封装

using System;
using System.Collections;
using Fantasy.Async;
using Newtonsoft.Json;
using UnityEngine;
using UnityEngine.Networking;public class HttpManager
{private static HttpManager _instance;public static HttpManager Instance{get{if (_instance == null){_instance = new HttpManager();}return _instance;}}public async FTask<string> Post(string url, object data){UnityWebRequest request = new UnityWebRequest(url, "POST");string jsonData = JsonConvert.SerializeObject(data);request.uploadHandler = new UploadHandlerRaw(System.Text.Encoding.UTF8.GetBytes(jsonData));request.uploadHandler.contentType = "application/json";request.downloadHandler = new DownloadHandlerBuffer();await request.SendWebRequest();if (request.result == UnityWebRequest.Result.Success){return request.downloadHandler.text;}else{return null;}}
}

4.网络和http模块使用

 public void OnLoginButtonClick(){string OpenId = dataCompt.AccountIdInputField.text;if (string.IsNullOrEmpty(OpenId)){Debug.LogError("OpenId为空!!!");return;}GetUserIdRequest request = new GetUserIdRequest(){OpenId = OpenId,};Action action = async () =>{string responseJsonData = await HttpManager.Instance.Post(Constant.httpUrl, request);if (responseJsonData == null){Debug.LogError($"httpUrl={Constant.httpUrl}请求错误");return;}GetUserIdResponse response = JsonConvert.DeserializeObject<GetUserIdResponse>(responseJsonData);HallWorld.GetExitsDataMgr<StartDataMgr>().AccountId = response.AccountId;NetworkManager.Instance.Connect(response.GateUrl, async () =>{G2C_LoginResponse g2CLoginResponse = await HallWorld.GetExitsMsgMgr<StartMsgMgr>().SendC2G_LoginRequest();HallWorld.GetExitsDataMgr<StartDataMgr>().DRoleList = g2CLoginResponse.DRoles;// 切换界面UIModule.Instance.DestroyAllWindow();UIModule.Instance.PopUpWindow<HomeWindow>();});};action.Invoke();}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/19227.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

w043基于springboot的“衣依”服装销售平台的设计与实现

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0…

【计算机网络安全】湖北大学-mysql事务隔离性实验

参考数据库实验&#xff1a;并发控制实验&#xff08;MySQL&#xff09;-CSDN博客&#xff0c;大佬写的很好 实验环境 实验需要mysql环境&#xff0c;如果我们本机有mysql客户端&#xff0c;或者安装过phpstudy都可以直接用&#xff0c;Kali似乎也有。 本机启动phpstudy&…

UE5 猎户座漂浮小岛 08 构造脚本

视频教程 90后小陈老师的个人空间-90后小陈老师个人主页-哔哩哔哩视频 1.构造脚本 1.1 简介 类似构造函数代码创建多个效率高 1.2 添加静态网格体 1.3 散乱立方体 使用for循环生产10个立方体 随机位置生成10个散乱的立方体 1.4 整齐立方体 1.5 随机物体 1.6 样条实现曲度墙…

OpenHarmony-2.DeviceInfo适配

DeviceInfo适配说明 1.启动子系统设备信息说明 2.OHOS 2.1.OHOS 固定值参数适配 OHOS 固定值参数: const.ohos.version.security_patch const.ohos.releasetype const.ohos.apiversion const.ohos.fullname适配说明&#xff1a; OHOS 固定值参数由OHOS系统填充&#xff0…

【电机控制】数学——微分

【电机控制】数学——微分 文章目录 [TOC](文章目录) 前言一、导数二、梯度三、▽算子四、散度四、旋度五、积规则a.函数求导1、函数之和求导2、函数与常数求导3、两个函数乘积求导4、一个函数除以一个函数求导 b.矢量函数求导1.构造标量2.构造矢量 c.梯度求导d.散度求导e.旋度…

day04(单片机高级)硬件基础

目录 硬件基础 初级硬件工程师 中级硬件工程师 高级硬件工程师 需要学习的知识点 硬件基础 初级硬件工程师 了解数字电路、模拟电路知识&#xff0c;熟悉常用电子元器件的性能原理&#xff1b; 熟悉PCB设计流程和规范&#xff08;华为&#xff09;&#xff0c;熟悉Altium Desig…

Nginx 使用入门介绍

大家好&#xff0c;我是G探险者&#xff01; 今天聊一聊nginx. Nginx 是一款高性能的 Web 服务器、反向代理服务器以及负载均衡器。它因其轻量级、稳定性和高并发处理能力&#xff0c;在全球范围内得到了广泛应用。许多大型网站&#xff08;如 Netflix、Dropbox 和 WordPress…

停车场空位引导系统

随着城市化进程的加速和汽车保有量的持续增长&#xff0c;传统停车场面临着前所未有的压力。在这些停车场中&#xff0c;停车困难与寻找自己的停车位麻烦复杂已成为许多驾驶者日常出行的一大痛点。 一.传统停车场痛点 在传统停车场中&#xff0c;车位难找&#xff0c;停车场缺…

([LeetCode仓颉解题报告] 661. 图片平滑器

[LeetCode仓颉解题报告] 661. 图片平滑器 一、 题目1. 题目描述2. 原题链接 二、 解题报告1. 思路分析2. 复杂度分析3. 代码实现 三、 本题小结四、 参考链接 一、 题目 1. 题目描述 2. 原题链接 链接: 661. 图片平滑器 二、 解题报告 1. 思路分析 由于只需要3*39个格子&am…

SpringCloud多机部署,负载均衡-LoadBalance

一.负载均衡 1.1问题描述 //根据应用名称获取服务列表 List<ServiceInstance> instancesdiscoveryClient.getInstances("product-service"); //一个微服务可能有多个实例&#xff0c;获取第一个 EurekaServiceInstance instance(EurekaServiceInstance)insta…

基于Java Springboot甘肃旅游管理系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…

软考-信息安全-网络安全体系与网络安全模型

4.1 网络安全体系概述 网络安全保障是一项复杂的系统工程&#xff0c;是安全策略&#xff0c;多种技术&#xff0c;管理方法和人员安全素质的综合。 4.1.1 网络安全体系概念 现代的网络安全问题变化莫测&#xff0c;要保障网络系统的安全&#xff0c;应当把相应的安全策略&a…

CSS基础选择器与div布局

基础选择器一 全局选择器 可以与任何元素匹配&#xff0c;优先级最低&#xff0c;不推荐使用 *{margin: 0;padding: 0;}元素选择器 HTML文档中的元素&#xff0c;p、b、div、a、img、body等。 标签选择器&#xff0c;选择的是页面上所有这种类型的标签&#xff0c;所以经常…

Python毕业设计选题:基于Spark的国漫推荐系统的设计与实现-django+spider

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 系统登录 管理员功能界面 漫画数据管理 看板界面 系统管理 摘要 系统的设计主要包括…

Linux 链式与层级中断控制器讲解:原理与驱动开发

往期内容 本专栏往期内容&#xff0c;interrtupr子系统&#xff1a; 深入解析Linux内核中断管理&#xff1a;从IRQ描述符到irq domain的设计与实现Linux内核中IRQ Domain的结构、操作及映射机制详解中断描述符irq_desc成员详解Linux 内核中断描述符 (irq_desc) 的初始化与动态分…

“数字化”让党建更“智慧”:帆软塑造党建发展新动能

智慧党建是新时代党的建设的重要创新&#xff0c;它通过互联网、大数据、云计算和人工智能等现代信息技术&#xff0c;实现了党建工作的数字化、智能化。帆软公司的Fine产品线&#xff0c;包括FineDataLink、FineReport、FineVis和FineBI&#xff0c;提供了一个全面的大数据分析…

利用c语言详细介绍下冒泡排序

软件开发过程中&#xff0c;排序算法是常规且使用众多的方法之一&#xff0c;而冒泡算法又是排序算法中最常规且基本的算法。今天我们利用c语言&#xff0c;图文详细介绍下冒泡算法。 一、图文介绍 我们输入一个数组&#xff0c;数组为【10&#xff0c;5&#xff0c;3&#xf…

小程序-基于java+SpringBoot+Vue的实习生管理系统设计与实现

项目运行 1.运行环境&#xff1a;最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境&#xff1a;IDEA&#xff0c;Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境&#xff1a;Tomcat 7.x,8.x,9.x版本均可 4.硬件环境&#xff1a…

全新升级抗性宏基因组,直击病毒和毒力因子分析!

基于宏基因组测序的抗性基因分析是目前抗性基因分析的重要手段。为了协助研究工作者对抗性基因开展更深入且全面的探研&#xff0c;凌恩生物技术团队致力于技术研发&#xff0c;推出了全新升级版的宏基因组抗性基因分析流程。此流程采用五大数据库进行详尽的注释分析&#xff0…

算法--“汽车加油”问题.

def greedy():n 100 # 汽车满油后可行驶的最大距离d [50, 80, 39, 60, 40, 32] # 加油站的距离k len(d) # 加油站的数量# 检查是否有加油站距离超过汽车的最大行驶距离for dist in d:if dist > n:print(no solution)returnnum 0 # 加油次数current_position 0 # 当…