add 接口相关代码

This commit is contained in:
huyulong 2024-11-23 14:08:04 +08:00
parent dc6bcb85bf
commit 5382863b0b
89 changed files with 21189 additions and 6 deletions

Binary file not shown.

View File

@ -0,0 +1,33 @@
fileFormatVersion: 2
guid: 981e61f2f9d05f14080ac9c319bce628
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
Any:
second:
enabled: 1
settings: {}
- first:
Editor: Editor
second:
enabled: 0
settings:
DefaultValueInitialized: true
- first:
Windows Store Apps: WindowsStoreApps
second:
enabled: 0
settings:
CPU: AnyCPU
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@ -0,0 +1,33 @@
fileFormatVersion: 2
guid: da0a789a7c2e0f541b10c9faf4986ab5
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
Any:
second:
enabled: 1
settings: {}
- first:
Editor: Editor
second:
enabled: 0
settings:
DefaultValueInitialized: true
- first:
Windows Store Apps: WindowsStoreApps
second:
enabled: 0
settings:
CPU: AnyCPU
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: c5b1839bbbe1e494faf78bb0559cda3a
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -12660,6 +12660,68 @@ Transform:
m_CorrespondingSourceObject: {fileID: 434342, guid: dae965d9ed8802048877e54ec2f0be78, type: 3}
m_PrefabInstance: {fileID: 1517804048}
m_PrefabAsset: {fileID: 0}
--- !u!1 &1526740600
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1526740602}
- component: {fileID: 1526740601}
- component: {fileID: 1526740603}
m_Layer: 0
m_Name: GameObject (1)
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &1526740601
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1526740600}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: c68b1dcfbba61b44ca68572c16b16b95, type: 3}
m_Name:
m_EditorClassIdentifier:
token:
wEBScriptListener: {fileID: 1526740603}
--- !u!4 &1526740602
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1526740600}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 0}
m_RootOrder: 27
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &1526740603
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1526740600}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 44720823678ca7c42a08f4409ab025ff, type: 3}
m_Name:
m_EditorClassIdentifier:
serverIP: ws://192.168.3.110
serverPort: 8445
type:
--- !u!1001 &1542437476
PrefabInstance:
m_ObjectHideFlags: 0

Binary file not shown.

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: ce317dc0bb78cd54b84bef351461ff44
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 23800000
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,21 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class NewBehaviourScript : MonoBehaviour
{
public int id = 0;
public int tpey = 90;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 1728088f42a981c4da46a58c56c1cc84
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -6,9 +6,9 @@ public class auth_login
{
public string clientId = "e5cd7e4891bf95d1d19206ce24a7b32e";
public string grantType = "password";
public string userType = "sys_user";
public string username = "adminyyl";
public string password = "admin123";
public string userType = "company_user";
public string username = "13699802230";
public string password = "YYL2230!";
}
public class login : MonoBehaviour
@ -22,7 +22,7 @@ public class login : MonoBehaviour
public async void loging()
{
auth_login auth_Login = new auth_login();
Debug.Log(JsonUtility.ToJson(auth_Login));
string response = await web.SendRequest(web.URL + "/auth/login", "POST", JsonUtility.ToJson(auth_Login));
Debug.Log(response);
// 解析服务器返回的数据

View File

@ -0,0 +1,10 @@
fileFormatVersion: 2
guid: 4a48e5bab43b85341bcf6c0f41824959
folderAsset: yes
timeCreated: 1530672403
licenseType: Pro
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: aab4c0dd88d44cd4e817c3f1994407b4
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,242 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!29 &1
OcclusionCullingSettings:
m_ObjectHideFlags: 0
serializedVersion: 2
m_OcclusionBakeSettings:
smallestOccluder: 5
smallestHole: 0.25
backfaceThreshold: 100
m_SceneGUID: 00000000000000000000000000000000
m_OcclusionCullingData: {fileID: 0}
--- !u!104 &2
RenderSettings:
m_ObjectHideFlags: 0
serializedVersion: 9
m_Fog: 0
m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
m_FogMode: 3
m_FogDensity: 0.01
m_LinearFogStart: 0
m_LinearFogEnd: 300
m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1}
m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}
m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}
m_AmbientIntensity: 1
m_AmbientMode: 0
m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0}
m_HaloStrength: 0.5
m_FlareStrength: 1
m_FlareFadeSpeed: 3
m_HaloTexture: {fileID: 0}
m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
m_DefaultReflectionMode: 0
m_DefaultReflectionResolution: 128
m_ReflectionBounces: 1
m_ReflectionIntensity: 1
m_CustomReflection: {fileID: 0}
m_Sun: {fileID: 0}
m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1}
m_UseRadianceAmbientProbe: 0
--- !u!157 &3
LightmapSettings:
m_ObjectHideFlags: 0
serializedVersion: 11
m_GIWorkflowMode: 1
m_GISettings:
serializedVersion: 2
m_BounceScale: 1
m_IndirectOutputScale: 1
m_AlbedoBoost: 1
m_EnvironmentLightingMode: 0
m_EnableBakedLightmaps: 1
m_EnableRealtimeLightmaps: 1
m_LightmapEditorSettings:
serializedVersion: 10
m_Resolution: 2
m_BakeResolution: 40
m_AtlasSize: 1024
m_AO: 0
m_AOMaxDistance: 1
m_CompAOExponent: 1
m_CompAOExponentDirect: 0
m_Padding: 2
m_LightmapParameters: {fileID: 0}
m_LightmapsBakeMode: 1
m_TextureCompression: 1
m_FinalGather: 0
m_FinalGatherFiltering: 1
m_FinalGatherRayCount: 256
m_ReflectionCompression: 2
m_MixedBakeMode: 2
m_BakeBackend: 1
m_PVRSampling: 1
m_PVRDirectSampleCount: 32
m_PVRSampleCount: 500
m_PVRBounces: 2
m_PVRFilterTypeDirect: 0
m_PVRFilterTypeIndirect: 0
m_PVRFilterTypeAO: 0
m_PVRFilteringMode: 2
m_PVRCulling: 1
m_PVRFilteringGaussRadiusDirect: 1
m_PVRFilteringGaussRadiusIndirect: 5
m_PVRFilteringGaussRadiusAO: 2
m_PVRFilteringAtrousPositionSigmaDirect: 0.5
m_PVRFilteringAtrousPositionSigmaIndirect: 2
m_PVRFilteringAtrousPositionSigmaAO: 1
m_ShowResolutionOverlay: 1
m_LightingDataAsset: {fileID: 0}
m_UseShadowmask: 1
--- !u!196 &4
NavMeshSettings:
serializedVersion: 2
m_ObjectHideFlags: 0
m_BuildSettings:
serializedVersion: 2
agentTypeID: 0
agentRadius: 0.5
agentHeight: 2
agentSlope: 45
agentClimb: 0.4
ledgeDropHeight: 0
maxJumpAcrossDistance: 0
minRegionArea: 2
manualCellSize: 0
cellSize: 0.16666667
manualTileSize: 0
tileSize: 256
accuratePlacement: 0
debug:
m_Flags: 0
m_NavMeshData: {fileID: 0}
--- !u!1 &516737225
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 516737226}
- component: {fileID: 516737227}
m_Layer: 0
m_Name: Main
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &516737226
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 516737225}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 0}
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &516737227
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 516737225}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: c1b55962346f6de40bd5e924df2854fb, type: 3}
m_Name:
m_EditorClassIdentifier:
address: wss://echo.websocket.events
subProtocols: soap|wamp
sendText: Hello UnityWebSocket!
--- !u!1 &902376145
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 902376148}
- component: {fileID: 902376147}
- component: {fileID: 902376146}
m_Layer: 0
m_Name: Camera
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!81 &902376146
AudioListener:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 902376145}
m_Enabled: 1
--- !u!20 &902376147
Camera:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 902376145}
m_Enabled: 1
serializedVersion: 2
m_ClearFlags: 2
m_BackGroundColor: {r: 0.3301887, g: 0.3301887, b: 0.3301887, a: 0}
m_projectionMatrixMode: 1
m_SensorSize: {x: 36, y: 24}
m_LensShift: {x: 0, y: 0}
m_GateFitMode: 2
m_FocalLength: 50
m_NormalizedViewPortRect:
serializedVersion: 2
x: 0
y: 0
width: 1
height: 1
near clip plane: 0.3
far clip plane: 1000
field of view: 60
orthographic: 0
orthographic size: 5
m_Depth: 0
m_CullingMask:
serializedVersion: 2
m_Bits: 4294967295
m_RenderingPath: -1
m_TargetTexture: {fileID: 0}
m_TargetDisplay: 0
m_TargetEye: 3
m_HDR: 1
m_AllowMSAA: 1
m_AllowDynamicResolution: 0
m_ForceIntoRT: 0
m_OcclusionCulling: 1
m_StereoConvergence: 10
m_StereoSeparation: 0.022
--- !u!4 &902376148
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 902376145}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 0}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 65671216fb4e42d4f89ed6eeca36060d
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,200 @@
using UnityEngine;
namespace UnityWebSocket.Demo
{
public class UnityWebSocketDemo : MonoBehaviour
{
public string address = "wss://echo.websocket.events";
public string sendText = "Hello UnityWebSocket!";
private IWebSocket socket;
private bool logMessage = true;
private string log = "";
private int sendCount;
private int receiveCount;
private Vector2 scrollPos;
private Color green = new Color(0.1f, 1, 0.1f);
private Color red = new Color(1f, 0.1f, 0.1f);
private Color wait = new Color(0.7f, 0.3f, 0.3f);
private void OnGUI()
{
var scale = Screen.width / 800f;
GUI.matrix = Matrix4x4.TRS(new Vector3(0, 0, 0), Quaternion.identity, new Vector3(scale, scale, 1));
var width = GUILayout.Width(Screen.width / scale - 10);
WebSocketState state = socket == null ? WebSocketState.Closed : socket.ReadyState;
// draw header
GUILayout.BeginHorizontal();
GUILayout.Label("SDK Version: " + Settings.VERSION, GUILayout.Width(Screen.width / scale - 100));
GUI.color = green;
GUILayout.Label($"FPS: {fps:F2}", GUILayout.Width(80));
GUI.color = Color.white;
GUILayout.EndHorizontal();
// draw websocket state
GUILayout.BeginHorizontal();
GUILayout.Label("State: ", GUILayout.Width(36));
GUI.color = WebSocketState.Closed == state ? red : WebSocketState.Open == state ? green : wait;
GUILayout.Label($"{state}", GUILayout.Width(120));
GUI.color = Color.white;
GUILayout.EndHorizontal();
// draw address
GUI.enabled = state == WebSocketState.Closed;
GUILayout.Label("Address: ", width);
address = GUILayout.TextField(address, width);
// draw connect button
GUILayout.BeginHorizontal();
GUI.enabled = state == WebSocketState.Closed;
if (GUILayout.Button(state == WebSocketState.Connecting ? "Connecting..." : "Connect"))
{
socket = new WebSocket(address);
socket.OnOpen += Socket_OnOpen;
socket.OnMessage += Socket_OnMessage;
socket.OnClose += Socket_OnClose;
socket.OnError += Socket_OnError;
AddLog(string.Format("Connecting..."));
socket.ConnectAsync();
}
// draw close button
GUI.enabled = state == WebSocketState.Open;
if (GUILayout.Button(state == WebSocketState.Closing ? "Closing..." : "Close"))
{
AddLog(string.Format("Closing..."));
socket.CloseAsync();
}
GUILayout.EndHorizontal();
// draw input message
GUILayout.Label("Message: ");
sendText = GUILayout.TextArea(sendText, GUILayout.MinHeight(50), width);
// draw send message button
GUILayout.BeginHorizontal();
if (GUILayout.Button("Send") && !string.IsNullOrEmpty(sendText))
{
socket.SendAsync(sendText);
AddLog(string.Format("Send: {0}", sendText));
sendCount += 1;
}
if (GUILayout.Button("Send Bytes") && !string.IsNullOrEmpty(sendText))
{
var bytes = System.Text.Encoding.UTF8.GetBytes(sendText);
socket.SendAsync(bytes);
AddLog(string.Format("Send Bytes ({1}): {0}", sendText, bytes.Length));
sendCount += 1;
}
if (GUILayout.Button("Send x100") && !string.IsNullOrEmpty(sendText))
{
for (int i = 0; i < 100; i++)
{
var text = (i + 1).ToString() + ". " + sendText;
socket.SendAsync(text);
AddLog(string.Format("Send: {0}", text));
sendCount += 1;
}
}
if (GUILayout.Button("Send Bytes x100") && !string.IsNullOrEmpty(sendText))
{
for (int i = 0; i < 100; i++)
{
var text = (i + 1).ToString() + ". " + sendText;
var bytes = System.Text.Encoding.UTF8.GetBytes(text);
socket.SendAsync(bytes);
AddLog(string.Format("Send Bytes ({1}): {0}", text, bytes.Length));
sendCount += 1;
}
}
GUILayout.EndHorizontal();
// draw message count
GUI.enabled = true;
GUILayout.BeginHorizontal();
logMessage = GUILayout.Toggle(logMessage, "Log Message");
GUILayout.Label(string.Format("Send Count: {0}", sendCount));
GUILayout.Label(string.Format("Receive Count: {0}", receiveCount));
GUILayout.EndHorizontal();
// draw clear button
if (GUILayout.Button("Clear"))
{
log = "";
receiveCount = 0;
sendCount = 0;
}
// draw message content
scrollPos = GUILayout.BeginScrollView(scrollPos, GUILayout.MaxHeight(Screen.height / scale - 270), width);
GUILayout.Label(log);
GUILayout.EndScrollView();
}
private void AddLog(string str)
{
if (!logMessage) return;
if (str.Length > 100) str = str.Substring(0, 100) + "...";
log += str + "\n";
if (log.Length > 22 * 1024)
{
log = log.Substring(log.Length - 22 * 1024);
}
scrollPos.y = int.MaxValue;
}
private void Socket_OnOpen(object sender, OpenEventArgs e)
{
AddLog(string.Format("Connected: {0}", address));
}
private void Socket_OnMessage(object sender, MessageEventArgs e)
{
if (e.IsBinary)
{
AddLog(string.Format("Receive Bytes ({1}): {0}", e.Data, e.RawData.Length));
}
else if (e.IsText)
{
AddLog(string.Format("Receive: {0}", e.Data));
}
receiveCount += 1;
}
private void Socket_OnClose(object sender, CloseEventArgs e)
{
AddLog(string.Format("Closed: StatusCode: {0}, Reason: {1}", e.StatusCode, e.Reason));
}
private void Socket_OnError(object sender, ErrorEventArgs e)
{
AddLog(string.Format("Error: {0}", e.Message));
}
private void OnApplicationQuit()
{
if (socket != null && socket.ReadyState != WebSocketState.Closed)
{
socket.CloseAsync();
}
}
private int frame = 0;
private float time = 0;
private float fps = 0;
private void Update()
{
frame += 1;
time += Time.deltaTime;
if (time >= 0.5f)
{
fps = frame / time;
frame = 0;
time = 0;
}
}
}
}

