SD-20250415ABSO\Administrator 321e38cb79 冠军框架迁移
2025-04-18 19:18:15 +08:00

282 lines
8.1 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using AOT;
using Newtonsoft.Json;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using TEngine;
using UnityEngine;
public class KuaiShouClient : MonoBehaviour
{
/// <summary>
/// <20>汾id
/// </summary>
int version = 1;
/// <summary>
/// IPC<50>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
public static bool IsConnect
{
get; private set;
}
// IPC·<43><C2B7>
string IPCPath;
// ˽<>˷<EFBFBD><CBB7><EFBFBD>Code
string PreviewRoomCode;
static IntPtr ipcHandle;
public delegate void _OnDataReceived(string content, uint len, IntPtr ptr);
public delegate void _OnConnected(IntPtr ptr);
public delegate void _OnDisconnect(IntPtr ptr);
public delegate void _OnLog(string content, uint len, IntPtr ptr);
static Queue<string> msgQueue = new Queue<string>();
void Start()
{
Debug.Log("?!!!!!!!!!KuaiShouClient");
string[] commandLineArgs = System.Environment.GetCommandLineArgs();
var CommandLineArgs = new Dictionary<string, string>();
for (int i = 0; i < commandLineArgs.Length; i++)
{
if (commandLineArgs[i] == "-c" || commandLineArgs[i] == "-pos" || commandLineArgs[i] == "-ipc")
{
CommandLineArgs[commandLineArgs[i]] = commandLineArgs[i + 1];
}
}
foreach (var item in CommandLineArgs)
{
Debug.Log(item);
}
if (CommandLineArgs.TryGetValue("-c", out string str))
{
PreviewRoomCode = str;
}
if (CommandLineArgs.TryGetValue("-ipc", out string str1))
{
IPCPath = str1;
}
IsConnect = false;
if (!string.IsNullOrEmpty(IPCPath))
{
ipcHandle = new IntPtr(GetHashCode());
IpcInterface.SetDataReceivedCallback(OnDataReceived, ipcHandle);
IpcInterface.SetConnectedCallback(OnConnected, ipcHandle);
IpcInterface.SetDisconnectCallback(OnDisconnect, ipcHandle);
IpcInterface.SetLogCallback(OnLog, ipcHandle);
int result = IpcInterface.InitIpc(IPCPath, (uint)IPCPath.Length, IpcInterface.IPC_CS_TYPE.CLIENT);
if (result == 0)
{
IsConnect = true;
//EventMgr.FireEvent(TEventType.IPCStateChange);
}
else
{
Debug.LogError("IPC result:" + result.ToString());
}
}
}
// Update is called once per frame
void Update()
{
// lock (msgQueue)
{
if (msgQueue.Count > 0)
{
while (msgQueue.Count > 0)
{
ParseMsg(msgQueue.Dequeue());
}
}
}
}
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><C2B7><EFBFBD>Ϣ
/// </summary>
/// <param name="content"></param>
void ParseMsg(string content)
{
Dictionary<string, object> msg = JsonConvert.DeserializeObject<Dictionary<string, object>>(content);
if (msg != null)
{
if (msg.TryGetValue("type", out var t))
{
Debug.Log("type:" + t);
}
Dictionary<string, object> data = null;
if (msg.TryGetValue("data", out var d))
{
data = JsonConvert.DeserializeObject<Dictionary<string, object>>(d.ToString());
}
switch (t)
{
case "SC_SET_CODE":
if (data != null && data.TryGetValue("code", out var code))
{
Debug.Log("SC_SET_CODE code:" + code.ToString());
string oldCode = PreviewRoomCode;
PreviewRoomCode = code.ToString();
GameEvent.Send("SetRoomId", PreviewRoomCode);
}
break;
case "SC_QUIT":
if (data != null && data.TryGetValue("message", out var message))
{
Debug.Log("SC_QUIT msg:" + message);
}
Application.Quit();
break;
default:
break;
}
}
}
public void SendMsg(string msgType, Dictionary<string, object> msgData)
{
if (ipcHandle != IntPtr.Zero)
{
Dictionary<string, object> data = new Dictionary<string, object>()
{
{ "type" ,msgType },
{ "data" , msgData },
{ "version" , version }
};
string msg = JsonUtility.ToJson(data);
int result = IpcInterface.SendData(msg, (uint)msg.Length);
if (result == -1)
{
Debug.LogError("IPC<50><43>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD>");
}
}
else
{
Debug.LogError("IPC <20><>ʼ<EFBFBD><CABC>ʧ<EFBFBD><CAA7>");
}
}
/// <summary>
/// <20>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="content"></param>
/// <param name="len"></param>
/// <param name="intPtr"></param>
[MonoPInvokeCallback(typeof(_OnDataReceived))]
static void OnDataReceived(IntPtr contentPtr, uint len, IntPtr ptr)
{
string content = Marshal.PtrToStringUTF8(contentPtr, (int)len);
if (string.IsNullOrEmpty(content))
{
Debug.Log("ipc call func : OnDataReceived ptr:" + ptr.ToString() + " curPtr:" + ipcHandle.ToString() + " len" + len.ToString() + " content: is null or empty");
return;
}
Debug.Log("ipc call func : OnDataReceived ptr:" + ptr.ToString() + " curPtr:" + ipcHandle.ToString() + " len" + len.ToString() + " content:" + content);
if (ptr == ipcHandle)
{
// lock (msgQueue)
// {
msgQueue.Enqueue(content);
// }
}
else
{
Debug.LogError("ipc call func : OnDataReceived ptr:" + ptr.ToString() + " curPtr:" + ipcHandle.ToString() + " len" + len.ToString() + " content:" + content + " 不匹配");
}
}
/// <summary>
/// <20><><EFBFBD><EFBFBD>
/// </summary>
/// <param name="ptr"></param>
[MonoPInvokeCallback(typeof(_OnConnected))]
static void OnConnected(IntPtr ptr)
{
Debug.Log("ipc call func : OnConnected ptr:" + ptr.ToString() + " curPtr:" + ipcHandle.ToString());
if (ptr == ipcHandle)
{
Debug.Log("ipc conneted");
IsConnect = true;
//EventMgr.FireEvent(TEventType.IPCStateChange);
}
}
/// <summary>
/// <20>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="ptr"></param>
[MonoPInvokeCallback(typeof(_OnDisconnect))]
static void OnDisconnect(IntPtr ptr)
{
// Debug.Log("ipc call func : OnDisconnect ptr:" + ptr.ToString() + " curPtr:" + ipcHandle.ToString());
if (ptr == ipcHandle)
{
IsConnect = false;
//EventMgr.FireEvent(TEventType.IPCStateChange);
Debug.Log(message: "ipc disconneted");
//<2F>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>Ӻ<EFBFBD><D3BA>Զ<EFBFBD><D4B6>ر<EFBFBD><D8B1><EFBFBD>Ϸ
Application.Quit();
}
}
/// <summary>
/// <20>յ<EFBFBD><D5B5><EFBFBD>־
/// </summary>
/// <param name="content"></param>
/// <param name="len"></param>
/// <param name="ptr"></param>
[MonoPInvokeCallback(typeof(_OnLog))]
static void OnLog(IntPtr contentPtr, uint len, IntPtr ptr)
{
string content = Marshal.PtrToStringUTF8(contentPtr, (int)len);
// Debug.Log("ipc call func : OnLog ptr:" + ptr.ToString() + " curPtr:" + ipcHandle.ToString() + " len" + len.ToString() + " content:" + content);
//if (ptr == ipcHandle)
//{
// Debug.Log("ipc log:" + content);
//}
}
/// <summary>
/// <20>ͷ<EFBFBD>ipc<70><63>Ϣ
/// </summary>
public void ReleaseIPC()
{
if (ipcHandle != IntPtr.Zero)
{
ipcHandle = IntPtr.Zero;
IpcInterface.ReleaseIpc();
}
}
private void OnDestroy()
{
ReleaseIPC();
}
}