Player.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393
  1. using Cinemachine;
  2. using GameFramework.Event;
  3. using GameFramework.Resource;
  4. using GFMain;
  5. using Mirror;
  6. using StarterAssets;
  7. using System;
  8. using System.Collections.Generic;
  9. using UniRx.Triggers;
  10. using UniRx;
  11. using UnityCommon;
  12. using UnityEngine;
  13. using UnityEngine.InputSystem;
  14. namespace DTYJ
  15. {
  16. public class Player : NetworkBehaviour
  17. {
  18. public static Player localPlayer;
  19. public static readonly Dictionary<RoleName, Player> Roles = new Dictionary<RoleName, Player>();
  20. public static Player GetPlayer(RoleName roleName)
  21. {
  22. if (Roles.ContainsKey(roleName))
  23. return Roles[roleName];
  24. return null;
  25. }
  26. //public static RoleName myRoleName;
  27. public TextMesh textMesh;
  28. [SyncVar]
  29. public Guid userId;
  30. [SyncVar]
  31. public string playerName;
  32. [SyncVar(hook = nameof(OnChangeRoleName))]
  33. public RoleName roleName;
  34. private void OnChangeRoleName(RoleName _, RoleName newValue)
  35. {
  36. Roles[newValue] = this;
  37. }
  38. public string PrettyName
  39. {
  40. //get { return $"{roleName}({playerName})"; }
  41. get { return roleName.ToString(); }
  42. }
  43. private void Awake()
  44. {
  45. //MainEntry.Event.Subscribe(SetRolePositionEventArgs.EventID, OnSetRolePosition);
  46. //MainEntry.Event.Subscribe(SetRoleAnimEventArgs.EventID, OnSetRoleAnim);
  47. InitAnimator();
  48. }
  49. //private void OnSetRoleAnim(object sender, GameEventArgs e)
  50. //{
  51. // SetRoleAnimEventArgs args = (SetRoleAnimEventArgs)e;
  52. // if (args.roleName == roleName)
  53. // {
  54. // SetAnim(args.animStateName, args.isHode, args.onCompleted);
  55. // }
  56. //}
  57. private void OnDestroy()
  58. {
  59. //MainEntry.Event.Unsubscribe(SetRolePositionEventArgs.EventID, OnSetRolePosition);
  60. //MainEntry.Event.Unsubscribe(SetRoleAnimEventArgs.EventID, OnSetRoleAnim);
  61. if (isLocalPlayer)
  62. localPlayer = null;
  63. }
  64. //private void OnSetRolePosition(object sender, GameEventArgs e)
  65. //{
  66. // SetRolePositionEventArgs args = (SetRolePositionEventArgs)e;
  67. // if (args.roleName == roleName)
  68. // {
  69. // //SetPositionAndRotation(args.p, args.r, args.sitting);
  70. // SetPosition(args.p, args.r);
  71. // }
  72. //}
  73. //public void SetPositionAndRotation(Vector3 p, Quaternion r, bool sitting = false)
  74. //{
  75. // SetPosition(p, r);
  76. // GetComponent<Animator>().SetBool("Sitting", sitting);
  77. // if (isLocalPlayer)
  78. // {
  79. // if (sitting)
  80. // {
  81. // GetComponent<PlayerInput>().actions.Disable();
  82. // GetComponent<PlayerInput>().actions["Look"].Enable();
  83. // GetComponent<CharacterController>().enabled = false;
  84. // }
  85. // else
  86. // {
  87. // GetComponent<PlayerInput>().actions.Enable();
  88. // GetComponent<CharacterController>().enabled = true;
  89. // }
  90. // }
  91. //}
  92. //[ClientRpc]
  93. //public void SetPlayerName(string name, RoleName roleName, Guid roomId)
  94. //{
  95. // playerName = name;
  96. // this.roleName = roleName;
  97. // textMesh.text = $"{roleName}({name})";
  98. // GetComponent<NetworkMatch>().matchId = roomId;
  99. //}
  100. //[ClientRpc]
  101. public void UpdateShowName()
  102. {
  103. if (textMesh == null) return;
  104. textMesh.text = PrettyName;
  105. //if (isLocalPlayer) myRoleName = roleName;//TODO 这种方式不太好
  106. }
  107. public override void OnStartClient()
  108. {
  109. base.OnStartClient();
  110. CtrlEnable = isLocalPlayer;
  111. //GetComponent<PlayerInput>().enabled = isLocalPlayer;
  112. //GetComponent<ThirdPersonController>().enabled = isLocalPlayer;
  113. //GetComponent<CharacterController>().enabled = isLocalPlayer;
  114. //textMesh.gameObject.SetActive(!isLocalPlayer);
  115. if (textMesh != null) textMesh?.gameObject.SetActive(true);
  116. if (isLocalPlayer)
  117. {
  118. GameObject.Find("PlayerFollowCamera").GetComponent<CinemachineVirtualCamera>().Follow = transform.Find("PlayerCameraRoot");
  119. //MainEntry.Event.Subscribe(ReplaceEquipEvent.EventId, ChangeEquipment);
  120. //SetRoleLayer();
  121. MainEntry.CameraCtrl.ToCinemachine();
  122. localPlayer = this;
  123. }
  124. UpdateShowName();
  125. }
  126. private readonly string[] gestureAnim = new string[] { "向右引导逃生", "向左引导逃生", "广播:前往1出口", "广播:前往2出口" };
  127. [Client]
  128. private void Update()
  129. {
  130. if (isLocalPlayer)
  131. {
  132. if (Input.GetKeyDown(KeyCode.T))
  133. {
  134. Main.Instance.uiMainMenu.ShowFloatMenu("乘客引导", gestureAnim, (strAnim) =>
  135. {
  136. GetComponent<Animator>().Play(strAnim);
  137. if (strAnim.Contains("广播"))
  138. {
  139. ControllerPanel.instance?.CmdPlayGuangBo(strAnim.Contains("1") ? 1 : 2);
  140. }
  141. else
  142. {
  143. //根据角色位置和手势方向 设置乘客出站
  144. var v = (Vector3.Dot(transform.forward, Vector3.right));
  145. bool dir = v > 0;
  146. dir = strAnim.Contains("右") ? dir : !dir;
  147. ControllerPanel.instance?.CmdSetCKChuZhan(dir ? 1 : 2);
  148. }
  149. });
  150. }
  151. //if (Input.GetKeyDown(KeyCode.F))
  152. //{
  153. // CtrlEnable = false;
  154. // MainEntry.CameraCtrl.ToFly(transform.position + Vector3.up, transform.rotation);
  155. //}
  156. if (Input.GetKeyDown(KeyCode.V))
  157. {
  158. if (MainEntry.CameraCtrl.cameraStateCurrent is CinemachineState)
  159. {
  160. CtrlEnable = false;
  161. MainEntry.CameraCtrl.ToFly(transform.position + (Vector3.up * 2.5f), transform.rotation);
  162. }
  163. else
  164. {
  165. CtrlEnable = true;
  166. MainEntry.CameraCtrl.ToCinemachine();
  167. }
  168. }
  169. }
  170. }
  171. public void SetPosition(Transform tf)
  172. {
  173. SetPosition(tf.position, tf.rotation);
  174. }
  175. public void SetPosition(Vector3 p, Quaternion r)
  176. {
  177. var oldCtrlEnable = CtrlEnable;
  178. CtrlEnable = false;
  179. transform.position = p;
  180. transform.rotation = r;
  181. if (isLocalPlayer)
  182. CtrlEnable = oldCtrlEnable;
  183. }
  184. ObservableStateMachineTrigger[] triggers;
  185. void InitAnimator()
  186. {
  187. Animator animator = GetComponent<Animator>();
  188. if (animator != null)
  189. {
  190. triggers = animator.GetBehaviours<ObservableStateMachineTrigger>();
  191. foreach (ObservableStateMachineTrigger trigger in triggers)
  192. {
  193. trigger.OnStateExitAsObservable()
  194. .Where(_ => _.StateInfo.shortNameHash == nowAnim)
  195. .Subscribe(x =>
  196. {
  197. Debug.Log("动画播放结束:" + nowAnim);
  198. OnNowAnimCopleted?.Invoke();
  199. }).AddTo(gameObject);
  200. }
  201. }
  202. }
  203. private int nowAnim;
  204. Action OnNowAnimCopleted;
  205. public void SetAnim(string animStateName, bool isLoop, Action onCompleted)
  206. {
  207. nowAnim = Animator.StringToHash(animStateName);
  208. Animator anim = GetComponent<Animator>();
  209. anim.Play(animStateName);
  210. if (isLoop)
  211. onCompleted?.Invoke();
  212. else
  213. OnNowAnimCopleted = onCompleted;
  214. OnNowAnimCopleted = onCompleted;
  215. if (isLoop)
  216. {
  217. ForbidMove();
  218. }
  219. }
  220. private bool moveEnable = true;
  221. private void ForbidMove()
  222. {
  223. GetComponent<PlayerInput>().actions.Disable();
  224. GetComponent<PlayerInput>().actions["Look"].Enable();
  225. GetComponent<CharacterController>().enabled = false;
  226. moveEnable = false;
  227. }
  228. private void AllowMove()
  229. {
  230. GetComponent<PlayerInput>().actions.Enable();
  231. GetComponent<CharacterController>().enabled = true;
  232. moveEnable = true;
  233. }
  234. private bool ctrlEnable = true;
  235. /// <summary>
  236. /// 控制使能
  237. /// </summary>
  238. public bool CtrlEnable
  239. {
  240. set
  241. {
  242. GetComponent<PlayerInput>().enabled = value;
  243. GetComponent<ThirdPersonController>().enabled = value;
  244. GetComponent<CharacterController>().enabled = moveEnable;
  245. if (!moveEnable) { ForbidMove(); }
  246. ctrlEnable = value;
  247. }
  248. get
  249. {
  250. return ctrlEnable;
  251. }
  252. }
  253. //#region 角色更换装备
  254. //[Serializable]
  255. //public struct BodyEquip
  256. //{
  257. // //public EquipType type;
  258. // public SkinnedMeshRenderer skinned;
  259. //}
  260. //public List<BodyEquip> equipList;
  261. //void ChangeEquipment(object sender, EventArgs e)
  262. //{
  263. // ReplaceEquipEvent replaceEquipEvent = (ReplaceEquipEvent)e;
  264. // foreach (var equip in equipList)
  265. // {
  266. // if (equip.type == replaceEquipEvent.EquipType)
  267. // {
  268. // if (replaceEquipEvent.EquipPath != string.Empty)
  269. // MainEntry.Resource.LoadAsset(replaceEquipEvent.EquipPath, new GameFramework.Resource.LoadAssetCallbacks(LoadSuccess, LoadFail), equip.skinned);
  270. // else
  271. // ChangeClothing(equip.skinned, null);
  272. // }
  273. // }
  274. //}
  275. //private void LoadFail(string assetName, LoadResourceStatus status, string errorMessage, object userData)
  276. //{
  277. // ChangeClothing(userData as SkinnedMeshRenderer, null);
  278. //}
  279. //private void LoadSuccess(string assetName, object asset, float duration, object userData)
  280. //{
  281. // // (userData as SkinnedMeshRenderer).sharedMesh = (asset as Mesh);
  282. // ChangeClothing(userData as SkinnedMeshRenderer, (asset as GameObject).GetComponent<SkinnedMeshRenderer>());
  283. //}
  284. ///// <summary>
  285. ///// 换装
  286. ///// </summary>
  287. ///// <param name="origRenderer">人物原有模型</param>
  288. ///// <param name="changeRenderer">替换模型</param>
  289. //private void ChangeClothing(SkinnedMeshRenderer origRenderer, SkinnedMeshRenderer changeRenderer)
  290. //{
  291. // if (changeRenderer == null)
  292. // {
  293. // origRenderer.gameObject.SetActive(true);
  294. // return;
  295. // }
  296. // var goNew = Instantiate(changeRenderer.gameObject, origRenderer.transform.parent);
  297. // var newRenderer = goNew.GetComponent<SkinnedMeshRenderer>();
  298. // //替换绑定的骨骼
  299. // newRenderer.rootBone = origRenderer.rootBone;
  300. // newRenderer.bones = origRenderer.bones;
  301. // //根据人物(oldRenderer)的骨骼,对服装(newRenderer)的骨骼进行重新排序,然后重设模型的骨骼索引
  302. // if (newRenderer == null) return;
  303. // //骨骼列表
  304. // List<Transform> tList = new List<Transform>(newRenderer.bones);
  305. // List<Transform> nList = new List<Transform>();
  306. // foreach (var sel in origRenderer.bones)
  307. // {
  308. // Transform T = tList.Find((x) => x.name == sel.name);
  309. // if (T != null) nList.Add(T);
  310. // }
  311. // Dictionary<int, int> remap = new Dictionary<int, int>();
  312. // for (int i = 0; i < newRenderer.bones.Length; i++)
  313. // {
  314. // remap[i] = nList.IndexOf(newRenderer.bones[i]);
  315. // }
  316. // //remap bone weight indexes
  317. // BoneWeight[] bw = newRenderer.sharedMesh.boneWeights;
  318. // for (int i = 0; i < bw.Length; i++)
  319. // {
  320. // bw[i].boneIndex0 = remap[bw[i].boneIndex0];
  321. // bw[i].boneIndex1 = remap[bw[i].boneIndex1];
  322. // bw[i].boneIndex2 = remap[bw[i].boneIndex2];
  323. // bw[i].boneIndex3 = remap[bw[i].boneIndex3];
  324. // }
  325. // //重新映射bindposes
  326. // Matrix4x4[] bp = new Matrix4x4[newRenderer.sharedMesh.bindposes.Length];
  327. // for (int i = 0; i < bp.Length; i++)
  328. // {
  329. // bp[remap[i]] = newRenderer.sharedMesh.bindposes[i];
  330. // }
  331. // //分配新的数据
  332. // newRenderer.sharedMesh.boneWeights = bw;
  333. // newRenderer.sharedMesh.bindposes = bp;
  334. // //骨骼
  335. // //rend.bones = source.bones;
  336. // origRenderer.gameObject.SetActive(false);
  337. //}
  338. //#endregion
  339. //#region 玩家图层设置
  340. //void SetRoleLayer()
  341. //{
  342. // for (int i = 0; i < transform.childCount; i++)
  343. // {
  344. // if (!transform.GetChild(i).name.Equals("Bip001"))
  345. // {
  346. // transform.GetChild(i).gameObject.layer = LayerMask.NameToLayer("Role");
  347. // }
  348. // if (transform.GetChild(i).name.Equals("LookatPlayerModelView"))
  349. // {
  350. // Camera camera = transform.GetChild(i).GetComponent<Camera>();
  351. // camera.enabled = true;
  352. // camera.cullingMask = 1 << LayerMask.NameToLayer("Role");
  353. // }
  354. // }
  355. //}
  356. //#endregion
  357. }
  358. }