常常在想,有没有好的方式,让开发变得简单,让团队合作更加容易。

于是,某一天 动手写一个 架构, 目前版本 暂定 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 网络游戏框架的更多相关文章

  1. gameUnity 0.2 网络游戏框架(计划)

    能说的就是 请大家都耐心等待,不做国产垃圾,只追求国外经典,这就是 这套框架未来的发展 一:2d 3d场景融合  人物移动 2d 3d 层 移动 有差值(共6层,2d天空层.前景3d物体层有 景深), ...

  2. gameUnity 0.15 beta 网络游戏框架

    增加了 换人 和换衣服 ,加入了动画事件.beta版本 0.15测试版本 目前就到此,正式版本 会在7月底  和 0.2版本一起推出.届时,换装系统 将不仅仅是 换装备,而是有 换装后 打怪的体验,更 ...

  3. gameUnity 0.15alpha 网络游戏框架

    在重要版本 0.2之前,先 出一个 0.15alpha 版本热热身. 0.15主要是添加了 动画事件 和一些 动画特效的类,比如快进,慢进,(类似被冰冻效果),但这些都不在这个  alpha版本中出现 ...

  4. GameUnity 2.0 发布倒计时

    万众期待的 gameunity 网络游戏框架 已经完成了,现在在最后的检验调试阶段. 因为版本 改动非常之大,所以 版本号 从0.2版本 改成 2.0版本. gameunity事件部分,一如既往保持高 ...

  5. 基于C/S架构的3D对战网络游戏C++框架 _【不定期更新通知】

    由于笔者最近有比赛项目要赶,这个基于C/S架构的3D对战网络游戏C++框架也遇到了一点瓶颈需要点时间沉淀,所以近一段时间不能保证每天更新了,会保持不定期更新.同时近期笔者也会多分享一些已经做过学过的C ...

  6. 基于C/S架构的3D对战网络游戏C++框架 _01服务器端与客户端需求分析

    本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...

  7. 基于C/S架构的3D对战网络游戏C++框架 _06搭建C/S架构的基本通信框架(尚未写完会重新编辑后再发出)

    本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...

  8. 基于C/S架构的3D对战网络游戏C++框架 _05搭建系统开发环境与Boost智能指针、内存池初步了解

    本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...

  9. 基于C/S架构的3D对战网络游戏C++框架 _04客户端详细设计与OpenGL、Qt基础

    本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...

随机推荐

  1. 1077. [NOIP2010冲刺六] 数列游戏

    [题目描述] 小M很喜欢找点游戏自娱自乐.有一天,她在纸上写了一串数字:1,1,2,5,4.接着她擦掉了一个1,结果发现剩下1,2,4都在自己所在的位置上,即1在第1位,2在第2位,4在第4位.她希望 ...

  2. JQ和其他框架一起使用方法

    时下,越来越多的javascripe框架不断崛起,同时开源网站系统也之间增多.网站建设过程中当使用一些开源的网站程序时,免不了会在javascript上产生冲突.也许网站的开发者习惯使用jQuery, ...

  3. 常用 ajax js 表单

    $(function () { /** * 图片点击放大处理 */ $('.mini_img').click(function () { $(this).hide().next().show(); } ...

  4. Zend Studio配合Xdebug调试

    以下配置均在windows环境下. 1.下载xdebug 使用phpinfo()查看当前php的版本信息: 到xdebug下载页面下载对应的xdebug版本:   将解压出的php_xdebug-2. ...

  5. xp添加右键"打开文件所在位置"

    以下代码保存为czmb.vbs文件并放在C:\windwos目录下: Set OS = GetObject("winmgmts:\\.\root\cimv2")Set CF = O ...

  6. BITMAP图片压缩算法三则--bilinear、nearest、cubic

    原文:http://blog.chinaunix.net/uid-253932-id-3037805.html 工作需要,要弄截图且缩小.截图倒是好说,WIN API可以搞定,但是缩小且尽量不失真,这 ...

  7. 【2】docker 与UFW

    ufw是一个主机端的iptables类防火墙配置工具. 1.查看ufw的状态:ufw status 2.如果使用UFW,需要对其进行修改才能让DOCKER工作.docker使用一个网桥来管理容器中的网 ...

  8. 样式的操作-不同浏览器加载不同的css文件

    ———————————————————— <script type="text/javascript">            //body加载事件监听函数       ...

  9. nodejs全局安装与本地安装区别

    本地安装 1. 将安装包放在 ./node_modules 下(运行 npm 命令时所在的目录),如果没有 node_modules 目录,会在当前执行 npm 命令的目录下生成 node_modul ...

  10. 开始工作----微信通过get检查当前网站---是否可用

    01开发者--基本配置--url服务器地址---填写好--需要开通微信接口的域名 http://www.cctv.com/xxx.php文件 xxx.php文件 01参考wx_sample.php 0 ...