PlazaRoomManager.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488
  1. using UnityEngine;
  2. using System.Collections.Generic;
  3. using Sfs2X.Core;
  4. using Sfs2X.Entities;
  5. using Sfs2X.Requests;
  6. using Sfs2X.Entities.Variables;
  7. public class PlazaRoomManager
  8. {
  9. public class PlazaRoomPlayer
  10. {
  11. public Player Player;
  12. public List<TweenRoot> TweenRoots;
  13. public PlazaRoomPlayer(Player player)
  14. {
  15. Player = player;
  16. TweenRoots = new List<TweenRoot>();
  17. }
  18. public void Save()
  19. {
  20. foreach (var tweenRoot in TweenRoots)
  21. {
  22. tweenRoot.Pause();
  23. }
  24. ManaReso.Save(Player);
  25. }
  26. public float Speed = 1;
  27. public void MoveTo(Vector3 destination)
  28. {
  29. if (destination.Equal(Player.transform.position))
  30. {
  31. return;
  32. }
  33. if (destination.x > Player.transform.position.x)
  34. {
  35. Player.Flip(PlayerDirection.Right);
  36. }
  37. else
  38. {
  39. Player.Flip(PlayerDirection.Left);
  40. }
  41. float duration = Mathf.Clamp(Vector3.Magnitude(destination - Player.transform.position) / 1.5f, 0.25f, 10f) / Speed;
  42. TweenRoot tweenRoot = Player.transform.CreateTweenVec3D(destination, duration, false, true, true, Curve.EaseOutQuad);
  43. tweenRoot.StartForward();
  44. tweenRoot.AddEventOnetime(EventType.ForwardFinish, StopMove);
  45. TweenRoots.Add(tweenRoot);
  46. Player.PlayAnim(Player.WalkAnimationName);
  47. }
  48. public void StopMove()
  49. {
  50. Player.PlayAnim(Player.IdleAnimationName);
  51. }
  52. }
  53. #region Variable
  54. public GardenSmartFox GardenSmartFox;
  55. public User SelfUser;
  56. public PlazaRoomPlayer SelfInstance;
  57. public Room CurrentPlazaRoom;
  58. public bool InPlazaRoom
  59. {
  60. get { return CurrentPlazaRoom != null; }
  61. }
  62. public bool IsBlackMaskFinish;
  63. public RequestStatus JoinRoomStatus;
  64. public Dictionary<User, PlazaRoomPlayer> UserInstanceDictionary = new Dictionary<User, PlazaRoomPlayer>();
  65. #endregion
  66. public void OnEnterPlazaButton()
  67. {
  68. IsBlackMaskFinish = false;
  69. ManaCenter.SceneSwitchLock = true;
  70. TweenRoot tweenRoot = ManaReso.Get("V_BlackMask").TweenBacCG();
  71. tweenRoot.AddEventOnetime(EventType.BackwardFinish,() =>{IsBlackMaskFinish = true;TryEnterPlazaRoom();});
  72. GardenSmartFox.ExecuteAfterCheckConection
  73. (
  74. () =>
  75. {
  76. GardenSmartFox.PlazaRoomManager.JoinRoomStatus = RequestStatus.Pending;
  77. GardenSmartFox.ExtensionManager.PlazaRoomExtension.JoinPlazaRoom();
  78. },
  79. (succeed, baseEvent) =>
  80. {
  81. if (!succeed)
  82. {
  83. JoinRoomStatus = RequestStatus.Failed;
  84. TryEnterPlazaRoom();
  85. }
  86. },
  87. (succeed, baseEvent) =>
  88. {
  89. if (!succeed)
  90. {
  91. JoinRoomStatus = RequestStatus.Failed;
  92. TryEnterPlazaRoom();
  93. }
  94. else
  95. {
  96. GardenSmartFox.PlazaRoomManager.SyncClose();
  97. }
  98. }
  99. );
  100. }
  101. public void TryEnterPlazaRoom()
  102. {
  103. if (!IsBlackMaskFinish)
  104. {
  105. return;
  106. }
  107. if (GardenSmartFox.PlazaRoomManager.JoinRoomStatus == RequestStatus.Failed)
  108. {
  109. Bubble.Show(null, Language.GetStr("UI", "加入房间失败"), null, null, () => { ManaReso.Get("V_BlackMask").TweenForCG();},null,false);
  110. }
  111. else if (GardenSmartFox.PlazaRoomManager.JoinRoomStatus == RequestStatus.Succeed)
  112. {
  113. EnterPlazaRoom();
  114. }
  115. }
  116. public void EnterPlazaRoom()
  117. {
  118. GardenSmartFox.PlazaRoomManager.PlazaRoomCamera = ManaReso.Get<Camera>("MainCamera");
  119. GardenSmartFox.PlazaRoomManager.CameraOriginPosition = PlazaRoomCamera.transform.position;
  120. GardenSmartFox.PlazaRoomManager.CameraLeftBorder = ManaReso.Get("PlazaRoomCameraLeftBorder").position.x;
  121. GardenSmartFox.PlazaRoomManager.CameraRightBorder = ManaReso.Get("PlazaRoomCameraRightBorder").position.x;
  122. ManaReso.Get("V_BlackMask").TweenForCG();
  123. ManaReso.SetActive("C_Main", false);
  124. ManaReso.SetActive("Garden", false);
  125. ManaReso.SetActive("PlazaRoom", true);
  126. }
  127. public void ExitPlazaRoom()
  128. {
  129. ManaCenter.SceneSwitchLock = false;
  130. TweenRoot tweenRoot = ManaReso.Get("V_BlackMask").TweenBacCG();
  131. tweenRoot.AddEventOnetime
  132. (
  133. EventType.BackwardFinish,
  134. () =>
  135. {
  136. PlazaRoomCamera.transform.position = CameraOriginPosition;
  137. ManaReso.SetActive("C_Main", true);
  138. ManaReso.SetActive("Garden", true);
  139. ManaReso.SetActive("PlazaRoom", false);
  140. ManaReso.Get("V_BlackMask").TweenForCG();
  141. foreach (var kv in UserInstanceDictionary)
  142. {
  143. kv.Value.Save();
  144. }
  145. UserInstanceDictionary = new Dictionary<User, PlazaRoomPlayer>();
  146. }
  147. );
  148. }
  149. public PlazaRoomManager(GardenSmartFox gardenSmartFox)
  150. {
  151. GardenSmartFox = gardenSmartFox;
  152. GardenSmartFox.ExtensionManager.PlazaRoomExtension.onExitPlazaRoom += OnExitPlazaRoom;
  153. GardenSmartFox.ExtensionManager.PlazaRoomExtension.onJoinPlazaRoom += OnJoinPlazaRoom;
  154. GardenSmartFox.ExtensionManager.PlazaRoomExtension.onUserExitCurrentPlazaRoom += OnUserExitCurrentPlazaRoom;
  155. GardenSmartFox.ExtensionManager.PlazaRoomExtension.onUserEnterCurrentPlazaRoom += OnUserEnterCurrentPlazaRoom;
  156. GardenSmartFox.Connector.onConnectionLost += OnConectionLost;
  157. }
  158. public void Sync()
  159. {
  160. SyncCloseThread();
  161. if (!InPlazaRoom)
  162. return;
  163. if (SelfInstance.Player.transform.hasChanged)
  164. SyncTransform();
  165. //if (CloseDirty)
  166. // SyncClose();
  167. if (SelfInstance.Player.DirectionDirty)
  168. SyncDirection();
  169. if (SelfInstance.Player.AnimationDirty)
  170. SyncAnimation();
  171. KeepAliveThread();
  172. CameraControllThread();
  173. }
  174. public void SyncDirection()
  175. {
  176. List<UserVariable> userVariables = new List<UserVariable>();
  177. userVariables.Add(new SFSUserVariable("direction", $"{SelfInstance.Player.PlayerDirection.ToString()}"));
  178. GardenSmartFox.SmartFox.Send(new SetUserVariablesRequest(userVariables));
  179. SelfInstance.Player.DirectionDirty = false;
  180. }
  181. public void SyncTransform()
  182. {
  183. List<UserVariable> userVariables = new List<UserVariable>();
  184. userVariables.Add(new SFSUserVariable("transform", $"{SelfInstance.Player.transform.position.x} {SelfInstance.Player.transform.position.y} {SelfInstance.Player.transform.position.z} {SelfInstance.Player.transform.eulerAngles.x} {SelfInstance.Player.transform.eulerAngles.y} {SelfInstance.Player.transform.eulerAngles.z}"));
  185. GardenSmartFox.SmartFox.Send(new SetUserVariablesRequest(userVariables));
  186. SelfInstance.Player.transform.hasChanged = false;
  187. }
  188. public void SyncAnimation()
  189. {
  190. List<UserVariable> userVariables = new List<UserVariable>();
  191. userVariables.Add(new SFSUserVariable("animation", $"{SelfInstance.Player.CurrentAnimationName}"));
  192. GardenSmartFox.SmartFox.Send(new SetUserVariablesRequest(userVariables));
  193. SelfInstance.Player.AnimationDirty = false;
  194. }
  195. public bool CloseDirty;
  196. public void SyncClose()
  197. {
  198. if (ManaPlayer.Player == null)
  199. return;
  200. List<UserVariable> userVariables = new List<UserVariable>();
  201. userVariables.Add(new SFSUserVariable("dressData", $"{ManaPlayer.Player.Head} {ManaPlayer.Player.Dress} {ManaPlayer.Player.Shoe} {ManaPlayer.Player.HeadWear} {ManaPlayer.Player.Top} {ManaPlayer.Player.Eye} {ManaPlayer.Player.Mouse} {ManaPlayer.Player.Wing} {ManaPlayer.Player.LeftLongSleeve} {ManaPlayer.Player.LeftShortSleeve} {ManaPlayer.Player.RightLongSleeve} {ManaPlayer.Player.RightShortSleeve}"));
  202. GardenSmartFox.SmartFox.Send(new SetUserVariablesRequest(userVariables));
  203. CloseDirty = false;
  204. }
  205. public float KeepAliveTime = 30;
  206. public float KeepAliveTimer;
  207. public void KeepAliveThread()
  208. {
  209. KeepAliveTimer += Time.deltaTime;
  210. if (KeepAliveTimer > KeepAliveTime)
  211. {
  212. KeepAliveTimer = 0;
  213. GardenSmartFox.ExtensionManager.BaseSFSExtension.SendRequest(Request.KeepAlive.GetHashCode());
  214. }
  215. }
  216. public float SyncCloseTime = 10;
  217. public float SyncCloseTimer;
  218. public void SyncCloseThread()
  219. {
  220. SyncCloseTimer += Time.deltaTime;
  221. if (SyncCloseTimer > SyncCloseTime)
  222. {
  223. SyncCloseTimer = 0;
  224. GardenSmartFox.PlazaRoomManager.SyncClose();
  225. }
  226. }
  227. public float CameraLeftBorder;
  228. public float CameraRightBorder;
  229. public Vector3 CameraOriginPosition;
  230. public Camera PlazaRoomCamera;
  231. public void CameraControllThread()
  232. {
  233. if (PlazaRoomCamera == null)
  234. {
  235. return;
  236. }
  237. float x;
  238. if (SelfInstance.Player.transform.position.x <= CameraLeftBorder)
  239. {
  240. x = Mathf.Lerp(PlazaRoomCamera.transform.position.x, CameraLeftBorder, Time.deltaTime);
  241. }
  242. else if (SelfInstance.Player.transform.position.x >= CameraRightBorder)
  243. {
  244. x = Mathf.Lerp(PlazaRoomCamera.transform.position.x, CameraRightBorder, Time.deltaTime);
  245. }
  246. else
  247. {
  248. x = Mathf.Lerp(PlazaRoomCamera.transform.position.x, SelfInstance.Player.transform.position.x, Time.deltaTime);
  249. }
  250. PlazaRoomCamera.transform.SetX(x);
  251. }
  252. public void ChangeUserClose(User user, List<string> dressData)
  253. {
  254. ManaPlayer.BuildPlayer(dressData, UserInstanceDictionary[user].Player);
  255. }
  256. public void ChangeUserDirection(User user, PlayerDirection direction)
  257. {
  258. UserInstanceDictionary[user].Player.Flip(direction);
  259. }
  260. public void ChangeUserTransform(User user, Vector3 position, Vector3 eulerAngles)
  261. {
  262. Player player = UserInstanceDictionary[user].Player;
  263. TweenRoot tweenPosition = player.CreateTweenVec3D(position, 0.1f, false, true, true, Curve.Linear);
  264. TweenRoot tweenEuler = player.CreateTweenEuler(eulerAngles, 0.1f, false, true, true, Curve.Linear);
  265. tweenPosition.StartForward();
  266. tweenEuler.StartForward();
  267. UserInstanceDictionary[user].TweenRoots.Add(tweenPosition);
  268. UserInstanceDictionary[user].TweenRoots.Add(tweenEuler);
  269. //UserInstanceDictionary[user].transform.position = position;
  270. //UserInstanceDictionary[user].transform.eulerAngles = eulerAngles;
  271. }
  272. public void ChangeUserAnimation(User user, string animationName)
  273. {
  274. UserInstanceDictionary[user].Player.PlayAnim(animationName);
  275. }
  276. public void OnConectionLost(BaseEvent baseEvent)
  277. {
  278. OnExitPlazaRoom();
  279. }
  280. public void OnExitPlazaRoom()
  281. {
  282. CurrentPlazaRoom = null;
  283. ExitPlazaRoom();
  284. }
  285. public void OnJoinPlazaRoom(Room room)
  286. {
  287. CurrentPlazaRoom = room;
  288. SelfUser = GardenSmartFox.User;
  289. Player selfPlayer = InstanciatePlayer(SelfUser);
  290. SelfInstance = new PlazaRoomPlayer(selfPlayer);
  291. UserInstanceDictionary.Add(SelfUser, SelfInstance);
  292. for (int i = 0; i < CurrentPlazaRoom.UserList.Count; i++)
  293. {
  294. if (CurrentPlazaRoom.UserList[i] == SelfUser)
  295. {
  296. continue;
  297. }
  298. UserInstanceDictionary.Add(CurrentPlazaRoom.UserList[i], new PlazaRoomPlayer(InstanciatePlayer(CurrentPlazaRoom.UserList[i])));
  299. }
  300. JoinRoomStatus = RequestStatus.Succeed;
  301. TryEnterPlazaRoom();
  302. }
  303. public void OnUserExitCurrentPlazaRoom(User user)
  304. {
  305. UserInstanceDictionary[user].Save();
  306. UserInstanceDictionary.Remove(user);
  307. }
  308. public void OnUserEnterCurrentPlazaRoom(User user)
  309. {
  310. UserInstanceDictionary.Add(user, new PlazaRoomPlayer(InstanciatePlayer(user)));
  311. }
  312. public void OnUserVariablesUpdate(User user, List<string> changeVars)
  313. {
  314. if (!user.IsItMe)
  315. {
  316. for (int i = 0; i < changeVars.Count; i++)
  317. {
  318. if (changeVars[i] == "transform")
  319. {
  320. Vector3[] vectors = (user.GetVariable(changeVars[i]).Value as string).StringToTransform();
  321. Vector3 position = vectors[0];
  322. Vector3 eulerAngles = vectors[1];
  323. ChangeUserTransform(user, position, eulerAngles);
  324. }
  325. else if (changeVars[i] == "dressData")
  326. {
  327. List<string> dressData = ManaData.GetDressData(user);
  328. ChangeUserClose(user, dressData);
  329. }
  330. else if (changeVars[i] == "direction")
  331. {
  332. PlayerDirection playerDirection = (user.GetVariable(changeVars[i]).Value as string).ToEnum<PlayerDirection>();
  333. ChangeUserDirection(user, playerDirection);
  334. }
  335. else if (changeVars[i] == "animation")
  336. {
  337. ChangeUserAnimation(user, user.GetVariable(changeVars[i]).Value as string);
  338. }
  339. }
  340. }
  341. }
  342. public Player InstanciatePlayer(User user)
  343. {
  344. string animationName = Player.IdleAnimationName;
  345. Vector3 position = ManaReso.Get("PlazaRoomDefaultPosition").position;
  346. Vector3 eulerAngles = new Vector3();
  347. PlayerDirection playerDirection = PlayerDirection.Left;
  348. List<string> dressData = new List<string>();
  349. if (user.ContainsVariable("transform"))
  350. {
  351. Vector3[] vectors = (user.GetVariable("transform").Value as string).StringToTransform();
  352. position = vectors[0];
  353. eulerAngles = vectors[1];
  354. }
  355. if (user.ContainsVariable("direction"))
  356. {
  357. playerDirection = (user.GetVariable("direction").Value as string).ToEnum<PlayerDirection>();
  358. }
  359. if (user.ContainsVariable("animation"))
  360. {
  361. animationName = user.GetVariable("animation").Value as string;
  362. }
  363. dressData = ManaData.GetDressData(user);
  364. return InstanciatePlayer(position, eulerAngles, playerDirection, animationName, dressData);
  365. }
  366. public Player InstanciatePlayer(Vector3 position, Vector3 eulerAngles, PlayerDirection direction, string animationName, List<string> dressData)
  367. {
  368. Transform tra = ManaReso.Get("Player", Folder.Scene, false, ManaReso.Get("PlazaRoom"), false, ObjType.Player);
  369. Player player = tra.GetComponent<Player>();
  370. if (player == null)
  371. {
  372. player = tra.AddScript<Player>();
  373. player.Build();
  374. }
  375. ManaPlayer.BuildPlayer(dressData, player);
  376. player.SetAllCollider(false);
  377. player.Flip(direction);
  378. player.transform.position = position;
  379. player.PlayAnim(animationName);
  380. tra.localScale = new Vector3(0.5f, 0.5f, 0.5f);
  381. return player;
  382. }
  383. }