SpaceCoordinateBehavior.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using Unity.Netcode;
  5. using UnityEngine;
  6. namespace Rokid.MRC
  7. {
  8. //空间坐标系数据
  9. public struct SpacePose : INetworkSerializable, IEquatable<SpacePose>
  10. {
  11. public ulong ClientId;
  12. public Vector3 Position;
  13. public Quaternion Rotaion;
  14. public ARCalibrationMode CalibrationMode;
  15. public SpacePose(ulong clientId, Vector3 pos, Quaternion rot, ARCalibrationMode calibrationMode)
  16. {
  17. ClientId = clientId;
  18. Position = pos;
  19. Rotaion = rot;
  20. CalibrationMode = calibrationMode;
  21. }
  22. public void NetworkSerialize<T>(BufferSerializer<T> serializer) where T : IReaderWriter
  23. {
  24. serializer.SerializeValue(ref ClientId);
  25. serializer.SerializeValue(ref Position);
  26. serializer.SerializeValue(ref Rotaion);
  27. serializer.SerializeValue(ref CalibrationMode);
  28. }
  29. public bool Equals(SpacePose other)
  30. {
  31. return ClientId == other.ClientId &&
  32. Position.Equals(other.Position) &&
  33. Rotaion.Equals(other.Rotaion) &&
  34. CalibrationMode == other.CalibrationMode;
  35. }
  36. }
  37. //空间坐标系同步
  38. public class SpaceCoordinateBehavior : NetworkBehaviorBase
  39. {
  40. //所有客户端的空间坐标系
  41. public NetworkList<SpacePose> ClientSpacePoseList;
  42. //所有服务端的空间坐标系
  43. public NetworkList<SpacePose> ServerSpacePoseList;
  44. private void Awake()
  45. {
  46. ClientSpacePoseList = new NetworkList<SpacePose>();
  47. ServerSpacePoseList = new NetworkList<SpacePose>();
  48. }
  49. ////服务端RPC调用其他客户端的方法
  50. //[ClientRpc]
  51. //public void InstantiateSyncObjectClientRpc()
  52. //{
  53. // //Host模式,服务端也会调用该方法,此时IsClient、IsServer、IsHost三个值都为true,只有IsConnectedClient是false
  54. // if(NetworkManager.Singleton.IsConnectedClient && NetworkMgr.Instance.syncLogoPrefab)
  55. // {
  56. // NetworkObject networkObject = Instantiate(NetworkMgr.Instance.syncLogoPrefab).GetComponent<NetworkObject>();
  57. // if(networkObject)
  58. // {
  59. // Debug.Log("Client InstantiateSyncObjectClientRpc");
  60. // }
  61. // }
  62. //}
  63. //客户端调用。客户端通知正在开启脸部追踪,服务端可以不做任何处理
  64. [ServerRpc(RequireOwnership = false)]
  65. public void ReqStartBuildServerRpc(ulong clientID, ARCalibrationMode calibrationMode)
  66. {
  67. ServerSpaceCoordController.Instance.ClientStartBuild(clientID, calibrationMode);
  68. }
  69. //客户端调用。客户端取消校准
  70. [ServerRpc(RequireOwnership = false)]
  71. public void ReqCancelBuildServerRpc(ulong clientID)
  72. {
  73. ServerSpaceCoordController.Instance.ClientCancelBuild();
  74. }
  75. //客户端调用。客户端通知构建完成,服务端更新数据,并返回客户端
  76. //原本ServerRpc只能Owner调用,但是加了RequireOwnership = false以后,每个客户端都可以调用
  77. [ServerRpc(RequireOwnership = false)]
  78. public void ChangeSpaceCoordServerRpc(ulong clientId, SpacePose spacePose)
  79. {
  80. ServerSpaceCoordController.Instance.ClientConfirmSpacePose(clientId, spacePose);
  81. }
  82. //更新所有客户端的坐标系
  83. public void UpdateClientSpacePose(ulong clientId, SpacePose spacePose)
  84. {
  85. //服务端更新该SpacePose
  86. for(int i = 0;i < ClientSpacePoseList.Count;i++)
  87. {
  88. if(ClientSpacePoseList[i].ClientId == spacePose.ClientId)
  89. {
  90. ClientSpacePoseList[i] = spacePose;
  91. return;
  92. }
  93. }
  94. //服务端添加该SpacePose
  95. ClientSpacePoseList.Add(spacePose);
  96. }
  97. //更新所有服务端坐标系
  98. public void UpdateServerSpacePose(ulong clientId, SpacePose spacePose)
  99. {
  100. for(int i = 0;i < ServerSpacePoseList.Count;i++)
  101. {
  102. if(ServerSpacePoseList[i].ClientId == spacePose.ClientId)
  103. {
  104. ServerSpacePoseList[i] = spacePose;
  105. return;
  106. }
  107. }
  108. ServerSpacePoseList.Add(spacePose);
  109. }
  110. public SpacePose GetServerSpacePose(ulong clientId)
  111. {
  112. for(int i = 0;i < ServerSpacePoseList.Count;i++)
  113. {
  114. if(ServerSpacePoseList[i].ClientId == clientId)
  115. {
  116. return ServerSpacePoseList[i];
  117. }
  118. }
  119. return default(SpacePose);
  120. }
  121. }
  122. }