View File

@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: c1b55962346f6de40bd5e924df2854fb
timeCreated: 1466599118
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: 4589fa9979d007040b5a807b0304b1ff
folderAsset: yes
timeCreated: 1466577973
licenseType: Pro
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: f1a1a6aea65cc413faf8fb4421138b29
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,338 @@
var WebSocketLibrary =
{
$webSocketManager:
{
/*
* Map of instances
*
* Instance structure:
* {
* url: string,
* ws: WebSocket,
* subProtocols: string[],
* }
*/
instances: {},
/* Last instance ID */
lastId: 0,
/* Event listeners */
onOpen: null,
onMessage: null,
onMessageStr: null,
onError: null,
onClose: null
},
/**
* Set onOpen callback
*
* @param callback Reference to C# static function
*/
WebSocketSetOnOpen: function(callback)
{
webSocketManager.onOpen = callback;
},
/**
* Set onMessage callback
*
* @param callback Reference to C# static function
*/
WebSocketSetOnMessage: function(callback)
{
webSocketManager.onMessage = callback;
},
/**
* Set onMessageStr callback
*
* @param callback Reference to C# static function
*/
WebSocketSetOnMessageStr: function(callback)
{
webSocketManager.onMessageStr = callback;
},
/**
* Set onError callback
*
* @param callback Reference to C# static function
*/
WebSocketSetOnError: function(callback)
{
webSocketManager.onError = callback;
},
/**
* Set onClose callback
*
* @param callback Reference to C# static function
*/
WebSocketSetOnClose: function(callback)
{
webSocketManager.onClose = callback;
},
/**
* Allocate new WebSocket instance struct
*
* @param url Server URL
*/
WebSocketAllocate: function(urlPtr)
{
var url = UTF8ToString(urlPtr);
var id = ++webSocketManager.lastId;
webSocketManager.instances[id] = {
url: url,
ws: null,
};
return id;
},
/**
* Add Sub Protocol
*
* @param instanceId Instance ID
* @param protocol Sub Protocol
*/
WebSocketAddSubProtocol: function(instanceId, protocolPtr)
{
var instance = webSocketManager.instances[instanceId];
if (!instance) return -1;
var protocol = UTF8ToString(protocolPtr);
if (instance.subProtocols == null)
instance.subProtocols = [];
instance.subProtocols.push(protocol);
return 0;
},
/**
* Remove reference to WebSocket instance
*
* If socket is not closed function will close it but onClose event will not be emitted because
* this function should be invoked by C# WebSocket destructor.
*
* @param instanceId Instance ID
*/
WebSocketFree: function(instanceId)
{
var instance = webSocketManager.instances[instanceId];
if (!instance) return 0;
// Close if not closed
if (instance.ws !== null && instance.ws.readyState < 2)
instance.ws.close();
// Remove reference
delete webSocketManager.instances[instanceId];
return 0;
},
/**
* Connect WebSocket to the server
*
* @param instanceId Instance ID
*/
WebSocketConnect: function(instanceId)
{
var instance = webSocketManager.instances[instanceId];
if (!instance) return -1;
if (instance.ws !== null) return -2;
if (instance.subProtocols != null)
instance.ws = new WebSocket(instance.url, instance.subProtocols);
else
instance.ws = new WebSocket(instance.url);
instance.ws.onopen = function()
{
Module.dynCall_vi(webSocketManager.onOpen, instanceId);
};
instance.ws.onmessage = function(ev)
{
if (ev.data instanceof ArrayBuffer)
{
var array = new Uint8Array(ev.data);
var buffer = _malloc(array.length);
writeArrayToMemory(array, buffer);
try
{
Module.dynCall_viii(webSocketManager.onMessage, instanceId, buffer, array.length);
}
finally
{
_free(buffer);
}
}
else if (typeof ev.data == 'string')
{
var length = lengthBytesUTF8(ev.data) + 1;
var buffer = _malloc(length);
stringToUTF8(ev.data, buffer, length);
try
{
Module.dynCall_vii(webSocketManager.onMessageStr, instanceId, buffer);
}
finally
{
_free(buffer);
}
}
else if (typeof Blob !== 'undefined' && ev.data instanceof Blob)
{
var reader = new FileReader();
reader.onload = function()
{
var array = new Uint8Array(reader.result);
var buffer = _malloc(array.length);
writeArrayToMemory(array, buffer);
try
{
Module.dynCall_viii(webSocketManager.onMessage, instanceId, buffer, array.length);
}
finally
{
reader = null;
_free(buffer);
}
};
reader.readAsArrayBuffer(ev.data);
}
else
{
console.log("[JSLIB WebSocket] not support message type: ", (typeof ev.data));
}
};
instance.ws.onerror = function(ev)
{
var msg = "WebSocket error.";
var length = lengthBytesUTF8(msg) + 1;
var buffer = _malloc(length);
stringToUTF8(msg, buffer, length);
try
{
Module.dynCall_vii(webSocketManager.onError, instanceId, buffer);
}
finally
{
_free(buffer);
}
};
instance.ws.onclose = function(ev)
{
var msg = ev.reason;
var length = lengthBytesUTF8(msg) + 1;
var buffer = _malloc(length);
stringToUTF8(msg, buffer, length);
try
{
Module.dynCall_viii(webSocketManager.onClose, instanceId, ev.code, buffer);
}
finally
{
_free(buffer);
}
instance.ws = null;
};
return 0;
},
/**
* Close WebSocket connection
*
* @param instanceId Instance ID
* @param code Close status code
* @param reasonPtr Pointer to reason string
*/
WebSocketClose: function(instanceId, code, reasonPtr)
{
var instance = webSocketManager.instances[instanceId];
if (!instance) return -1;
if (instance.ws === null) return -3;
if (instance.ws.readyState === 2) return -4;
if (instance.ws.readyState === 3) return -5;
var reason = ( reasonPtr ? UTF8ToString(reasonPtr) : undefined );
try
{
instance.ws.close(code, reason);
}
catch (err)
{
return -7;
}
return 0;
},
/**
* Send message over WebSocket
*
* @param instanceId Instance ID
* @param bufferPtr Pointer to the message buffer
* @param length Length of the message in the buffer
*/
WebSocketSend: function(instanceId, bufferPtr, length)
{
var instance = webSocketManager.instances[instanceId];
if (!instance) return -1;
if (instance.ws === null) return -3;
if (instance.ws.readyState !== 1) return -6;
if (typeof HEAPU8 !== 'undefined')
instance.ws.send(HEAPU8.buffer.slice(bufferPtr, bufferPtr + length));
else if (typeof buffer !== 'undefined')
instance.ws.send(buffer.slice(bufferPtr, bufferPtr + length));
else
return -8; // not support buffer slice
return 0;
},
/**
* Send message string over WebSocket
*
* @param instanceId Instance ID
* @param stringPtr Pointer to the message string
*/
WebSocketSendStr: function(instanceId, stringPtr)
{
var instance = webSocketManager.instances[instanceId];
if (!instance) return -1;
if (instance.ws === null) return -3;
if (instance.ws.readyState !== 1) return -6;
instance.ws.send(UTF8ToString(stringPtr));
return 0;
},
/**
* Return WebSocket readyState
*
* @param instanceId Instance ID
*/
WebSocketGetState: function(instanceId)
{
var instance = webSocketManager.instances[instanceId];
if (!instance) return -1;
if (instance.ws === null) return 3; // socket null as closed
return instance.ws.readyState;
}
};
autoAddDeps(WebSocketLibrary, '$webSocketManager');
mergeInto(LibraryManager.library, WebSocketLibrary);

View File

