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

于是,某一天 动手写一个 架构, 目前版本 暂定 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. 深入JVM锁机制2-Lock

    前文(深入JVM锁机制-synchronized)分析了JVM中的synchronized实现,本文继续分析JVM中的另一种锁Lock的实现.与synchronized不同的是,Lock完全用Java ...

  2. MySQL日志Undo&Redo

    00 – Undo LogUndo Log 是为了实现事务的原子性,在MySQL数据库InnoDB存储引擎中,还用Undo Log来实现多版本并发控制(简称:MVCC). - 事务的原子性(Atomi ...

  3. java中修饰符及其用法

    1. java中的修饰符 a. 权限修饰符 private,默认的,protected,public b. 状态修饰符 static,final c. 抽象修饰符 abstract 2. 类修饰符 p ...

  4. Excel教程(11) - 查找和引用函数

    ADDRESS 用途:以文字形式返回对工作簿中某一单元格的引用.    语法: sheADDRESS(row_num,column_num,abs_num,a1,et_text) 参数:Row_num ...

  5. digitalocean注册验证账户、激活账号教程

    注册digitalocean账号很简单,使用优惠链接注册digitalocean还能赠送10美元余额,digitalocean vps是优秀的SSD VPS,最便宜的套餐只要5美元/月. 由于中国大陆 ...

  6. There was a problem parsing the package(android)

    android phone when you install the application there will inevitably be "a problem parsing the ...

  7. MySQL binlog 查看信息

    1)按时间筛选 mysqlbinlog --start-datetime="2009-09-14 0:20:00" --stop-datetim="2009-09-15 ...

  8. HyperSnap(屏幕抓图工具) 8.11.03 官方简体中文特别版

    软件名称:屏幕抓图工具HyperSnap 软件分类:图像捕捉运行环境:WinXP/Win2003/Vista/Win7/Win8/WinALL软件语言:简体中文授权方式:免费软件软件大小:12462K ...

  9. 进入BIOS SHELL DUMP 命令

    LINUX系统 进入SHELL 输入命令 fs1: or fs0: 就进入了U盘目录 然后输入 ACPIRW.efi  -d -s dsdt.bat 就会产生结果到U盘 ——————————————— ...

  10. 安装gensim

    安装了一天的gensim,其中因为版本不一致等等各种问题纠结了好久,现记录如下: 正确安装方式: 1. 安装python2.7 2. 下载Python Extension Packages对应版本的n ...