ConnectionMethod.cs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. using System;
  2. using System.Threading.Tasks;
  3. using Unity.Netcode.Transports.UTP;
  4. using UnityEngine;
  5. //客户端数据(发给服务端)
  6. [Serializable]
  7. public class ConnectionPayload
  8. {
  9. public string ip;
  10. public string playerId;
  11. public string playerName;
  12. //客户端是否Debug版本
  13. public bool isDebug;
  14. //是否走视频流
  15. public bool isVideo;
  16. //是否需要生成锚点
  17. public bool needAnchor;
  18. }
  19. //在OfflineState中创建
  20. public class ConnectionMethodIP
  21. {
  22. protected ConnectionManager m_ConnectionManager;
  23. //提供缓存信息(客户端本地缓存,音量等参数)
  24. readonly ProfileManager m_ProfileManager;
  25. //玩家数据
  26. public ConnectionPayload connectionData;
  27. //IP端口
  28. private string m_Ipaddress;
  29. private ushort m_Port;
  30. public ConnectionMethodIP(ConnectionManager connectionManager,ProfileManager profileManager)
  31. {
  32. m_ConnectionManager = connectionManager;
  33. m_ProfileManager = profileManager;
  34. connectionData = new ConnectionPayload()
  35. {
  36. playerId = GetPlayerId(true),
  37. playerName = "Null",
  38. isDebug = Debug.isDebugBuild,
  39. isVideo = false,
  40. needAnchor = false,
  41. };
  42. }
  43. public void SetConnectionData(string clientIP, string clientName, bool isVideo, bool needAnchor)
  44. {
  45. connectionData.ip = clientIP;
  46. connectionData.playerName = clientName;
  47. connectionData.isVideo = isVideo;
  48. connectionData.needAnchor = needAnchor;
  49. }
  50. public void SetIPData(string ip, ushort port)
  51. {
  52. m_Ipaddress = ip;
  53. m_Port = port;
  54. }
  55. //设置客户端登录账号信息ConnectionPayload
  56. protected void SetConnectionPayload()
  57. {
  58. //转成Json
  59. var payload = JsonUtility.ToJson(connectionData);
  60. //转成字节流(UTF8)
  61. var payloadBytes = System.Text.Encoding.UTF8.GetBytes(payload);
  62. //交给NetworkManager.NetworkConfig.ConnectionData
  63. m_ConnectionManager.NetworkManager.NetworkConfig.ConnectionData = payloadBytes;
  64. }
  65. //每个客户端必须独一无二,由客户端本地生成
  66. protected string GetPlayerId(bool isNew)
  67. {
  68. //默认以设备名称作为用户名
  69. return ClientPrefs.GetGuid(isNew);
  70. }
  71. //设置客户端账号。设置服务端的IP、Port
  72. public async Task SetupClientConnectionAsync()
  73. {
  74. //客户端账号
  75. SetConnectionPayload();
  76. //服务端IP、端口
  77. UnityTransport utp = (UnityTransport)m_ConnectionManager.NetworkManager.NetworkConfig.NetworkTransport;
  78. utp.SetConnectionData(m_Ipaddress, m_Port);
  79. }
  80. //设置Host的IP、Port
  81. public async Task SetupHostConnectionAsync()
  82. {
  83. //Host模式也是客户端,也需要设置客户端账号
  84. SetConnectionPayload();
  85. //设置服务端监听IP、端口
  86. UnityTransport utp = (UnityTransport)m_ConnectionManager.NetworkManager.NetworkConfig.NetworkTransport;
  87. utp.SetConnectionData(m_Ipaddress, m_Port);
  88. }
  89. }