@ -0,0 +1,42 @@
fileFormatVersion: 2
guid: bd88770aa13fc47b08f87d2145e9ac6e
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
Any:
second:
enabled: 0
settings: {}
- first:
Editor: Editor
second:
enabled: 0
settings:
DefaultValueInitialized: true
- first:
Facebook: WebGL
second:
enabled: 1
settings: {}
- first:
WebGL: WebGL
second:
enabled: 1
settings: {}
- first:
WeixinMiniGame: WeixinMiniGame
second:
enabled: 1
settings: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 89cd0cf8603ef4069b2f6a5d79cbdbe1
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: bb71bb4fb62590c4b975ef865b4df25f
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,212 @@
using UnityEngine;
using UnityEditor;
using UnityEngine.Networking;
using System.IO;
using System;
namespace UnityWebSocket.Editor
{
internal class SettingsWindow : EditorWindow
{
static SettingsWindow window = null;
[MenuItem("Tools/UnityWebSocket", priority = 100)]
internal static void Open()
{
if (window != null)
{
window.Close();
}
window = GetWindow<SettingsWindow>(true, "UnityWebSocket");
window.minSize = window.maxSize = new Vector2(600, 310);
window.Show();
window.BeginCheck();
}
private void OnGUI()
{
DrawLogo();
DrawVersion();
DrawSeparator(80);
DrawSeparator(186);
DrawHelper();
DrawFooter();
}
Texture2D logoTex = null;
private void DrawLogo()
{
if (logoTex == null)
{
logoTex = new Texture2D(66, 66);
logoTex.LoadImage(Convert.FromBase64String(LOGO_BASE64.VALUE));
for (int i = 0; i < 66; i++) for (int j = 0; j < 15; j++) logoTex.SetPixel(i, j, Color.clear);
logoTex.Apply();
}
var logoPos = new Rect(10, 10, 66, 66);
GUI.DrawTexture(logoPos, logoTex);
var title = "<color=#3A9AD8><b>UnityWebSocket</b></color>";
var titlePos = new Rect(80, 20, 500, 50);
GUI.Label(titlePos, title, TextStyle(24));
}
private void DrawSeparator(int y)
{
EditorGUI.DrawRect(new Rect(10, y, 580, 1), Color.white * 0.5f);
}
private GUIStyle TextStyle(int fontSize = 10, TextAnchor alignment = TextAnchor.UpperLeft, float alpha = 0.85f)
{
var style = new GUIStyle();
style.fontSize = fontSize;
style.normal.textColor = (EditorGUIUtility.isProSkin ? Color.white : Color.black) * alpha;
style.alignment = alignment;
style.richText = true;
return style;
}
private void DrawVersion()
{
GUI.Label(new Rect(440, 10, 150, 10), "Current Version: " + Settings.VERSION, TextStyle(alignment: TextAnchor.MiddleLeft));
if (string.IsNullOrEmpty(latestVersion))
{
GUI.Label(new Rect(440, 30, 150, 10), "Checking for Updates...", TextStyle(alignment: TextAnchor.MiddleLeft));
}
else if (latestVersion == "unknown")
{
}
else
{
GUI.Label(new Rect(440, 30, 150, 10), "Latest Version: " + latestVersion, TextStyle(alignment: TextAnchor.MiddleLeft));
if (Settings.VERSION == latestVersion)
{
if (GUI.Button(new Rect(440, 50, 150, 18), "Check Update"))
{
latestVersion = "";
changeLog = "";
BeginCheck();
}
}
else
{
if (GUI.Button(new Rect(440, 50, 150, 18), "Update to | " + latestVersion))
{
Application.OpenURL(Settings.GITHUB + "/releases");
}
}
}
}
private void DrawHelper()
{
GUI.Label(new Rect(330, 200, 100, 18), "GitHub:", TextStyle(10, TextAnchor.MiddleRight));
if (GUI.Button(new Rect(440, 200, 150, 18), "UnityWebSocket"))
{
Application.OpenURL(Settings.GITHUB);
}
GUI.Label(new Rect(330, 225, 100, 18), "Report:", TextStyle(10, TextAnchor.MiddleRight));
if (GUI.Button(new Rect(440, 225, 150, 18), "Report an Issue"))
{
Application.OpenURL(Settings.GITHUB + "/issues/new");
}
GUI.Label(new Rect(330, 250, 100, 18), "Email:", TextStyle(10, TextAnchor.MiddleRight));
if (GUI.Button(new Rect(440, 250, 150, 18), Settings.EMAIL))
{
var uri = new Uri(string.Format("mailto:{0}?subject={1}", Settings.EMAIL, "UnityWebSocket Feedback"));
Application.OpenURL(uri.AbsoluteUri);
}
GUI.Label(new Rect(330, 275, 100, 18), "QQ Group:", TextStyle(10, TextAnchor.MiddleRight));
if (GUI.Button(new Rect(440, 275, 150, 18), Settings.QQ_GROUP))
{
Application.OpenURL(Settings.QQ_GROUP_LINK);
}
}
private void DrawFooter()
{
EditorGUI.DropShadowLabel(new Rect(10, 230, 400, 20), "Developed by " + Settings.AUHTOR);
EditorGUI.DropShadowLabel(new Rect(10, 250, 400, 20), "All rights reserved");
}
UnityWebRequest req;
string changeLog = "";
string latestVersion = "";
void BeginCheck()
{
EditorApplication.update -= VersionCheckUpdate;
EditorApplication.update += VersionCheckUpdate;
req = UnityWebRequest.Get(Settings.GITHUB + "/releases/latest");
req.SendWebRequest();
}
private void VersionCheckUpdate()
{
#if UNITY_2020_3_OR_NEWER
if (req == null
|| req.result == UnityWebRequest.Result.ConnectionError
|| req.result == UnityWebRequest.Result.DataProcessingError
|| req.result == UnityWebRequest.Result.ProtocolError)
#elif UNITY_2018_1_OR_NEWER
if (req == null || req.isNetworkError || req.isHttpError)
#else
if (req == null || req.isError)
#endif
{
EditorApplication.update -= VersionCheckUpdate;
latestVersion = "unknown";
return;
}
if (req.isDone)
{
EditorApplication.update -= VersionCheckUpdate;
latestVersion = req.url.Substring(req.url.LastIndexOf("/") + 1).TrimStart('v');
if (Settings.VERSION != latestVersion)
{
var text = req.downloadHandler.text;
var st = text.IndexOf("content=\"" + latestVersion);
st = st > 0 ? text.IndexOf("\n", st) : -1;
var end = st > 0 ? text.IndexOf("\" />", st) : -1;
if (st > 0 && end > st)
{
changeLog = text.Substring(st + 1, end - st - 1).Trim();
changeLog = changeLog.Replace("\r", "");
changeLog = changeLog.Replace("\n", "\n- ");
changeLog = "\nCHANGE LOG: \n- " + changeLog + "\n";
}
}
Repaint();
}
}
}
internal static class LOGO_BASE64
{
internal const string VALUE = "iVBORw0KGgoAAAANSUhEUgAAAEIAAABCCAMAAADUivDaAAAAq1BMVEUAAABKmtcvjtYzl" +
"9szmNszl9syl9k0mNs0mNwzmNs0mNszl9szl9s0mNs0mNwzmNw0mNwyltk0mNw0mNwzl9s0mNsymNs0mNszmNwzmNwzm" +
"NszmNs0mNwzl9w0mNwzmNw0mNs0mNs0mNwzl9wzmNs0mNwzmNs0mNwzl90zmNszmNszl9szmNsxmNszmNszmNw0mNwzm" +
"Nw0mNs2neM4pe41mt43ouo2oOY5qfM+UHlaAAAAMnRSTlMAAwXN3sgI+/069MSCK6M/MA74h9qfFHB8STWMJ9OSdmNcI" +
"8qya1IeF+/U0EIa57mqmFTYJe4AAAN3SURBVFjD7ZbpkppAFEa/bgVBREF2kEVGFNeZsM77P1kadURnJkr8k1Qlx1Khu" +
"/pw7+2lwH/+YcgfMBBLG7VocwDamzH+wJBB8Qhjve2f0TdrGwjei6o4Ub/nM/APw5Z7vvSB/qrCrqbD6fBEVtigeMxks" +
"fX9zWbj+z1jhqgSBplQ50eGo4614WXlRAzgrRhmtSfvxAn7pB0N5ObaKKZZuU5/d37IBcBgUQwqDuf7Z2gUmVAl4NGNr" +
"/UeHxV5n39ulbaKLI86h6HilmM5M1aN126lpNhtl59yeTsp8nUMvpNC1J3bh5FtfVRk+bJrJunn5d4U4piJ/Vw9eXgsj" +
"4ZpZaCjg9waZkIpnBWLJ44OwoNu60F2UnSaEkKv4XnAlCpm6B4F/aKMDiyGi2L8SEEAVdxNLuzmgV7nFwObEe2xQVuX+" +
"RV1lWetga3w+cN1sXgvm4cJH8OEgZC1DPKhfF/BIymmQrMjq/x65FUeEkDup8GxoexZmznHCvANtXU/CAq13yimhQGtm" +
"H4VCPnBBL1fTKo3CqEcvq7Lb/OwHxWTYlyw+JmjKoVvDLVOQB4pVsM8K8smgvLCxZDlIijwyOEc+nr/msMwK0+GQWGBd" +
"tmhjv8icTds1s2ammaFh04QLLe69NK7guP6mTDMaw3o6nAX/Z7EXUskPSvWEWg4srVlp5NTDXv9Lce9HGN5eeG4nj5Yz" +
"ACteU2wQLo4MBtJfd1nw5nG1/s9zwUQ6pykL1TQjqdeuvQW0naz2XKLYL4Cwzr4vj+OQdD96CSp7Lrynp4aeFF0xdm5q" +
"6OFtFfPv7URxpWJNjd/N+3+I9+1klMav12Qtgbt9R2JaIopjkzaPtOFq4KxUpqfUMSFnQrySWjLoQzRZS4HMH84ME1ej" +
"S1YJpQZ3B+sR1uCQJSBdGdCk1eAEgORR88KK05W8dh2MA+A/SKCYu3mCJ0Ek7HBx4HHeuwYy5G3x8hSMTJcOMFbinCsn" +
"hO1V1aszGULvA0g4UFsb4VA0hAFcyo6cgLsAoT7uUtGAH5wQKQle0wuLyxLTaNyJEYwxw4wSljLK1TP8CAaOyhBMMEsj" +
"OBoXgo7VGElFkSWL+vef1RF2YNXeRWYzQBTpkhC8KaZHhuIogArkQLKClBZjU26B2IZgGz+cpZkHl8g3fYUaW/YP2kb2" +
"M/V97JY/vZN859n+QmO7XtC9Bf2jAAAAABJRU5ErkJggg==";
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 7c42d421cc4c34f3eae1fbd67f0dced0
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,16 @@
{
"name": "UnityWebSocket.Editor",
"references": [
"UnityWebSocket.Runtime"
],
"optionalUnityReferences": [],
"includePlatforms": [
"Editor"
],
"excludePlatforms": [],
"allowUnsafeCode": false,
"overrideReferences": false,
"precompiledReferences": [],
"autoReferenced": true,
"defineConstraints": []
}

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: ee833745c57bd4369ab8f0ff380a96fa
AssemblyDefinitionImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 53e0ed9fdc3af42eba12a5b1b9a5f873
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 8b3a2a8f55d4a47f599b1fa3ed612389
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,89 @@
using System;
namespace UnityWebSocket
{
/// <summary>
/// Represents the event data for the <see cref="IWebSocket.OnClose"/> event.
/// </summary>
/// <remarks>
/// <para>
/// That event occurs when the WebSocket connection has been closed.
/// </para>
/// <para>
/// If you would like to get the reason for the close, you should access
/// the <see cref="Code"/> or <see cref="Reason"/> property.
/// </para>
/// </remarks>
public class CloseEventArgs : EventArgs
{
#region Internal Constructors
internal CloseEventArgs()
{
}
internal CloseEventArgs(ushort code)
: this(code, null)
{
}
internal CloseEventArgs(CloseStatusCode code)
: this((ushort)code, null)
{
}
internal CloseEventArgs(CloseStatusCode code, string reason)
: this((ushort)code, reason)
{
}
internal CloseEventArgs(ushort code, string reason)
{
Code = code;
Reason = reason;
}
#endregion
#region Public Properties
/// <summary>
/// Gets the status code for the close.
/// </summary>
/// <value>
/// A <see cref="ushort"/> that represents the status code for the close if any.
/// </value>
public ushort Code { get; private set; }
/// <summary>
/// Gets the reason for the close.
/// </summary>
/// <value>
/// A <see cref="string"/> that represents the reason for the close if any.
/// </value>
public string Reason { get; private set; }
/// <summary>
/// Gets a value indicating whether the connection has been closed cleanly.
/// </summary>
/// <value>
/// <c>true</c> if the connection has been closed cleanly; otherwise, <c>false</c>.
/// </value>
public bool WasClean { get; internal set; }
/// <summary>
/// Enum value same as Code
/// </summary>
public CloseStatusCode StatusCode
{
get
{
if (Enum.IsDefined(typeof(CloseStatusCode), Code))
return (CloseStatusCode)Code;
return CloseStatusCode.Unknown;
}
}
#endregion
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 29b987d07ba15434cb1744135a7a5416
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,91 @@
namespace UnityWebSocket
{
/// <summary>
/// Indicates the status code for the WebSocket connection close.
/// </summary>
/// <remarks>
/// <para>
/// The values of this enumeration are defined in
/// <see href="http://tools.ietf.org/html/rfc6455#section-7.4">
/// Section 7.4</see> of RFC 6455.
/// </para>
/// <para>
/// "Reserved value" cannot be sent as a status code in
/// closing handshake by an endpoint.
/// </para>
/// </remarks>
public enum CloseStatusCode : ushort
{
Unknown = 65534,
/// <summary>
/// Equivalent to close status 1000. Indicates normal close.
/// </summary>
Normal = 1000,
/// <summary>
/// Equivalent to close status 1001. Indicates that an endpoint is
/// going away.
/// </summary>
Away = 1001,
/// <summary>
/// Equivalent to close status 1002. Indicates that an endpoint is
/// terminating the connection due to a protocol error.
/// </summary>
ProtocolError = 1002,
/// <summary>
/// Equivalent to close status 1003. Indicates that an endpoint is
/// terminating the connection because it has received a type of
/// data that it cannot accept.
/// </summary>
UnsupportedData = 1003,
/// <summary>
/// Equivalent to close status 1004. Still undefined. A Reserved value.
/// </summary>
Undefined = 1004,
/// <summary>
/// Equivalent to close status 1005. Indicates that no status code was
/// actually present. A Reserved value.
/// </summary>
NoStatus = 1005,
/// <summary>
/// Equivalent to close status 1006. Indicates that the connection was
/// closed abnormally. A Reserved value.
/// </summary>
Abnormal = 1006,
/// <summary>
/// Equivalent to close status 1007. Indicates that an endpoint is
/// terminating the connection because it has received a message that
/// contains data that is not consistent with the type of the message.
/// </summary>
InvalidData = 1007,
/// <summary>
/// Equivalent to close status 1008. Indicates that an endpoint is
/// terminating the connection because it has received a message that
/// violates its policy.
/// </summary>
PolicyViolation = 1008,
/// <summary>
/// Equivalent to close status 1009. Indicates that an endpoint is
/// terminating the connection because it has received a message that
/// is too big to process.
/// </summary>
TooBig = 1009,
/// <summary>
/// Equivalent to close status 1010. Indicates that a client is
/// terminating the connection because it has expected the server to
/// negotiate one or more extension, but the server did not return
/// them in the handshake response.
/// </summary>
MandatoryExtension = 1010,
/// <summary>
/// Equivalent to close status 1011. Indicates that a server is
/// terminating the connection because it has encountered an unexpected
/// condition that prevented it from fulfilling the request.
/// </summary>
ServerError = 1011,
/// <summary>
/// Equivalent to close status 1015. Indicates that the connection was
/// closed due to a failure to perform a TLS handshake. A Reserved value.
/// </summary>
TlsHandshakeFailure = 1015,
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 4e34ee317292e4225a10427cc35f85ec
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,59 @@
using System;
namespace UnityWebSocket
{
/// <summary>
/// Represents the event data for the <see cref="IWebSocket.OnError"/> event.
/// </summary>
/// <remarks>
/// <para>
/// That event occurs when the <see cref="IWebSocket"/> gets an error.
/// </para>
/// <para>
/// If you would like to get the error message, you should access
/// the <see cref="Message"/> property.
/// </para>
/// <para>
/// And if the error is due to an exception, you can get it by accessing
/// the <see cref="Exception"/> property.
/// </para>
/// </remarks>
public class ErrorEventArgs : EventArgs
{
#region Internal Constructors
internal ErrorEventArgs(string message)
: this(message, null)
{
}
internal ErrorEventArgs(string message, Exception exception)
{
this.Message = message;
this.Exception = exception;
}
#endregion
#region Public Properties
/// <summary>
/// Gets the exception that caused the error.
/// </summary>
/// <value>
/// An <see cref="System.Exception"/> instance that represents the cause of
/// the error if it is due to an exception; otherwise, <see langword="null"/>.
/// </value>
public Exception Exception { get; private set; }
/// <summary>
/// Gets the error message.
/// </summary>
/// <value>
/// A <see cref="string"/> that represents the error message.
/// </value>
public string Message { get; private set; }
#endregion
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 884e7db60b6444154b7200e0e436f2de
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,143 @@
using System;
namespace UnityWebSocket
{
/// <summary>
/// <para>IWebSocket indicate a network connection.</para>
/// <para>It can be connecting, connected, closing or closed state. </para>
/// <para>You can send and receive messages by using it.</para>
/// <para>Register callbacks for handling messages.</para>
/// <para> ----------------------------------------------------------- </para>
/// <para>IWebSocket 表示一个网络连接,</para>
/// <para>它可以是 connecting connected closing closed 状态,</para>
/// <para>可以发送和接收消息,</para>
/// <para>通过注册消息回调,来处理接收到的消息。</para>
/// </summary>
public interface IWebSocket
{
/// <summary>
/// Establishes a connection asynchronously.
/// </summary>
/// <remarks>
/// <para>
/// This method does not wait for the connect process to be complete.
/// </para>
/// <para>
/// This method does nothing if the connection has already been
/// established.
/// </para>
/// </remarks>
/// <exception cref="InvalidOperationException">
/// <para>
/// This instance is not a client.
/// </para>
/// <para>
/// -or-
/// </para>
/// <para>
/// The close process is in progress.
/// </para>
/// <para>
/// -or-
/// </para>
/// <para>
/// A series of reconnecting has failed.
/// </para>
/// </exception>
void ConnectAsync();
/// <summary>
/// Closes the connection asynchronously.
/// </summary>
/// <remarks>
/// <para>
/// This method does not wait for the close to be complete.
/// </para>
/// <para>
/// This method does nothing if the current state of the connection is
/// Closing or Closed.
/// </para>
/// </remarks>
void CloseAsync();
/// <summary>
/// Sends the specified data asynchronously using the WebSocket connection.
/// </summary>
/// <remarks>
/// This method does not wait for the send to be complete.
/// </remarks>
/// <param name="data">
/// An array of <see cref="byte"/> that represents the binary data to send.
/// </param>
/// <exception cref="InvalidOperationException">
/// The current state of the connection is not Open.
/// </exception>
/// <exception cref="ArgumentNullException">
/// <paramref name="data"/> is <see langword="null"/>.
/// </exception>
void SendAsync(byte[] data);
/// <summary>
/// Sends the specified data using the WebSocket connection.
/// </summary>
/// <param name="text">
/// A <see cref="string"/> that represents the text data to send.
/// </param>
/// <exception cref="InvalidOperationException">
/// The current state of the connection is not Open.
/// </exception>
/// <exception cref="ArgumentNullException">
/// <paramref name="text"/> is <see langword="null"/>.
/// </exception>
/// <exception cref="ArgumentException">
/// <paramref name="text"/> could not be UTF-8 encoded.
/// </exception>
void SendAsync(string text);
/// <summary>
/// get the address which to connect.
/// </summary>
string Address { get; }
/// <summary>
/// get sub protocols .
/// </summary>
string[] SubProtocols { get; }
/// <summary>
/// Gets the current state of the connection.
/// </summary>
/// <value>
/// <para>
/// One of the <see cref="WebSocketState"/> enum values.
/// </para>
/// <para>
/// It indicates the current state of the connection.
/// </para>
/// <para>
/// The default value is <see cref="WebSocketState.Closed"/>.
/// </para>
/// </value>
WebSocketState ReadyState { get; }
/// <summary>
/// Occurs when the WebSocket connection has been established.
/// </summary>
event EventHandler<OpenEventArgs> OnOpen;
/// <summary>
/// Occurs when the WebSocket connection has been closed.
/// </summary>
event EventHandler<CloseEventArgs> OnClose;
/// <summary>
/// Occurs when the <see cref="IWebSocket"/> gets an error.
/// </summary>
event EventHandler<ErrorEventArgs> OnError;
/// <summary>
/// Occurs when the <see cref="IWebSocket"/> receives a message.
/// </summary>
event EventHandler<MessageEventArgs> OnMessage;
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 37ee2146eb8c34ffab8b081a632b05cf
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,115 @@
using System;
using System.Text;
namespace UnityWebSocket
{
public class MessageEventArgs : EventArgs
{
private byte[] _rawData;
private string _data;
internal MessageEventArgs(Opcode opcode, byte[] rawData)
{
Opcode = opcode;
_rawData = rawData;
}
internal MessageEventArgs(Opcode opcode, string data)
{
Opcode = opcode;
_data = data;
}
/// <summary>
/// Gets the opcode for the message.
/// </summary>
/// <value>
/// <see cref="Opcode.Text"/>, <see cref="Opcode.Binary"/>.
/// </value>
internal Opcode Opcode { get; private set; }
/// <summary>
/// Gets the message data as a <see cref="string"/>.
/// </summary>
/// <value>
/// A <see cref="string"/> that represents the message data if its type is
/// text and if decoding it to a string has successfully done;
/// otherwise, <see langword="null"/>.
/// </value>
public string Data
{
get
{
SetData();
return _data;
}
}
/// <summary>
/// Gets the message data as an array of <see cref="byte"/>.
/// </summary>
/// <value>
/// An array of <see cref="byte"/> that represents the message data.
/// </value>
public byte[] RawData
{
get
{
SetRawData();
return _rawData;
}
}
/// <summary>
/// Gets a value indicating whether the message type is binary.
/// </summary>
/// <value>
/// <c>true</c> if the message type is binary; otherwise, <c>false</c>.
/// </value>
public bool IsBinary
{
get
{
return Opcode == Opcode.Binary;
}
}
/// <summary>
/// Gets a value indicating whether the message type is text.
/// </summary>
/// <value>
/// <c>true</c> if the message type is text; otherwise, <c>false</c>.
/// </value>
public bool IsText
{
get
{
return Opcode == Opcode.Text;
}
}
private void SetData()
{
if (_data != null) return;
if (RawData == null)
{
return;
}
_data = Encoding.UTF8.GetString(RawData);
}
private void SetRawData()
{
if (_rawData != null) return;
if (_data == null)
{
return;
}
_rawData = Encoding.UTF8.GetBytes(_data);
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: b44eda173b4924081bab76ae9d1b0a9c
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,26 @@
namespace UnityWebSocket
{
/// <summary>
/// Indicates the WebSocket frame type.
/// </summary>
/// <remarks>
/// The values of this enumeration are defined in
/// <see href="http://tools.ietf.org/html/rfc6455#section-5.2">
/// Section 5.2</see> of RFC 6455.
/// </remarks>
public enum Opcode : byte
{
/// <summary>
/// Equivalent to numeric value 1. Indicates text frame.
/// </summary>
Text = 0x1,
/// <summary>
/// Equivalent to numeric value 2. Indicates binary frame.
/// </summary>
Binary = 0x2,
/// <summary>
/// Equivalent to numeric value 8. Indicates connection close frame.
/// </summary>
Close = 0x8,
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: eeac0ef90273544ebbae046672caf362
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,11 @@
using System;
namespace UnityWebSocket
{
public class OpenEventArgs : EventArgs
{
internal OpenEventArgs()
{
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 5fb6fd704bd4e4b8ba63cd0b28712955
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,12 @@
namespace UnityWebSocket
{
public static class Settings
{
public const string GITHUB = "https://github.com/psygames/UnityWebSocket";
public const string QQ_GROUP = "1126457634";
public const string QQ_GROUP_LINK = "https://qm.qq.com/cgi-bin/qm/qr?k=KcexYJ9aYwogFXbj2aN0XHH5b2G7ICmd";
public const string EMAIL = "799329256@qq.com";
public const string AUHTOR = "psygames";
public const string VERSION = "2.8.5";
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: e268303c7a605e343b1b132e5559f01f
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,36 @@
namespace UnityWebSocket
{
/// <summary>
/// Reference html5 WebSocket ReadyState Properties
/// Indicates the state of a WebSocket connection.
/// </summary>
/// <remarks>
/// The values of this enumeration are defined in
/// <see href="http://www.w3.org/TR/websockets/#dom-websocket-readystate">
/// The WebSocket API</see>.
/// </remarks>
public enum WebSocketState : ushort
{
/// <summary>
/// Equivalent to numeric value 0. Indicates that the connection has not
/// yet been established.
/// </summary>
Connecting = 0,
/// <summary>
/// Equivalent to numeric value 1. Indicates that the connection has
/// been established, and the communication is possible.
/// </summary>
Open = 1,
/// <summary>
/// Equivalent to numeric value 2. Indicates that the connection is
/// going through the closing handshake, or the close method has
/// been invoked.
/// </summary>
Closing = 2,
/// <summary>
/// Equivalent to numeric value 3. Indicates that the connection has
/// been closed or could not be established.
/// </summary>
Closed = 3
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 5f6567ad13cb147a59f8af784f1c5f60
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 396c66b333d624d539153070900bb73b
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 6c110a898ae8b0b41bcf4da49c2b0425
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,329 @@
#if !NET_LEGACY && (UNITY_EDITOR || !UNITY_WEBGL)
using System;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Net.WebSockets;
using System.IO;
using System.Collections.Concurrent;
namespace UnityWebSocket
{
public class WebSocket : IWebSocket
{
public string Address { get; private set; }
public string[] SubProtocols { get; private set; }
public WebSocketState ReadyState
{
get
{
if (socket == null)
return WebSocketState.Closed;
switch (socket.State)
{
case System.Net.WebSockets.WebSocketState.Closed:
case System.Net.WebSockets.WebSocketState.None:
return WebSocketState.Closed;
case System.Net.WebSockets.WebSocketState.CloseReceived:
case System.Net.WebSockets.WebSocketState.CloseSent:
return WebSocketState.Closing;
case System.Net.WebSockets.WebSocketState.Connecting:
return WebSocketState.Connecting;
case System.Net.WebSockets.WebSocketState.Open:
return WebSocketState.Open;
}
return WebSocketState.Closed;
}
}
public event EventHandler<OpenEventArgs> OnOpen;
public event EventHandler<CloseEventArgs> OnClose;
public event EventHandler<ErrorEventArgs> OnError;
public event EventHandler<MessageEventArgs> OnMessage;
private ClientWebSocket socket;
private bool isOpening => socket != null && socket.State == System.Net.WebSockets.WebSocketState.Open;
private ConcurrentQueue<SendBuffer> sendQueue = new ConcurrentQueue<SendBuffer>();
private ConcurrentQueue<EventArgs> eventQueue = new ConcurrentQueue<EventArgs>();
private bool closeProcessing;
private CancellationTokenSource cts = null;
#region APIs
public WebSocket(string address)
{
this.Address = address;
}
public WebSocket(string address, string subProtocol)
{
this.Address = address;
this.SubProtocols = new string[] { subProtocol };
}
public WebSocket(string address, string[] subProtocols)
{
this.Address = address;
this.SubProtocols = subProtocols;
}
public void ConnectAsync()
{
if (socket != null)
{
HandleError(new Exception("Socket is busy."));
return;
}
WebSocketManager.Instance.Add(this);
socket = new ClientWebSocket();
cts = new CancellationTokenSource();
// support sub protocols
if (this.SubProtocols != null)
{
foreach (var protocol in this.SubProtocols)
{
if (string.IsNullOrEmpty(protocol)) continue;
Log($"Add Sub Protocol {protocol}");
socket.Options.AddSubProtocol(protocol);
}
}
Task.Run(ConnectTask);
}
public void CloseAsync()
{
if (!isOpening) return;
closeProcessing = true;
}
public void SendAsync(byte[] data)
{
if (!isOpening) return;
var buffer = new SendBuffer(data, WebSocketMessageType.Binary);
sendQueue.Enqueue(buffer);
}
public void SendAsync(string text)
{
if (!isOpening) return;
var data = Encoding.UTF8.GetBytes(text);
var buffer = new SendBuffer(data, WebSocketMessageType.Text);
sendQueue.Enqueue(buffer);
}
#endregion
class SendBuffer
{
public byte[] data;
public WebSocketMessageType type;
public SendBuffer(byte[] data, WebSocketMessageType type)
{
this.data = data;
this.type = type;
}
}
private void CleanSendQueue()
{
while (sendQueue.TryDequeue(out var _)) ;
}
private void CleanEventQueue()
{
while (eventQueue.TryDequeue(out var _)) ;
}
private async Task ConnectTask()
{
Log("Connect Task Begin ...");
try
{
var uri = new Uri(Address);
await socket.ConnectAsync(uri, cts.Token);
}
catch (Exception e)
{
HandleError(e);
HandleClose((ushort)CloseStatusCode.Abnormal, e.Message);
return;
}
HandleOpen();
Log("Connect Task Success !");
StartReceiveTask();
StartSendTask();
}
private async void StartSendTask()
{
Log("Send Task Begin ...");
try
{
while (!closeProcessing && socket != null && cts != null && !cts.IsCancellationRequested)
{
while (!closeProcessing && sendQueue.Count > 0 && sendQueue.TryDequeue(out var buffer))
{
Log($"Send, type: {buffer.type}, size: {buffer.data.Length}, queue left: {sendQueue.Count}");
await socket.SendAsync(new ArraySegment<byte>(buffer.data), buffer.type, true, cts.Token);
}
Thread.Sleep(3);
}
if (closeProcessing && socket != null && cts != null && !cts.IsCancellationRequested)
{
CleanSendQueue();
Log($"Close Send Begin ...");
await socket.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, "Normal Closure", cts.Token);
Log($"Close Send Success !");
}
}
catch (Exception e)
{
HandleError(e);
}
finally
{
closeProcessing = false;
}
Log("Send Task End !");
}
private async void StartReceiveTask()
{
Log("Receive Task Begin ...");
string closeReason = "";
ushort closeCode = 0;
bool isClosed = false;
var segment = new ArraySegment<byte>(new byte[8192]);
var ms = new MemoryStream();
try
{
while (!isClosed && !cts.IsCancellationRequested)
{
var result = await socket.ReceiveAsync(segment, cts.Token);
ms.Write(segment.Array, 0, result.Count);
if (!result.EndOfMessage) continue;
var data = ms.ToArray();
ms.SetLength(0);
switch (result.MessageType)
{
case WebSocketMessageType.Binary:
HandleMessage(Opcode.Binary, data);
break;
case WebSocketMessageType.Text:
HandleMessage(Opcode.Text, data);
break;
case WebSocketMessageType.Close:
isClosed = true;
closeCode = (ushort)result.CloseStatus;
closeReason = result.CloseStatusDescription;
break;
}
}
}
catch (Exception e)
{
HandleError(e);
closeCode = (ushort)CloseStatusCode.Abnormal;
closeReason = e.Message;
}
finally
{
ms.Close();
}
HandleClose(closeCode, closeReason);
Log("Receive Task End !");
}
private void SocketDispose()
{
Log("Dispose");
WebSocketManager.Instance.Remove(this);
CleanSendQueue();
CleanEventQueue();
socket.Dispose();
socket = null;
cts.Dispose();
cts = null;
}
private void HandleOpen()
{
Log("OnOpen");
eventQueue.Enqueue(new OpenEventArgs());
}
private void HandleMessage(Opcode opcode, byte[] rawData)
{
Log($"OnMessage, type: {opcode}, size: {rawData.Length}");
eventQueue.Enqueue(new MessageEventArgs(opcode, rawData));
}
private void HandleClose(ushort code, string reason)
{
Log($"OnClose, code: {code}, reason: {reason}");
eventQueue.Enqueue(new CloseEventArgs(code, reason));
}
private void HandleError(Exception exception)
{
Log("OnError, error: " + exception.Message);
eventQueue.Enqueue(new ErrorEventArgs(exception.Message));
}
internal void Update()
{
while (eventQueue.Count > 0 && eventQueue.TryDequeue(out var e))
{
if (e is CloseEventArgs)
{
OnClose?.Invoke(this, e as CloseEventArgs);
SocketDispose();
break;
}
else if (e is OpenEventArgs)
{
OnOpen?.Invoke(this, e as OpenEventArgs);
}
else if (e is MessageEventArgs)
{
OnMessage?.Invoke(this, e as MessageEventArgs);
}
else if (e is ErrorEventArgs)
{
OnError?.Invoke(this, e as ErrorEventArgs);
}
}
}
internal void Abort()
{
Log("Abort");
if (cts != null)
{
cts.Cancel();
}
}
[System.Diagnostics.Conditional("UNITY_WEB_SOCKET_LOG")]
static void Log(string msg)
{
var time = DateTime.Now.ToString("HH:mm:ss.fff");
var thread = Thread.CurrentThread.ManagedThreadId;
UnityEngine.Debug.Log($"[{time}][UnityWebSocket][T-{thread:D3}] {msg}");
}
}
}
#endif

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: d10f88a23641b4beb8df74460fb7f705
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,74 @@
#if !NET_LEGACY && (UNITY_EDITOR || !UNITY_WEBGL)
using System.Collections.Generic;
using UnityEngine;
namespace UnityWebSocket
{
[DisallowMultipleComponent]
[DefaultExecutionOrder(-10000)]
internal class WebSocketManager : MonoBehaviour
{
private const string rootName = "[UnityWebSocket]";
private static WebSocketManager _instance;
public static WebSocketManager Instance
{
get
{
if (!_instance) CreateInstance();
return _instance;
}
}
private void Awake()
{
DontDestroyOnLoad(gameObject);
}
public static void CreateInstance()
{
GameObject go = GameObject.Find("/" + rootName);
if (!go) go = new GameObject(rootName);
_instance = go.GetComponent<WebSocketManager>();
if (!_instance) _instance = go.AddComponent<WebSocketManager>();
}
private readonly List<WebSocket> sockets = new List<WebSocket>();
public void Add(WebSocket socket)
{
if (!sockets.Contains(socket))
sockets.Add(socket);
}
public void Remove(WebSocket socket)
{
if (sockets.Contains(socket))
sockets.Remove(socket);
}
private void Update()
{
if (sockets.Count <= 0) return;
for (int i = sockets.Count - 1; i >= 0; i--)
{
sockets[i].Update();
}
}
#if UNITY_EDITOR
private void OnDisable()
{
SocketAbort();
}
private void SocketAbort()
{
for (int i = sockets.Count - 1; i >= 0; i--)
{
sockets[i].Abort();
}
}
#endif
}
}
#endif

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 99157fb5def394c83a9e5342036c92b0
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 1fb37927ec1ce4def9c5e7cff883f9f5
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,147 @@
#if !UNITY_EDITOR && UNITY_WEBGL
using System;
namespace UnityWebSocket
{
public class WebSocket : IWebSocket
{
public string Address { get; private set; }
public string[] SubProtocols { get; private set; }
public WebSocketState ReadyState { get { return (WebSocketState)WebSocketManager.WebSocketGetState(instanceId); } }
public event EventHandler<OpenEventArgs> OnOpen;
public event EventHandler<CloseEventArgs> OnClose;
public event EventHandler<ErrorEventArgs> OnError;
public event EventHandler<MessageEventArgs> OnMessage;
internal int instanceId = 0;
public WebSocket(string address)
{
this.Address = address;
AllocateInstance();
}
public WebSocket(string address, string subProtocol)
{
this.Address = address;
this.SubProtocols = new string[] { subProtocol };
AllocateInstance();
}
public WebSocket(string address, string[] subProtocols)
{
this.Address = address;
this.SubProtocols = subProtocols;
AllocateInstance();
}
internal void AllocateInstance()
{
instanceId = WebSocketManager.AllocateInstance(this.Address);
Log($"Allocate socket with instanceId: {instanceId}");
if (this.SubProtocols == null) return;
foreach (var protocol in this.SubProtocols)
{
if (string.IsNullOrEmpty(protocol)) continue;
Log($"Add Sub Protocol {protocol}, with instanceId: {instanceId}");
int code = WebSocketManager.WebSocketAddSubProtocol(instanceId, protocol);
if (code < 0)
{
HandleOnError(GetErrorMessageFromCode(code));
break;
}
}
}
~WebSocket()
{
Log($"Free socket with instanceId: {instanceId}");
WebSocketManager.WebSocketFree(instanceId);
}
public void ConnectAsync()
{
Log($"Connect with instanceId: {instanceId}");
WebSocketManager.Add(this);
int code = WebSocketManager.WebSocketConnect(instanceId);
if (code < 0) HandleOnError(GetErrorMessageFromCode(code));
}
public void CloseAsync()
{
Log($"Close with instanceId: {instanceId}");
int code = WebSocketManager.WebSocketClose(instanceId, (int)CloseStatusCode.Normal, "Normal Closure");
if (code < 0) HandleOnError(GetErrorMessageFromCode(code));
}
public void SendAsync(string text)
{
Log($"Send, type: {Opcode.Text}, size: {text.Length}");
int code = WebSocketManager.WebSocketSendStr(instanceId, text);
if (code < 0) HandleOnError(GetErrorMessageFromCode(code));
}
public void SendAsync(byte[] data)
{
Log($"Send, type: {Opcode.Binary}, size: {data.Length}");
int code = WebSocketManager.WebSocketSend(instanceId, data, data.Length);
if (code < 0) HandleOnError(GetErrorMessageFromCode(code));
}
internal void HandleOnOpen()
{
Log("OnOpen");
OnOpen?.Invoke(this, new OpenEventArgs());
}
internal void HandleOnMessage(byte[] rawData)
{
Log($"OnMessage, type: {Opcode.Binary}, size: {rawData.Length}");
OnMessage?.Invoke(this, new MessageEventArgs(Opcode.Binary, rawData));
}
internal void HandleOnMessageStr(string data)
{
Log($"OnMessage, type: {Opcode.Text}, size: {data.Length}");
OnMessage?.Invoke(this, new MessageEventArgs(Opcode.Text, data));
}
internal void HandleOnClose(ushort code, string reason)
{
Log($"OnClose, code: {code}, reason: {reason}");
OnClose?.Invoke(this, new CloseEventArgs(code, reason));
WebSocketManager.Remove(instanceId);
}
internal void HandleOnError(string msg)
{
Log("OnError, error: " + msg);
OnError?.Invoke(this, new ErrorEventArgs(msg));
}
internal static string GetErrorMessageFromCode(int errorCode)
{
switch (errorCode)
{
case -1: return "WebSocket instance not found.";
case -2: return "WebSocket is already connected or in connecting state.";
case -3: return "WebSocket is not connected.";
case -4: return "WebSocket is already closing.";
case -5: return "WebSocket is already closed.";
case -6: return "WebSocket is not in open state.";
case -7: return "Cannot close WebSocket, An invalid code was specified or reason is too long.";
case -8: return "Not support buffer slice. ";
default: return $"Unknown error code {errorCode}.";
}
}
[System.Diagnostics.Conditional("UNITY_WEB_SOCKET_LOG")]
static void Log(string msg)
{
var time = DateTime.Now.ToString("HH:mm:ss.fff");
UnityEngine.Debug.Log($"[{time}][UnityWebSocket] {msg}");
}
}
}
#endif

View File

@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 74a5b3c22251243d2a2f33e74741559d
timeCreated: 1466578513
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,153 @@
#if !UNITY_EDITOR && UNITY_WEBGL
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using AOT;
namespace UnityWebSocket
{
/// <summary>
/// Class providing static access methods to work with JSLIB WebSocket
/// </summary>
internal static class WebSocketManager
{
/* Map of websocket instances */
private static Dictionary<int, WebSocket> sockets = new Dictionary<int, WebSocket>();
/* Delegates */
public delegate void OnOpenCallback(int instanceId);
public delegate void OnMessageCallback(int instanceId, IntPtr msgPtr, int msgSize);
public delegate void OnMessageStrCallback(int instanceId, IntPtr msgStrPtr);
public delegate void OnErrorCallback(int instanceId, IntPtr errorPtr);
public delegate void OnCloseCallback(int instanceId, int closeCode, IntPtr reasonPtr);
/* WebSocket JSLIB functions */
[DllImport("__Internal")]
public static extern int WebSocketConnect(int instanceId);
[DllImport("__Internal")]
public static extern int WebSocketClose(int instanceId, int code, string reason);
[DllImport("__Internal")]
public static extern int WebSocketSend(int instanceId, byte[] dataPtr, int dataLength);
[DllImport("__Internal")]
public static extern int WebSocketSendStr(int instanceId, string data);
[DllImport("__Internal")]
public static extern int WebSocketGetState(int instanceId);
/* WebSocket JSLIB callback setters and other functions */
[DllImport("__Internal")]
public static extern int WebSocketAllocate(string url);
[DllImport("__Internal")]
public static extern int WebSocketAddSubProtocol(int instanceId, string protocol);
[DllImport("__Internal")]
public static extern void WebSocketFree(int instanceId);
[DllImport("__Internal")]
public static extern void WebSocketSetOnOpen(OnOpenCallback callback);
[DllImport("__Internal")]
public static extern void WebSocketSetOnMessage(OnMessageCallback callback);
[DllImport("__Internal")]
public static extern void WebSocketSetOnMessageStr(OnMessageStrCallback callback);
[DllImport("__Internal")]
public static extern void WebSocketSetOnError(OnErrorCallback callback);
[DllImport("__Internal")]
public static extern void WebSocketSetOnClose(OnCloseCallback callback);
/* If callbacks was initialized and set */
private static bool isInitialized = false;
/* Initialize WebSocket callbacks to JSLIB */
private static void Initialize()
{
WebSocketSetOnOpen(DelegateOnOpenEvent);
WebSocketSetOnMessage(DelegateOnMessageEvent);
WebSocketSetOnMessageStr(DelegateOnMessageStrEvent);
WebSocketSetOnError(DelegateOnErrorEvent);
WebSocketSetOnClose(DelegateOnCloseEvent);
isInitialized = true;
}
[MonoPInvokeCallback(typeof(OnOpenCallback))]
public static void DelegateOnOpenEvent(int instanceId)
{
if (sockets.TryGetValue(instanceId, out var socket))
{
socket.HandleOnOpen();
}
}
[MonoPInvokeCallback(typeof(OnMessageCallback))]
public static void DelegateOnMessageEvent(int instanceId, IntPtr msgPtr, int msgSize)
{
if (sockets.TryGetValue(instanceId, out var socket))
{
var bytes = new byte[msgSize];
Marshal.Copy(msgPtr, bytes, 0, msgSize);
socket.HandleOnMessage(bytes);
}
}
[MonoPInvokeCallback(typeof(OnMessageStrCallback))]
public static void DelegateOnMessageStrEvent(int instanceId, IntPtr msgStrPtr)
{
if (sockets.TryGetValue(instanceId, out var socket))
{
string msgStr = Marshal.PtrToStringAuto(msgStrPtr);
socket.HandleOnMessageStr(msgStr);
}
}
[MonoPInvokeCallback(typeof(OnErrorCallback))]
public static void DelegateOnErrorEvent(int instanceId, IntPtr errorPtr)
{
if (sockets.TryGetValue(instanceId, out var socket))
{
string errorMsg = Marshal.PtrToStringAuto(errorPtr);
socket.HandleOnError(errorMsg);
}
}
[MonoPInvokeCallback(typeof(OnCloseCallback))]
public static void DelegateOnCloseEvent(int instanceId, int closeCode, IntPtr reasonPtr)
{
if (sockets.TryGetValue(instanceId, out var socket))
{
string reason = Marshal.PtrToStringAuto(reasonPtr);
socket.HandleOnClose((ushort)closeCode, reason);
}
}
internal static int AllocateInstance(string address)
{
if (!isInitialized) Initialize();
return WebSocketAllocate(address);
}
internal static void Add(WebSocket socket)
{
if (!sockets.ContainsKey(socket.instanceId))
{
sockets.Add(socket.instanceId, socket);
}
}
internal static void Remove(int instanceId)
{
if (sockets.ContainsKey(instanceId))
{
sockets.Remove(instanceId);
}
}
}
}
#endif

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 246cdc66a1e2047148371a8e56e17d3a
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,12 @@
{
"name": "UnityWebSocket.Runtime",
"references": [],
"optionalUnityReferences": [],
"includePlatforms": [],
"excludePlatforms": [],
"allowUnsafeCode": false,
"overrideReferences": false,
"precompiledReferences": [],
"autoReferenced": true,
"defineConstraints": []
}

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 8b65d8710c3b04373a41cbf6b777ee65
AssemblyDefinitionImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 238d5690fe411f84da0c68ad5efd0d81
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,83 @@
// <auto-generated>
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: config.proto
// </auto-generated>
#pragma warning disable 1591, 0612, 3021, 8981
#region Designer generated code
using pb = global::Google.Protobuf;
using pbc = global::Google.Protobuf.Collections;
using pbr = global::Google.Protobuf.Reflection;
using scg = global::System.Collections.Generic;
/// <summary>Holder for reflection information generated from config.proto</summary>
public static partial class ConfigReflection {
#region Descriptor
/// <summary>File descriptor for config.proto</summary>
public static pbr::FileDescriptor Descriptor {
get { return descriptor; }
}
private static pbr::FileDescriptor descriptor;
static ConfigReflection() {
byte[] descriptorData = global::System.Convert.FromBase64String(
string.Concat(
"Cgxjb25maWcucHJvdG8qnQEKCkVSUk9SX0NPREUSCgoGRVJSX09rEAASEAoM",
"RVJSX05vUGxheWVyEAESDgoKRVJSX05vUm9vbRACEg0KCUVSUl9Ub2tlbhAE",
"Eg0KCUVSUl9Mb2dpbhAFEg4KCkVSUl9BY3Rpb24QBhIOCgpFUlJfUGFyYW1z",
"EAcSDgoKRVJSX1NlcnZlchAIEhMKD0VSUl9Ob0F1dGhvcml0eRAJQgdaBS4v",
"O3BiYgZwcm90bzM="));
descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
new pbr::FileDescriptor[] { },
new pbr::GeneratedClrTypeInfo(new[] {typeof(global::ERROR_CODE), }, null, null));
}
#endregion
}
#region Enums
/// <summary>
///错误码
/// </summary>
public enum ERROR_CODE {
/// <summary>
///OK
/// </summary>
[pbr::OriginalName("ERR_Ok")] ErrOk = 0,
/// <summary>
///没有这个玩家
/// </summary>
[pbr::OriginalName("ERR_NoPlayer")] ErrNoPlayer = 1,
/// <summary>
///加入房间失败
/// </summary>
[pbr::OriginalName("ERR_NoRoom")] ErrNoRoom = 2,
/// <summary>
///Token验证失败
/// </summary>
[pbr::OriginalName("ERR_Token")] ErrToken = 4,
/// <summary>
///登录失败
/// </summary>
[pbr::OriginalName("ERR_Login")] ErrLogin = 5,
/// <summary>
///操作失败
/// </summary>
[pbr::OriginalName("ERR_Action")] ErrAction = 6,
/// <summary>
///参数错误
/// </summary>
[pbr::OriginalName("ERR_Params")] ErrParams = 7,
/// <summary>
///服务器内部错误
/// </summary>
[pbr::OriginalName("ERR_Server")] ErrServer = 8,
/// <summary>
///没有权限
/// </summary>
[pbr::OriginalName("ERR_NoAuthority")] ErrNoAuthority = 9,
}
#endregion
#endregion Designer generated code

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 6249125b6bd7a964aa825c041b9cab82
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 013d659005f08544cafe01b5a18e6072
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 8fd26537609bdf14b8eb7d5150ef5262
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,675 @@
// <auto-generated>
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: join.proto
// </auto-generated>
#pragma warning disable 1591, 0612, 3021, 8981
#region Designer generated code
using pb = global::Google.Protobuf;
using pbc = global::Google.Protobuf.Collections;
using pbr = global::Google.Protobuf.Reflection;
using scg = global::System.Collections.Generic;
/// <summary>Holder for reflection information generated from join.proto</summary>
public static partial class JoinReflection {
#region Descriptor
/// <summary>File descriptor for join.proto</summary>
public static pbr::FileDescriptor Descriptor {
get { return descriptor; }
}
private static pbr::FileDescriptor descriptor;
static JoinReflection() {
byte[] descriptorData = global::System.Convert.FromBase64String(
string.Concat(
"Cgpqb2luLnByb3RvIogBChBVc2VySm9pblJlc3BvbnNlEg4KBnVzZXJJZBgB",
"IAEoAxIQCghuaWNrTmFtZRgCIAEoCRIQCghyb2xlTmFtZRgDIAEoCRIOCgZy",
"b29tSWQYBCABKAkSDgoGb25saW5lGAUgASgIEhMKC21lc3NhZ2VUeXBlGAYg",
"ASgFEgsKA2NtZBgHIAEoCSI3ChBSb29tVXNlclJlc3BvbnNlEiMKCHVzZXJM",
"aXN0GAEgAygLMhEuVXNlckpvaW5SZXNwb25zZUIHWgUuLztwYmIGcHJvdG8z"));
descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
new pbr::FileDescriptor[] { },
new pbr::GeneratedClrTypeInfo(null, null, new pbr::GeneratedClrTypeInfo[] {
new pbr::GeneratedClrTypeInfo(typeof(global::UserJoinResponse), global::UserJoinResponse.Parser, new[]{ "UserId", "NickName", "RoleName", "RoomId", "Online", "MessageType", "Cmd" }, null, null, null, null),
new pbr::GeneratedClrTypeInfo(typeof(global::RoomUserResponse), global::RoomUserResponse.Parser, new[]{ "UserList" }, null, null, null, null)
}));
}
#endregion
}
#region Messages
[global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")]
public sealed partial class UserJoinResponse : pb::IMessage<UserJoinResponse>
#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
, pb::IBufferMessage
#endif
{
private static readonly pb::MessageParser<UserJoinResponse> _parser = new pb::MessageParser<UserJoinResponse>(() => new UserJoinResponse());
private pb::UnknownFieldSet _unknownFields;
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public static pb::MessageParser<UserJoinResponse> Parser { get { return _parser; } }
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public static pbr::MessageDescriptor Descriptor {
get { return global::JoinReflection.Descriptor.MessageTypes[0]; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
pbr::MessageDescriptor pb::IMessage.Descriptor {
get { return Descriptor; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public UserJoinResponse() {
OnConstruction();
}
partial void OnConstruction();
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public UserJoinResponse(UserJoinResponse other) : this() {
userId_ = other.userId_;
nickName_ = other.nickName_;
roleName_ = other.roleName_;
roomId_ = other.roomId_;
online_ = other.online_;
messageType_ = other.messageType_;
cmd_ = other.cmd_;
_unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public UserJoinResponse Clone() {
return new UserJoinResponse(this);
}
/// <summary>Field number for the "userId" field.</summary>
public const int UserIdFieldNumber = 1;
private long userId_;
/// <summary>
/// 用户id
/// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public long UserId {
get { return userId_; }
set {
userId_ = value;
}
}
/// <summary>Field number for the "nickName" field.</summary>
public const int NickNameFieldNumber = 2;
private string nickName_ = "";
/// <summary>
/// 用户名
/// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public string NickName {
get { return nickName_; }
set {
nickName_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
}
}
/// <summary>Field number for the "roleName" field.</summary>
public const int RoleNameFieldNumber = 3;
private string roleName_ = "";
/// <summary>
/// 用户角色
/// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public string RoleName {
get { return roleName_; }
set {
roleName_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
}
}
/// <summary>Field number for the "roomId" field.</summary>
public const int RoomIdFieldNumber = 4;
private string roomId_ = "";
/// <summary>
///房间号
/// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public string RoomId {
get { return roomId_; }
set {
roomId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
}
}
/// <summary>Field number for the "online" field.</summary>
public const int OnlineFieldNumber = 5;
private bool online_;
/// <summary>
///状态 接收这个用户是不是掉线了
/// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public bool Online {
get { return online_; }
set {
online_ = value;
}
}
/// <summary>Field number for the "messageType" field.</summary>
public const int MessageTypeFieldNumber = 6;
private int messageType_;
/// <summary>
///事件状态 1 用户上线 2用户下线 3 用户加入房间
/// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public int MessageType {
get { return messageType_; }
set {
messageType_ = value;
}
}
/// <summary>Field number for the "cmd" field.</summary>
public const int CmdFieldNumber = 7;
private string cmd_ = "";
/// <summary>
///操作指令
/// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public string Cmd {
get { return cmd_; }
set {
cmd_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
}
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public override bool Equals(object other) {
return Equals(other as UserJoinResponse);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public bool Equals(UserJoinResponse other) {
if (ReferenceEquals(other, null)) {
return false;
}
if (ReferenceEquals(other, this)) {
return true;
}
if (UserId != other.UserId) return false;
if (NickName != other.NickName) return false;
if (RoleName != other.RoleName) return false;
if (RoomId != other.RoomId) return false;
if (Online != other.Online) return false;
if (MessageType != other.MessageType) return false;
if (Cmd != other.Cmd) return false;
return Equals(_unknownFields, other._unknownFields);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public override int GetHashCode() {
int hash = 1;
if (UserId != 0L) hash ^= UserId.GetHashCode();
if (NickName.Length != 0) hash ^= NickName.GetHashCode();
if (RoleName.Length != 0) hash ^= RoleName.GetHashCode();
if (RoomId.Length != 0) hash ^= RoomId.GetHashCode();
if (Online != false) hash ^= Online.GetHashCode();
if (MessageType != 0) hash ^= MessageType.GetHashCode();
if (Cmd.Length != 0) hash ^= Cmd.GetHashCode();
if (_unknownFields != null) {
hash ^= _unknownFields.GetHashCode();
}
return hash;
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public override string ToString() {
return pb::JsonFormatter.ToDiagnosticString(this);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public void WriteTo(pb::CodedOutputStream output) {
#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
output.WriteRawMessage(this);
#else
if (UserId != 0L) {
output.WriteRawTag(8);
output.WriteInt64(UserId);
}
if (NickName.Length != 0) {
output.WriteRawTag(18);
output.WriteString(NickName);
}
if (RoleName.Length != 0) {
output.WriteRawTag(26);
output.WriteString(RoleName);
}
if (RoomId.Length != 0) {
output.WriteRawTag(34);
output.WriteString(RoomId);
}
if (Online != false) {
output.WriteRawTag(40);
output.WriteBool(Online);
}
if (MessageType != 0) {
output.WriteRawTag(48);
output.WriteInt32(MessageType);
}
if (Cmd.Length != 0) {
output.WriteRawTag(58);
output.WriteString(Cmd);
}
if (_unknownFields != null) {
_unknownFields.WriteTo(output);
}
#endif
}
#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) {
if (UserId != 0L) {
output.WriteRawTag(8);
output.WriteInt64(UserId);
}
if (NickName.Length != 0) {
output.WriteRawTag(18);
output.WriteString(NickName);
}
if (RoleName.Length != 0) {
output.WriteRawTag(26);
output.WriteString(RoleName);
}
if (RoomId.Length != 0) {
output.WriteRawTag(34);
output.WriteString(RoomId);
}
if (Online != false) {
output.WriteRawTag(40);
output.WriteBool(Online);
}
if (MessageType != 0) {
output.WriteRawTag(48);
output.WriteInt32(MessageType);
}
if (Cmd.Length != 0) {
output.WriteRawTag(58);
output.WriteString(Cmd);
}
if (_unknownFields != null) {
_unknownFields.WriteTo(ref output);
}
}
#endif
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public int CalculateSize() {
int size = 0;
if (UserId != 0L) {
size += 1 + pb::CodedOutputStream.ComputeInt64Size(UserId);
}
if (NickName.Length != 0) {
size += 1 + pb::CodedOutputStream.ComputeStringSize(NickName);
}
if (RoleName.Length != 0) {
size += 1 + pb::CodedOutputStream.ComputeStringSize(RoleName);
}
if (RoomId.Length != 0) {
size += 1 + pb::CodedOutputStream.ComputeStringSize(RoomId);
}
if (Online != false) {
size += 1 + 1;
}
if (MessageType != 0) {
size += 1 + pb::CodedOutputStream.ComputeInt32Size(MessageType);
}
if (Cmd.Length != 0) {
size += 1 + pb::CodedOutputStream.ComputeStringSize(Cmd);
}
if (_unknownFields != null) {
size += _unknownFields.CalculateSize();
}
return size;
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public void MergeFrom(UserJoinResponse other) {
if (other == null) {
return;
}
if (other.UserId != 0L) {
UserId = other.UserId;
}
if (other.NickName.Length != 0) {
NickName = other.NickName;
}
if (other.RoleName.Length != 0) {
RoleName = other.RoleName;
}
if (other.RoomId.Length != 0) {
RoomId = other.RoomId;
}
if (other.Online != false) {
Online = other.Online;
}
if (other.MessageType != 0) {
MessageType = other.MessageType;
}
if (other.Cmd.Length != 0) {
Cmd = other.Cmd;
}
_unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public void MergeFrom(pb::CodedInputStream input) {
#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
input.ReadRawMessage(this);
#else
uint tag;
while ((tag = input.ReadTag()) != 0) {
if ((tag & 7) == 4) {
// Abort on any end group tag.
return;
}
switch(tag) {
default:
_unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
break;
case 8: {
UserId = input.ReadInt64();
break;
}
case 18: {
NickName = input.ReadString();
break;
}
case 26: {
RoleName = input.ReadString();
break;
}
case 34: {
RoomId = input.ReadString();
break;
}
case 40: {
Online = input.ReadBool();
break;
}
case 48: {
MessageType = input.ReadInt32();
break;
}
case 58: {
Cmd = input.ReadString();
break;
}
}
}
#endif
}
#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) {
uint tag;
while ((tag = input.ReadTag()) != 0) {
if ((tag & 7) == 4) {
// Abort on any end group tag.
return;
}
switch(tag) {
default:
_unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input);
break;
case 8: {
UserId = input.ReadInt64();
break;
}
case 18: {
NickName = input.ReadString();
break;
}
case 26: {
RoleName = input.ReadString();
break;
}
case 34: {
RoomId = input.ReadString();
break;
}
case 40: {
Online = input.ReadBool();
break;
}
case 48: {
MessageType = input.ReadInt32();
break;
}
case 58: {
Cmd = input.ReadString();
break;
}
}
}
}
#endif
}
[global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")]
public sealed partial class RoomUserResponse : pb::IMessage<RoomUserResponse>
#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
, pb::IBufferMessage
#endif
{
private static readonly pb::MessageParser<RoomUserResponse> _parser = new pb::MessageParser<RoomUserResponse>(() => new RoomUserResponse());
private pb::UnknownFieldSet _unknownFields;
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public static pb::MessageParser<RoomUserResponse> Parser { get { return _parser; } }
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public static pbr::MessageDescriptor Descriptor {
get { return global::JoinReflection.Descriptor.MessageTypes[1]; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
pbr::MessageDescriptor pb::IMessage.Descriptor {
get { return Descriptor; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public RoomUserResponse() {
OnConstruction();
}
partial void OnConstruction();
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public RoomUserResponse(RoomUserResponse other) : this() {
userList_ = other.userList_.Clone();
_unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public RoomUserResponse Clone() {
return new RoomUserResponse(this);
}
/// <summary>Field number for the "userList" field.</summary>
public const int UserListFieldNumber = 1;
private static readonly pb::FieldCodec<global::UserJoinResponse> _repeated_userList_codec
= pb::FieldCodec.ForMessage(10, global::UserJoinResponse.Parser);
private readonly pbc::RepeatedField<global::UserJoinResponse> userList_ = new pbc::RepeatedField<global::UserJoinResponse>();
/// <summary>
///用户列表
/// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public pbc::RepeatedField<global::UserJoinResponse> UserList {
get { return userList_; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public override bool Equals(object other) {
return Equals(other as RoomUserResponse);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public bool Equals(RoomUserResponse other) {
if (ReferenceEquals(other, null)) {
return false;
}
if (ReferenceEquals(other, this)) {
return true;
}
if(!userList_.Equals(other.userList_)) return false;
return Equals(_unknownFields, other._unknownFields);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public override int GetHashCode() {
int hash = 1;
hash ^= userList_.GetHashCode();
if (_unknownFields != null) {
hash ^= _unknownFields.GetHashCode();
}
return hash;
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public override string ToString() {
return pb::JsonFormatter.ToDiagnosticString(this);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public void WriteTo(pb::CodedOutputStream output) {
#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
output.WriteRawMessage(this);
#else
userList_.WriteTo(output, _repeated_userList_codec);
if (_unknownFields != null) {
_unknownFields.WriteTo(output);
}
#endif
}
#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) {
userList_.WriteTo(ref output, _repeated_userList_codec);
if (_unknownFields != null) {
_unknownFields.WriteTo(ref output);
}
}
#endif
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public int CalculateSize() {
int size = 0;
size += userList_.CalculateSize(_repeated_userList_codec);
if (_unknownFields != null) {
size += _unknownFields.CalculateSize();
}
return size;
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public void MergeFrom(RoomUserResponse other) {
if (other == null) {
return;
}
userList_.Add(other.userList_);
_unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public void MergeFrom(pb::CodedInputStream input) {
#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
input.ReadRawMessage(this);
#else
uint tag;
while ((tag = input.ReadTag()) != 0) {
if ((tag & 7) == 4) {
// Abort on any end group tag.
return;
}
switch(tag) {
default:
_unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
break;
case 10: {
userList_.AddEntriesFrom(input, _repeated_userList_codec);
break;
}
}
}
#endif
}
#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) {
uint tag;
while ((tag = input.ReadTag()) != 0) {
if ((tag & 7) == 4) {
// Abort on any end group tag.
return;
}
switch(tag) {
default:
_unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input);
break;
case 10: {
userList_.AddEntriesFrom(ref input, _repeated_userList_codec);
break;
}
}
}
}
#endif
}
#endregion
#endregion Designer generated code

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 63abcfa0f6080534d8642cfb5eae1ac0
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,525 @@
// <auto-generated>
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: message_broadcast.proto
// </auto-generated>
#pragma warning disable 1591, 0612, 3021, 8981
#region Designer generated code
using pb = global::Google.Protobuf;
using pbc = global::Google.Protobuf.Collections;
using pbr = global::Google.Protobuf.Reflection;
using scg = global::System.Collections.Generic;
/// <summary>Holder for reflection information generated from message_broadcast.proto</summary>
public static partial class MessageBroadcastReflection {
#region Descriptor
/// <summary>File descriptor for message_broadcast.proto</summary>
public static pbr::FileDescriptor Descriptor {
get { return descriptor; }
}
private static pbr::FileDescriptor descriptor;
static MessageBroadcastReflection() {
byte[] descriptorData = global::System.Convert.FromBase64String(
string.Concat(
"ChdtZXNzYWdlX2Jyb2FkY2FzdC5wcm90byJUChdNZXNzYWdlQnJvYWRjYXN0",
"UmVxdWVzdBIOCgZyb29tSWQYASABKAkSDAoEdHlwZRgCIAEoBRIOCgZyb2xl",
"SWQYAyABKAkSCwoDY21kGAQgASgJIhoKGE1lc3NhZ2VCcm9hZGNhc3RSZXNw",
"b25zZUIHWgUuLztwYmIGcHJvdG8z"));
descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
new pbr::FileDescriptor[] { },
new pbr::GeneratedClrTypeInfo(null, null, new pbr::GeneratedClrTypeInfo[] {
new pbr::GeneratedClrTypeInfo(typeof(global::MessageBroadcastRequest), global::MessageBroadcastRequest.Parser, new[]{ "RoomId", "Type", "RoleId", "Cmd" }, null, null, null, null),
new pbr::GeneratedClrTypeInfo(typeof(global::MessageBroadcastResponse), global::MessageBroadcastResponse.Parser, null, null, null, null, null)
}));
}
#endregion
}
#region Messages
[global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")]
public sealed partial class MessageBroadcastRequest : pb::IMessage<MessageBroadcastRequest>
#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
, pb::IBufferMessage
#endif
{
private static readonly pb::MessageParser<MessageBroadcastRequest> _parser = new pb::MessageParser<MessageBroadcastRequest>(() => new MessageBroadcastRequest());
private pb::UnknownFieldSet _unknownFields;
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public static pb::MessageParser<MessageBroadcastRequest> Parser { get { return _parser; } }
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public static pbr::MessageDescriptor Descriptor {
get { return global::MessageBroadcastReflection.Descriptor.MessageTypes[0]; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
pbr::MessageDescriptor pb::IMessage.Descriptor {
get { return Descriptor; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public MessageBroadcastRequest() {
OnConstruction();
}
partial void OnConstruction();
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public MessageBroadcastRequest(MessageBroadcastRequest other) : this() {
roomId_ = other.roomId_;
type_ = other.type_;
roleId_ = other.roleId_;
cmd_ = other.cmd_;
_unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public MessageBroadcastRequest Clone() {
return new MessageBroadcastRequest(this);
}
/// <summary>Field number for the "roomId" field.</summary>
public const int RoomIdFieldNumber = 1;
private string roomId_ = "";
/// <summary>
/// 房间id
/// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public string RoomId {
get { return roomId_; }
set {
roomId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
}
}
/// <summary>Field number for the "type" field.</summary>
public const int TypeFieldNumber = 2;
private int type_;
/// <summary>
/// 消息类型 1. 文本 2. 图片 3. 语音 4. 视频
/// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public int Type {
get { return type_; }
set {
type_ = value;
}
}
/// <summary>Field number for the "roleId" field.</summary>
public const int RoleIdFieldNumber = 3;
private string roleId_ = "";
/// <summary>
/// 角色Id 如果为空就是给所有人发
/// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public string RoleId {
get { return roleId_; }
set {
roleId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
}
}
/// <summary>Field number for the "cmd" field.</summary>
public const int CmdFieldNumber = 4;
private string cmd_ = "";
/// <summary>
/// 自定义命令
/// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public string Cmd {
get { return cmd_; }
set {
cmd_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
}
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public override bool Equals(object other) {
return Equals(other as MessageBroadcastRequest);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public bool Equals(MessageBroadcastRequest other) {
if (ReferenceEquals(other, null)) {
return false;
}
if (ReferenceEquals(other, this)) {
return true;
}
if (RoomId != other.RoomId) return false;
if (Type != other.Type) return false;
if (RoleId != other.RoleId) return false;
if (Cmd != other.Cmd) return false;
return Equals(_unknownFields, other._unknownFields);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public override int GetHashCode() {
int hash = 1;
if (RoomId.Length != 0) hash ^= RoomId.GetHashCode();
if (Type != 0) hash ^= Type.GetHashCode();
if (RoleId.Length != 0) hash ^= RoleId.GetHashCode();
if (Cmd.Length != 0) hash ^= Cmd.GetHashCode();
if (_unknownFields != null) {
hash ^= _unknownFields.GetHashCode();
}
return hash;
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public override string ToString() {
return pb::JsonFormatter.ToDiagnosticString(this);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public void WriteTo(pb::CodedOutputStream output) {
#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
output.WriteRawMessage(this);
#else
if (RoomId.Length != 0) {
output.WriteRawTag(10);
output.WriteString(RoomId);
}
if (Type != 0) {
output.WriteRawTag(16);
output.WriteInt32(Type);
}
if (RoleId.Length != 0) {
output.WriteRawTag(26);
output.WriteString(RoleId);
}
if (Cmd.Length != 0) {
output.WriteRawTag(34);
output.WriteString(Cmd);
}
if (_unknownFields != null) {
_unknownFields.WriteTo(output);
}
#endif
}
#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) {
if (RoomId.Length != 0) {
output.WriteRawTag(10);
output.WriteString(RoomId);
}
if (Type != 0) {
output.WriteRawTag(16);
output.WriteInt32(Type);
}
if (RoleId.Length != 0) {
output.WriteRawTag(26);
output.WriteString(RoleId);
}
if (Cmd.Length != 0) {
output.WriteRawTag(34);
output.WriteString(Cmd);
}
if (_unknownFields != null) {
_unknownFields.WriteTo(ref output);
}
}
#endif
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public int CalculateSize() {
int size = 0;
if (RoomId.Length != 0) {
size += 1 + pb::CodedOutputStream.ComputeStringSize(RoomId);
}
if (Type != 0) {
size += 1 + pb::CodedOutputStream.ComputeInt32Size(Type);
}
if (RoleId.Length != 0) {
size += 1 + pb::CodedOutputStream.ComputeStringSize(RoleId);
}
if (Cmd.Length != 0) {
size += 1 + pb::CodedOutputStream.ComputeStringSize(Cmd);
}
if (_unknownFields != null) {
size += _unknownFields.CalculateSize();
}
return size;
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public void MergeFrom(MessageBroadcastRequest other) {
if (other == null) {
return;
}
if (other.RoomId.Length != 0) {
RoomId = other.RoomId;
}
if (other.Type != 0) {
Type = other.Type;
}
if (other.RoleId.Length != 0) {
RoleId = other.RoleId;
}
if (other.Cmd.Length != 0) {
Cmd = other.Cmd;
}
_unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public void MergeFrom(pb::CodedInputStream input) {
#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
input.ReadRawMessage(this);
#else
uint tag;
while ((tag = input.ReadTag()) != 0) {
if ((tag & 7) == 4) {
// Abort on any end group tag.
return;
}
switch(tag) {
default:
_unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
break;
case 10: {
RoomId = input.ReadString();
break;
}
case 16: {
Type = input.ReadInt32();
break;
}
case 26: {
RoleId = input.ReadString();
break;
}
case 34: {
Cmd = input.ReadString();
break;
}
}
}
#endif
}
#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) {
uint tag;
while ((tag = input.ReadTag()) != 0) {
if ((tag & 7) == 4) {
// Abort on any end group tag.
return;
}
switch(tag) {
default:
_unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input);
break;
case 10: {
RoomId = input.ReadString();
break;
}
case 16: {
Type = input.ReadInt32();
break;
}
case 26: {
RoleId = input.ReadString();
break;
}
case 34: {
Cmd = input.ReadString();
break;
}
}
}
}
#endif
}
[global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")]
public sealed partial class MessageBroadcastResponse : pb::IMessage<MessageBroadcastResponse>
#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
, pb::IBufferMessage
#endif
{
private static readonly pb::MessageParser<MessageBroadcastResponse> _parser = new pb::MessageParser<MessageBroadcastResponse>(() => new MessageBroadcastResponse());
private pb::UnknownFieldSet _unknownFields;
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public static pb::MessageParser<MessageBroadcastResponse> Parser { get { return _parser; } }
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public static pbr::MessageDescriptor Descriptor {
get { return global::MessageBroadcastReflection.Descriptor.MessageTypes[1]; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
pbr::MessageDescriptor pb::IMessage.Descriptor {
get { return Descriptor; }
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public MessageBroadcastResponse() {
OnConstruction();
}
partial void OnConstruction();
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public MessageBroadcastResponse(MessageBroadcastResponse other) : this() {
_unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public MessageBroadcastResponse Clone() {
return new MessageBroadcastResponse(this);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public override bool Equals(object other) {
return Equals(other as MessageBroadcastResponse);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public bool Equals(MessageBroadcastResponse other) {
if (ReferenceEquals(other, null)) {
return false;
}
if (ReferenceEquals(other, this)) {
return true;
}
return Equals(_unknownFields, other._unknownFields);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public override int GetHashCode() {
int hash = 1;
if (_unknownFields != null) {
hash ^= _unknownFields.GetHashCode();
}
return hash;
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public override string ToString() {
return pb::JsonFormatter.ToDiagnosticString(this);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public void WriteTo(pb::CodedOutputStream output) {
#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
output.WriteRawMessage(this);
#else
if (_unknownFields != null) {
_unknownFields.WriteTo(output);
}
#endif
}
#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) {
if (_unknownFields != null) {
_unknownFields.WriteTo(ref output);
}
}
#endif
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public int CalculateSize() {
int size = 0;
if (_unknownFields != null) {
size += _unknownFields.CalculateSize();
}
return size;
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public void MergeFrom(MessageBroadcastResponse other) {
if (other == null) {
return;
}
_unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public void MergeFrom(pb::CodedInputStream input) {
#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
input.ReadRawMessage(this);
#else
uint tag;
while ((tag = input.ReadTag()) != 0) {
if ((tag & 7) == 4) {
// Abort on any end group tag.
return;
}
switch(tag) {
default:
_unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
break;
}
}
#endif
}
#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) {
uint tag;
while ((tag = input.ReadTag()) != 0) {
if ((tag & 7) == 4) {
// Abort on any end group tag.
return;
}
switch(tag) {
default:
_unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input);
break;
}
}
}
#endif
}
#endregion
#endregion Designer generated code

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 061900a49550cc74582eb8e4598a886b
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 3b549e9113344b542a6f785f98166927
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 66a0cd6fc174b4042b409c9030c08516
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,28 @@
using Google.Protobuf;
using System;
public class ProtoBufffer
{
public static byte[] Serialize(IMessage message)
{
return message.ToByteArray();
}
public static T DeSerialize<T>(byte[] packet) where T : IMessage, new()
{
IMessage message = new T();
try
{
return (T)message.Descriptor.Parser.ParseFrom(packet);
}
catch (System.Exception e)
{
throw;
}
}
internal static T DeSerialize<T>(ByteString data)
{
throw new NotImplementedException();
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 09a7d1a0777441d489f8b7ffae5077c9
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: efe7f33d728ac2948956f9a0bcf43259
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 7dc2c5b09fa1821438dbc817a6f5cb74
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 89dab302d915deb4ba459f561a2a9f15
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -320,7 +320,7 @@ public sealed partial class WSMessage : pb::IMessage<WSMessage>
}
}
#endif
}
}
#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: b1a0e968aa808f743ae45f5525efa824
guid: 6d54b057f10017a4d98893bdbd8509e0
MonoImporter:
externalObjects: {}
serializedVersion: 2

View File

@ -0,0 +1,215 @@
// WebSocket
using Google.Protobuf.WellKnownTypes;
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using UnityEngine;
using UnityWebSocket;
/// <summary>
/// Socket连接
/// </summary>
public class WEBScriptListener: MonoBehaviour
{
public string serverIP = "ws://192.168.3.110";
//服务器端口
public int serverPort = 8445;
WebSocket socket;
public string type; // 类型
public delegate void MyCallback(byte[] data);
public event MyCallback OnCallback;
public void ConcatWEBSocket()
{
socket = new WebSocket($"{serverIP}:{serverPort}/safety/cloud");
socket.OnOpen += Socket_OnOpen;
socket.OnMessage += Socket_OnMessage;
socket.OnError += Socket_OnError;
socket.ConnectAsync();
Debug.Log($"执行websocket");
}
private void Socket_OnOpen(object sender, OpenEventArgs e)
{
Debug.Log("================");
}
void Socket_OnMessage(object sender, MessageEventArgs e)
{
var data = Encoding.UTF8.GetString(e.RawData);
if (OnCallback != null)
{
Debug.Log(e.RawData);
OnCallback(e.RawData);
}
}
void Socket_OnError(object sender, ErrorEventArgs e)
{
Debug.Log(string.Format("Error: {0}", e.Message));
}
public void SendMessageByte(byte[] message)
{
if (socket != null)
{
Debug.Log("发送信息");
Debug.Log(string.Format("Error: {0}", message));
socket.SendAsync(message);
}
else
{
Debug.LogError("WebSocket is not connected!");
}
}
public void SendMessageText(string message)
{
if (socket != null)
{
Debug.Log("发送信息");
socket.SendAsync(message);
}
else
{
Debug.LogError("WebSocket is not connected!");
}
}
//服务器端口
/*public string serverIP = "192.168.3.110";
public int serverPort = 8445;
Socket socket;
private bool IsConnect = true;
private string recMes = "NULL";
private int recTimes = 0;
private string staInfo = "NULL";
private object s_thread;
public void ConcatWEBSocket()
{
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
IPAddress ip = IPAddress.Parse(serverIP);
IPEndPoint point = new IPEndPoint(ip, serverPort);
socket.Connect(point);
Debug.Log("连接成功 , " + " ip = " + ip + " port = " + serverPort);
staInfo = ip + ":" + serverPort + " 连接成功";
Thread r_thread = new Thread(ReceiveMessage); //开启新的线程,不停的接收服务器发来的消息
r_thread.IsBackground = true;
r_thread.Start();
Thread s_thread = new Thread(SendMessage); //开启新的线程,不停的给服务器发送消息
s_thread.IsBackground = true;
s_thread.Start();
}
catch (Exception)
{
Debug.Log("IP或者端口号错误......");
staInfo = "IP或者端口号错误......";
}
}
void SendMessage()
{
Debug.Log("发送消息!");
byte[] data = Encoding.UTF8.GetBytes("CCDDA10100010001A448");
socket.Send(data);
}
void ReceiveMessage()
{
while (IsConnect)
{
try
{
byte[] buffer = new byte[9];
//实际接收到的有效字节数
int len = socket.Receive(buffer);
if (len == 0)
{
break;
}
recMes = HexDecoder.ByteArrayToString(buffer);
Debug.Log("客户端接收到的数据 " + len);
Debug.Log("客户端接收到的数据 " + recMes.ToUpper());
recTimes++;
staInfo = "接收到一次数据,接收次数为 " + recTimes;
Debug.Log("接收次数为:" + recTimes);
}
catch { }
}
}
// HEX 转换为16进制
public class HexDecoder
{
public static string ByteArrayToString(byte[] ba)
{
StringBuilder hex = new StringBuilder(ba.Length * 2);
foreach (byte b in ba)
hex.AppendFormat("{0:x2}", b);
return hex.ToString();
}
}*/
}
/*using System.Net.Sockets;
using System.Net;
using System.Text;
using System.IO;
using UnityEngine;
public class WEBScriptListener
{
public void TCPServerDemo()
{
//服务端的IP地址
//请先在终端上查询服务器IP
string serverIP = "192.168.3.218";
//服务器端口
int serverPort = 50000;
Debug.Log("本机作为服务端");
Debug.Log($"本机IP{serverIP},端口:{serverPort}");
//使用指定的地址族,套接字类型和协议实例化新的套接字
Socket socketServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//将字符串地址转化为网际协议地址
IPAddress ipAddress = IPAddress.Parse(serverIP);//这里为服务器IP
//使用指定地址和端口号实例化新的网络端点
IPEndPoint endPoint = new IPEndPoint(ipAddress, serverPort);//ipAddress为服务器IP 6000为服务器端口
Debug.Log(string.Format("消息: {0}", endPoint));
try
{
//socket与本地终结点相关联绑定IP与端口
socketServer.Bind(endPoint);
//设置最大侦听长度,并启动侦听
socketServer.Listen(200);
}
catch
{
Debug.Log("请检查IP是否正确或端口是否被占用");
socketServer.Close();
return;
}
Debug.Log("启动侦听,等待客户端请求连接。。。");
//等待客户端连接,如果没有客户端连接,即会一址等待
//1、将硬件设备为TCP_Client
//2、将硬件的目的IP设置与 serverIP 一致的值
//3、将硬件的目的端口设备与 serverPort 一致的值
//如果硬件不能连接上,请检查以上参数
Socket socket = socketServer.Accept();
Debug.Log("连接成功");
string[] strs = socket.RemoteEndPoint.ToString().Split(':');
Debug.Log("客户端IP" + strs[0] + " 端口:" + strs[1]);
// 以下为数据发送与接收
Debug.Log("测试完成");
}
}
*/

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 44720823678ca7c42a08f4409ab025ff
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,347 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Newtonsoft.Json;
using System.Net.Sockets;
using UnityWebSocket;
using System.Text;
using Google.Protobuf;
using System.Net.WebSockets;
using System;
using System.Threading.Tasks;
public class test : MonoBehaviour
{
public string token;
public WEBScriptListener wEBScriptListener;
public class auth_login
{
public string clientId = "e5cd7e4891bf95d1d19206ce24a7b32e";
public string grantType = "password";
public string userType = "company_user";
public string username = "13699802230";
public string password = "YYL2230!";
}
public async void loging()
{
auth_login auth_Login = new auth_login();
string response = await web.SendRequest(web.URL + "/auth/login", "POST", JsonUtility.ToJson(auth_Login));
// 解析服务器返回的数据
server serverData = JsonConvert.DeserializeObject<server>(response);
token = serverData.data.access_token;
//Debug.Log(setverData.msg);
}
//登录
void lodingWebSocket()
{
LoginRequest data = new LoginRequest();
data.UserId = "1846032755921199105";
data.Account = "13152628999";
WSMessage msg = new WSMessage();
msg.Module = "hall";
msg.ServiceName = "Login";
msg.Data = ByteString.CopyFrom(ProtoBufffer.Serialize(data));
byte[] sendData = ProtoBufffer.Serialize(msg);
WSMessage deinfo = ProtoBufffer.DeSerialize<WSMessage>(sendData);
LoginRequest login = ProtoBufffer.DeSerialize<LoginRequest>(deinfo.Data.ToByteArray());
Debug.Log("登录");
wEBScriptListener.SendMessageByte(sendData);
}
//加入房间
void JoinRoom()
{
JoinRoomRequest data = new JoinRoomRequest();
data.RoomId = "168888";
WSMessage msg = new WSMessage();
msg.Module = "hall";
msg.ServiceName = "JoinRoom";
msg.Data = ByteString.CopyFrom(ProtoBufffer.Serialize(data));
byte[] sendData = ProtoBufffer.Serialize(msg);
WSMessage deinfo = ProtoBufffer.DeSerialize<WSMessage>(sendData);
JoinRoomRequest login = ProtoBufffer.DeSerialize<JoinRoomRequest>(deinfo.Data.ToByteArray());
Debug.Log("加入房间");
//BroadcastFrameMsg.FramesFieldNumber
wEBScriptListener.SendMessageByte(sendData);
}
//void BroadcastMessage()
//{
// WSMessage msg = new WSMessage();
// msg.Module = "hall";
// msg.ServiceName = "BroadcastMessage";
// //msg.Data = ByteString.CopyFrom(ProtoBufffer.Serialize(data));
// byte[] sendData = ProtoBufffer.Serialize(msg);
// WSMessage deinfo = ProtoBufffer.DeSerialize<WSMessage>(sendData);
// JoinRoomRequest login = ProtoBufffer.DeSerialize<JoinRoomRequest>(deinfo.Data.ToByteArray());
// Debug.Log("加入房间");
// //BroadcastFrameMsg.FramesFieldNumber
// wEBScriptListener.SendMessageByte(sendData);
//}
//心跳
async void Heartbeat()
{
//WSMessage msg = new WSMessage();
//msg.Data = ByteString.CopyFrom(new byte[] { 1 });
//byte[] sendData = ProtoBufffer.Serialize(msg);
//Debug.Log("");
while (true)
{
WSMessage msg = new WSMessage();
msg.Module = "ping";
//msg.Data = ByteString.CopyFrom(new byte[] { 1 });
byte[] sendData = ProtoBufffer.Serialize(msg);
// 每秒执行的任务
Debug.Log("每秒执行一次");
wEBScriptListener.SendMessageByte(sendData);
// 等待一秒
await Task.Delay(1000);
}
}
//帧存储操作输入
//void UpFps()
//{
// InputData data = new InputData();
// data.RoomId = "168888";
// data.Id = "778899";
// data.SId = "7";
// data.X = 7f;
// data.Y = 5f;
// data.Z = 4f;
// data.RoomSeatId = 5;
// WSMessage msg = new WSMessage();
// msg.Module = "fps";
// msg.ServiceName = "UpFps";
// msg.Data = ByteString.CopyFrom(ProtoBufffer.Serialize(data));
// byte[] sendData = ProtoBufffer.Serialize(msg);
// WSMessage deinfo = ProtoBufffer.DeSerialize<WSMessage>(sendData);
// InputData login = ProtoBufffer.DeSerialize<InputData>(deinfo.Data.ToByteArray());
// Debug.Log("帧存储操作输入");
// //BroadcastFrameMsg.FramesFieldNumber
// wEBScriptListener.SendMessageByte(sendData);
//}
//拾取道具
void PickUpProp()
{
PropRequest data = new PropRequest();
data.PropId = 1001;
data.RoomId = "168888";
WSMessage msg = new WSMessage();
msg.Module = "prop";
msg.ServiceName = "PickUpProp";
msg.Data = ByteString.CopyFrom(ProtoBufffer.Serialize(data));
byte[] sendData = ProtoBufffer.Serialize(msg);
WSMessage deinfo = ProtoBufffer.DeSerialize<WSMessage>(sendData);
PropRequest login = ProtoBufffer.DeSerialize<PropRequest>(deinfo.Data.ToByteArray());
Debug.Log("拾取道具");
//BroadcastFrameMsg.FramesFieldNumber
wEBScriptListener.SendMessageByte(sendData);
}
//使用道具
void StartUseProp()
{
PropRequest data = new PropRequest();
data.RoomId = "168888";
data.PropId = 1001;
data.Action = 1;
data.PropServerId = "MTg1OTc5MDMwOTIyODc4OTc2MA==";
WSMessage msg = new WSMessage();
msg.Module = "prop";
msg.ServiceName = "StartUseProp";
msg.Data = ByteString.CopyFrom(ProtoBufffer.Serialize(data));
byte[] sendData = ProtoBufffer.Serialize(msg);
WSMessage deinfo = ProtoBufffer.DeSerialize<WSMessage>(sendData);
PropRequest login = ProtoBufffer.DeSerialize<PropRequest>(deinfo.Data.ToByteArray());
Debug.Log("使用道具");
//BroadcastFrameMsg.FramesFieldNumber
wEBScriptListener.SendMessageByte(sendData);
}
//停止使用道具
void StopUseProp()
{
PropRequest data = new PropRequest();
data.RoomId = "168888";
data.PropId = 1001;
data.PropServerId = "MTg1OTc5MDMwOTIyODc4OTc2MA==";
WSMessage msg = new WSMessage();
msg.Module = "prop";
msg.ServiceName = "StopUseProp";
msg.Data = ByteString.CopyFrom(ProtoBufffer.Serialize(data));
byte[] sendData = ProtoBufffer.Serialize(msg);
WSMessage deinfo = ProtoBufffer.DeSerialize<WSMessage>(sendData);
PropRequest login = ProtoBufffer.DeSerialize<PropRequest>(deinfo.Data.ToByteArray());
Debug.Log("停止使用道具");
//BroadcastFrameMsg.FramesFieldNumber
wEBScriptListener.SendMessageByte(sendData);
}
//创建NPC ========================暂时不需要
//void CreateNpc()
//{
// PropRequest data = new PropRequest();
// data.RoomId = "168888";
// WSMessage msg = new WSMessage();
// msg.Module = "move";
// msg.ServiceName = "CreateNpc";
// msg.Data = ByteString.CopyFrom(ProtoBufffer.Serialize(data));
// byte[] sendData = ProtoBufffer.Serialize(msg);
// WSMessage deinfo = ProtoBufffer.DeSerialize<WSMessage>(sendData);
// PropRequest login = ProtoBufffer.DeSerialize<PropRequest>(deinfo.Data.ToByteArray());
// Debug.Log("创建NPC");
// //BroadcastFrameMsg.FramesFieldNumber
// wEBScriptListener.SendMessageByte(sendData);
//}
//推送npc和玩家的信息 ===============只需要收消息
//void Location()
//{
// PropRequest data = new PropRequest();
// data.RoomId = "168888";
// WSMessage msg = new WSMessage();
// msg.Module = "prop";
// msg.ServiceName = "CreateNpc";
// msg.Data = ByteString.CopyFrom(ProtoBufffer.Serialize(data));
// byte[] sendData = ProtoBufffer.Serialize(msg);
// WSMessage deinfo = ProtoBufffer.DeSerialize<WSMessage>(sendData);
// PropRequest login = ProtoBufffer.DeSerialize<PropRequest>(deinfo.Data.ToByteArray());
// Debug.Log("推送npc和玩家的信息");
// //BroadcastFrameMsg.FramesFieldNumber
// wEBScriptListener.SendMessageByte(sendData);
//}
//开始计时
void RoomStartTime()
{
JoinRoomRequest data = new JoinRoomRequest();
data.RoomId = "168888";
WSMessage msg = new WSMessage();
msg.Module = "hall";
msg.ServiceName = "RoomStartTime";
msg.Data = ByteString.CopyFrom(ProtoBufffer.Serialize(data));
byte[] sendData = ProtoBufffer.Serialize(msg);
WSMessage deinfo = ProtoBufffer.DeSerialize<WSMessage>(sendData);
JoinRoomRequest login = ProtoBufffer.DeSerialize<JoinRoomRequest>(deinfo.Data.ToByteArray());
Debug.Log("推送npc和玩家的信息");
//BroadcastFrameMsg.FramesFieldNumber
wEBScriptListener.SendMessageByte(sendData);
}
// Start is called before the first frame update
void Start()
{
//loging();
wEBScriptListener.ConcatWEBSocket();
wEBScriptListener.OnCallback += callback;
if (wEBScriptListener != null)
{
lodingWebSocket();
JoinRoom();
//Heartbeat();
//BroadcastMessage();
//UpFps();
PickUpProp();
StartUseProp();
StopUseProp();
//RoomStartTime();
}
}
void callback(byte[] data)
{
WSResponse deinfo = ProtoBufffer.DeSerialize<WSResponse>(data);
Debug.Log("返回数据类型:"+deinfo.MessageType);
byte[] bytes = deinfo.Data.ToByteArray();
switch (deinfo.MessageType)
{
//监听
//登录
case "hall.Login":
LoginResponse user = ProtoBufffer.DeSerialize<LoginResponse>(bytes);
Debug.Log(user.Message);
break;
//加入房间
case "hall.JoinRoom":
JoinRoomResponse joinRoomResponse = ProtoBufffer.DeSerialize<JoinRoomResponse>(bytes);
byte[] joinByte = joinRoomResponse.Data.ToByteArray();
PlayerJoinResponse playerJoinResponse = ProtoBufffer.DeSerialize<PlayerJoinResponse>(joinByte);
Debug.Log("玩家:"+playerJoinResponse.UserName+"加入房间:"+playerJoinResponse.RoomId.ToString());
break;
//广播
case "hall.BroadcastMessage":
UserJoinResponse userJoinResponse = ProtoBufffer.DeSerialize<UserJoinResponse>(bytes);
Debug.Log("玩家昵称:" + userJoinResponse.NickName + ",房间:" + userJoinResponse.RoomId.ToString() + ",用户角色"+ userJoinResponse.RoleName);
break;
//
case "fps.UpFps":
InputData inputData = ProtoBufffer.DeSerialize<InputData>(bytes);
Debug.Log("Id" + inputData.Id + ",sId :" + inputData.SId + "X:"+ inputData.X.ToString() + "Y:" + inputData.Y.ToString() + "roomSeatId :" + inputData.RoomSeatId + "z:" + inputData.Z.ToString() + "roomId:" + inputData.RoomId);
break;
case "prop.PickUpProp":
PropRequest propRequest = ProtoBufffer.DeSerialize<PropRequest>(bytes);
Debug.Log("PropId:" + propRequest.PropId);
break;
case "prop.StartUseProp":
PropResponse useProp = ProtoBufffer.DeSerialize<PropResponse>(bytes);
Debug.Log("PropId:" + useProp);
break;
case "prop.StopUseProp":
PropResponse stopuseProp = ProtoBufffer.DeSerialize<PropResponse>(bytes);
Debug.Log("PropId:" + stopuseProp);
break;
//case "prop.CreateNpc":
// MoveResponse moveResponse = ProtoBufffer.DeSerialize<MoveResponse>(bytes);
// Debug.Log("UserId:" + moveResponse.UserId + "RoomId:" + moveResponse.RoomId + "x:" + moveResponse.MoveData);
// break;
//case "hall.RoomStartTime":
// JoinRoomRequest joinRoomRequest = ProtoBufffer.DeSerialize<JoinRoomRequest>(bytes);
// Debug.Log("PropId:" + joinRoomRequest.RoomId);
// break;
//case " hall.MessageToUser":
// //JoinRoomRequest joinRoomRequest = ProtoBufffer.DeSerialize<JoinRoomRequest>(bytes);
// //Debug.Log("PropId:" + joinRoomRequest.RoomId);
// break;
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: c68b1dcfbba61b44ca68572c16b16b95
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: