gameUnity 网络游戏框架
常常在想,有没有好的方式,让开发变得简单,让团队合作更加容易。
于是,某一天 动手写一个 架构, 目前版本 暂定 0.1 版本。(unity5.0.0f4 版本以上)
我打算 开源出来
0.1有什么功能?
首先类结构图

前台包括:事件类,视图逻辑类,单例数据类
后台包括:私聊,公聊,人机通信
如何二次开发?
参考view 文件夹。
举例
FamilyView.cs
FamilyCommand.cs
using UnityEngine;
using System.Collections;
using System;
using System.ComponentModel;
using WebSocket4Net;
using LitJson;
using UnityEngine.UI;
using System.Collections.Generic;
using System.Text.RegularExpressions;
/// <summary>
/// 主界面
/// </summary>
public class FamilyView : FamilyCommand
{
public Queue<JsonData> JsonList;
public Transform Button; //绑定一个按钮,推荐(单层界面中使用)
public Transform Button1; //绑定一个按钮,推荐(单层界面中使用)* 注意如果是列表,那么必须每个item一个view类
public Transform Button2; //绑定一个按钮,推荐(单层界面中使用)* 注意如果是列表,那么必须每个item一个view类 void Start()
{
JsonList = GameModel.getInstance().JsonList;
addlistener();//添加视图层监听
addListenerSocket();//添加服务器监听 FamilyView.Get(Button.gameObject).onClick = ButtonClick;
FamilyView.Get(Button1.gameObject).onClick = Button1Click;
FamilyView.Get(Button2.gameObject).onClick = Button2Click; } //弹出 换装系统
private void Button2Click(GameObject obj)
{
SendWeapon(this);
} //ugui 事件测试 按钮点击
private void ButtonClick(GameObject obj)
{
//Despawner(gameObject, 0.1f);//删除战斗界面 可以自动删除监听
SendEvent(this);
}
//ugui 事件测试 按钮点击
private void Button1Click(GameObject obj)
{
SendSocketEvent(this);
} // Update is called once per frame
void Update()
{
//通过队列,获得服务器数据
if (JsonList.Count > )
{
JsonData mes = JsonList.Dequeue();
SplitDisposal(mes);//拿到数据,处理 ,并删除队列
}
} //登录返回的数据
public override void user_login_return(JsonData jsontext)
{
//如果需要 特殊处理 ,比如脏话 变星号
base.user_login_return(jsontext); print(jsontext.ToJson());
JsonList.Enqueue(jsontext);// 加入队列
} //回调服务器事件 聊天信息(测试)
public override void user_chat_return(JsonData jsontext)
{
//如果需要 特殊处理 ,比如脏话 变星号
base.user_chat_return(jsontext);
print(jsontext["username"] + "== 异步得到服务器数据,但unity只能同步赋值===" + jsontext["for"]);
JsonList.Enqueue(jsontext);// 加入队列
} //回调视图 事件
public override void ActionHandle(JsonData jsontext)
{
print("委托事件得来的数据:" + jsontext["Agreement"] + "" + jsontext["username"] + "" + jsontext["message"]);
} void OnDestroy()
{
removelistener();//删除视图监听
removeListenerSocket();//删除服务器监听
}
}
using UnityEngine;
using System.Collections;
using System;
using System.ComponentModel;
using WebSocket4Net;
using LitJson;
using UnityEngine.UI;
using System.Collections.Generic;
using System.Text.RegularExpressions; public class FamilyCommand : SocketEvent
{ //中英文 字符识别
public void Character_processing(string str)
{
Regex regChina = new Regex("^[^\x00-\xFF]");
if (regChina.IsMatch(str))
{
print("中文");
}
else
{
print("其他");
}
} //服务端返回后,数据赋值这里处理
public void SplitDisposal(JsonData jsontext)
{
String Agreementstr = jsontext["Agreement"].ToString();
switch (Agreementstr)
{
case Agreement.user_chat_return: print(jsontext["username"] + "--服务器数据 同步---------" + jsontext["for"]);
break;
case Agreement.user_login_return://登录
//角色基础值
OnNameperson(jsontext);
//头盔
OnHelmet(jsontext);
//护肩
OnPauldron(jsontext);
break;
default: break;
}
}
//角色基础值
public void OnNameperson(JsonData jsontext)
{
Dictionary<string, GamePerson> GamePersonDictionary = GameModel.getInstance().GamePersonDictionary;
for (int i = ; i < ; i++)
{
string nameperson = "person" + i;
string PersonId = jsontext[nameperson]["PersonId"].ToString(); GamePerson gamePerson = new GamePerson();
gamePerson.Attack = jsontext[nameperson]["Attack"].ToString();
gamePerson.Defense = jsontext[nameperson]["Defense"].ToString();
gamePerson.Distance = jsontext[nameperson]["Distance"].ToString();
gamePerson.Life = jsontext[nameperson]["Life"].ToString();
gamePerson.Anger = jsontext[nameperson]["Anger"].ToString();
gamePerson.HelmetId = jsontext[nameperson]["HelmetId"].ToString();
gamePerson.PauldronId = jsontext[nameperson]["PauldronId"].ToString(); GamePersonDictionary.Add(PersonId, gamePerson);
}
GameModel.getInstance().userplay.Gold = jsontext["Gold"].ToString();
GameModel.getInstance().userplay.Diamonds = jsontext["Diamonds"].ToString(); } //护肩
public void OnPauldron(JsonData jsontext)
{
for (int i = ; i < ; i++)
{
string Pauldron = "Pauldron" + i.ToString(); // print(jsontext[Pauldron]["PauldronId"]); //护肩id
// print(jsontext[Pauldron]["Attack"] + " " + jsontext[Pauldron]["Defense"] + "" + jsontext[Pauldron]["Distance"]);
string MagicGemType = "MagicGemType" + i.ToString();
for (int j = ; j < ; j++)
{
// print(jsontext[Pauldron][MagicGemType]);//魔法宝石
}
}
}
//头盔
public void OnHelmet(JsonData jsontext)
{
Dictionary<string, WeaponHelmet> WeaponHelmetDictionary = GameModel.getInstance().WeaponHelmetDictionary;
//头盔
for (int i = ; i < ; i++)
{
string Helmet = "Helmet" + i.ToString();
string HelmetId = jsontext[Helmet]["HelmetId"].ToString();//头盔id
string MagicGemType = "MagicGemType" + i.ToString(); WeaponHelmet weaponHelmet = new WeaponHelmet();
weaponHelmet.Attack = jsontext[Helmet]["Attack"].ToString();
weaponHelmet.Defense = jsontext[Helmet]["Defense"].ToString();
weaponHelmet.Distance = jsontext[Helmet]["Distance"].ToString(); for (int j = ; j < ; j++)
{
weaponHelmet.MagicGemType1 = jsontext[Helmet][MagicGemType].ToString();
} WeaponHelmetDictionary.Add(HelmetId, weaponHelmet);
}
} //弹出换装系统
public void SendWeapon(FamilyView familyView)
{
Spawner("CanvasWeaponScene"); } //(测试)某个unity 事件类
public void SendEvent(FamilyView familyView)
{
//用过 familyView 获得组件上的 数据, 赋给 JsonData
if (OnDelegateEvent().callbackEvent != null)
{
//实例化自定义类和 协议
JsonData message = new JsonData();
message["Agreement"] = "weewewwe"; //这里的值 可以通过actionView 获得,也可以通过GameModel得到
message["username"] = "";
message["message"] = "哈哈哈";
OnDelegateEvent().callbackEvent(Protocol.Action, message);
}
}
private WebSocket ws;
public void SendSocketEvent(FamilyView familyView)
{
ws = GameModel.getInstance().socketModel.websocket;
JsonData message = new JsonData();
message["Agreement"] = Agreement.user_public_chat_return;
message["username"] = GameModel.getInstance().userplay.play_name;
ws.Send(message.ToJson());//这个是发到消息端
}
}
前后台 事件和unity内部事件,都是通过协议来 分配的。
内部事件:DelegateSubEvent类中 分配
socket事件 :SocketEvent 类中分配
下一个版本,加入动画事件,以及四叉树 范围监测处理(假设渲染不限制,可以让几千人 智能对战)。
gameUnity 网络游戏框架的更多相关文章
- gameUnity 0.2 网络游戏框架(计划)
能说的就是 请大家都耐心等待,不做国产垃圾,只追求国外经典,这就是 这套框架未来的发展 一:2d 3d场景融合 人物移动 2d 3d 层 移动 有差值(共6层,2d天空层.前景3d物体层有 景深), ...
- gameUnity 0.15 beta 网络游戏框架
增加了 换人 和换衣服 ,加入了动画事件.beta版本 0.15测试版本 目前就到此,正式版本 会在7月底 和 0.2版本一起推出.届时,换装系统 将不仅仅是 换装备,而是有 换装后 打怪的体验,更 ...
- gameUnity 0.15alpha 网络游戏框架
在重要版本 0.2之前,先 出一个 0.15alpha 版本热热身. 0.15主要是添加了 动画事件 和一些 动画特效的类,比如快进,慢进,(类似被冰冻效果),但这些都不在这个 alpha版本中出现 ...
- GameUnity 2.0 发布倒计时
万众期待的 gameunity 网络游戏框架 已经完成了,现在在最后的检验调试阶段. 因为版本 改动非常之大,所以 版本号 从0.2版本 改成 2.0版本. gameunity事件部分,一如既往保持高 ...
- 基于C/S架构的3D对战网络游戏C++框架_【不定期更新通知】
由于笔者最近有比赛项目要赶,这个基于C/S架构的3D对战网络游戏C++框架也遇到了一点瓶颈需要点时间沉淀,所以近一段时间不能保证每天更新了,会保持不定期更新.同时近期笔者也会多分享一些已经做过学过的C ...
- 基于C/S架构的3D对战网络游戏C++框架_01服务器端与客户端需求分析
本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...
- 基于C/S架构的3D对战网络游戏C++框架_06搭建C/S架构的基本通信框架(尚未写完会重新编辑后再发出)
本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...
- 基于C/S架构的3D对战网络游戏C++框架_05搭建系统开发环境与Boost智能指针、内存池初步了解
本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...
- 基于C/S架构的3D对战网络游戏C++框架_04客户端详细设计与OpenGL、Qt基础
本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...
随机推荐
- 1077. [NOIP2010冲刺六] 数列游戏
[题目描述] 小M很喜欢找点游戏自娱自乐.有一天,她在纸上写了一串数字:1,1,2,5,4.接着她擦掉了一个1,结果发现剩下1,2,4都在自己所在的位置上,即1在第1位,2在第2位,4在第4位.她希望 ...
- JQ和其他框架一起使用方法
时下,越来越多的javascripe框架不断崛起,同时开源网站系统也之间增多.网站建设过程中当使用一些开源的网站程序时,免不了会在javascript上产生冲突.也许网站的开发者习惯使用jQuery, ...
- 常用 ajax js 表单
$(function () { /** * 图片点击放大处理 */ $('.mini_img').click(function () { $(this).hide().next().show(); } ...
- Zend Studio配合Xdebug调试
以下配置均在windows环境下. 1.下载xdebug 使用phpinfo()查看当前php的版本信息: 到xdebug下载页面下载对应的xdebug版本: 将解压出的php_xdebug-2. ...
- xp添加右键"打开文件所在位置"
以下代码保存为czmb.vbs文件并放在C:\windwos目录下: Set OS = GetObject("winmgmts:\\.\root\cimv2")Set CF = O ...
- BITMAP图片压缩算法三则--bilinear、nearest、cubic
原文:http://blog.chinaunix.net/uid-253932-id-3037805.html 工作需要,要弄截图且缩小.截图倒是好说,WIN API可以搞定,但是缩小且尽量不失真,这 ...
- 【2】docker 与UFW
ufw是一个主机端的iptables类防火墙配置工具. 1.查看ufw的状态:ufw status 2.如果使用UFW,需要对其进行修改才能让DOCKER工作.docker使用一个网桥来管理容器中的网 ...
- 样式的操作-不同浏览器加载不同的css文件
———————————————————— <script type="text/javascript"> //body加载事件监听函数 ...
- nodejs全局安装与本地安装区别
本地安装 1. 将安装包放在 ./node_modules 下(运行 npm 命令时所在的目录),如果没有 node_modules 目录,会在当前执行 npm 命令的目录下生成 node_modul ...
- 开始工作----微信通过get检查当前网站---是否可用
01开发者--基本配置--url服务器地址---填写好--需要开通微信接口的域名 http://www.cctv.com/xxx.php文件 xxx.php文件 01参考wx_sample.php 0 ...