using Cinemachine; using GameFramework.Event; using GameFramework.Resource; using GFMain; using Mirror; using StarterAssets; using System; using System.Collections.Generic; using UniRx.Triggers; using UniRx; using UnityCommon; using UnityEngine; using UnityEngine.InputSystem; namespace DTYJ { public class Player : NetworkBehaviour { public static Player localPlayer; public static readonly Dictionary Roles = new Dictionary(); public static Player GetPlayer(RoleName roleName) { if (Roles.ContainsKey(roleName)) return Roles[roleName]; return null; } //public static RoleName myRoleName; public TextMesh textMesh; [SyncVar] public Guid userId; [SyncVar] public string playerName; [SyncVar(hook = nameof(OnChangeRoleName))] public RoleName roleName; private void OnChangeRoleName(RoleName _, RoleName newValue) { Roles[newValue] = this; } public string PrettyName { //get { return $"{roleName}({playerName})"; } get { return roleName.ToString(); } } private void Awake() { //MainEntry.Event.Subscribe(SetRolePositionEventArgs.EventID, OnSetRolePosition); //MainEntry.Event.Subscribe(SetRoleAnimEventArgs.EventID, OnSetRoleAnim); InitAnimator(); } //private void OnSetRoleAnim(object sender, GameEventArgs e) //{ // SetRoleAnimEventArgs args = (SetRoleAnimEventArgs)e; // if (args.roleName == roleName) // { // SetAnim(args.animStateName, args.isHode, args.onCompleted); // } //} private void OnDestroy() { //MainEntry.Event.Unsubscribe(SetRolePositionEventArgs.EventID, OnSetRolePosition); //MainEntry.Event.Unsubscribe(SetRoleAnimEventArgs.EventID, OnSetRoleAnim); if (isLocalPlayer) localPlayer = null; } //private void OnSetRolePosition(object sender, GameEventArgs e) //{ // SetRolePositionEventArgs args = (SetRolePositionEventArgs)e; // if (args.roleName == roleName) // { // //SetPositionAndRotation(args.p, args.r, args.sitting); // SetPosition(args.p, args.r); // } //} //public void SetPositionAndRotation(Vector3 p, Quaternion r, bool sitting = false) //{ // SetPosition(p, r); // GetComponent().SetBool("Sitting", sitting); // if (isLocalPlayer) // { // if (sitting) // { // GetComponent().actions.Disable(); // GetComponent().actions["Look"].Enable(); // GetComponent().enabled = false; // } // else // { // GetComponent().actions.Enable(); // GetComponent().enabled = true; // } // } //} //[ClientRpc] //public void SetPlayerName(string name, RoleName roleName, Guid roomId) //{ // playerName = name; // this.roleName = roleName; // textMesh.text = $"{roleName}({name})"; // GetComponent().matchId = roomId; //} //[ClientRpc] public void UpdateShowName() { if (textMesh == null) return; textMesh.text = PrettyName; //if (isLocalPlayer) myRoleName = roleName;//TODO 这种方式不太好 } public override void OnStartClient() { base.OnStartClient(); CtrlEnable = isLocalPlayer; //GetComponent().enabled = isLocalPlayer; //GetComponent().enabled = isLocalPlayer; //GetComponent().enabled = isLocalPlayer; //textMesh.gameObject.SetActive(!isLocalPlayer); if (textMesh != null) textMesh?.gameObject.SetActive(true); if (isLocalPlayer) { GameObject.Find("PlayerFollowCamera").GetComponent().Follow = transform.Find("PlayerCameraRoot"); //MainEntry.Event.Subscribe(ReplaceEquipEvent.EventId, ChangeEquipment); //SetRoleLayer(); MainEntry.CameraCtrl.ToCinemachine(); localPlayer = this; } UpdateShowName(); } private readonly string[] gestureAnim = new string[] { "向右引导逃生", "向左引导逃生", "广播:前往1出口", "广播:前往2出口" }; [Client] private void Update() { if (isLocalPlayer) { if (Input.GetKeyDown(KeyCode.T)) { Main.Instance.uiMainMenu.ShowFloatMenu("乘客引导", gestureAnim, (strAnim) => { GetComponent().Play(strAnim); if (strAnim.Contains("广播")) { ControllerPanel.instance?.CmdPlayGuangBo(strAnim.Contains("1") ? 1 : 2); } else { //根据角色位置和手势方向 设置乘客出站 var v = (Vector3.Dot(transform.forward, Vector3.right)); bool dir = v > 0; dir = strAnim.Contains("右") ? dir : !dir; ControllerPanel.instance?.CmdSetCKChuZhan(dir ? 1 : 2); } }); } //if (Input.GetKeyDown(KeyCode.F)) //{ // CtrlEnable = false; // MainEntry.CameraCtrl.ToFly(transform.position + Vector3.up, transform.rotation); //} if (Input.GetKeyDown(KeyCode.V)) { if (MainEntry.CameraCtrl.cameraStateCurrent is CinemachineState) { CtrlEnable = false; MainEntry.CameraCtrl.ToFly(transform.position + (Vector3.up * 2.5f), transform.rotation); } else { CtrlEnable = true; MainEntry.CameraCtrl.ToCinemachine(); } } } } public void SetPosition(Transform tf) { SetPosition(tf.position, tf.rotation); } public void SetPosition(Vector3 p, Quaternion r) { var oldCtrlEnable = CtrlEnable; CtrlEnable = false; transform.position = p; transform.rotation = r; if (isLocalPlayer) CtrlEnable = oldCtrlEnable; } ObservableStateMachineTrigger[] triggers; void InitAnimator() { Animator animator = GetComponent(); if (animator != null) { triggers = animator.GetBehaviours(); foreach (ObservableStateMachineTrigger trigger in triggers) { trigger.OnStateExitAsObservable() .Where(_ => _.StateInfo.shortNameHash == nowAnim) .Subscribe(x => { Debug.Log("动画播放结束:" + nowAnim); OnNowAnimCopleted?.Invoke(); }).AddTo(gameObject); } } } private int nowAnim; Action OnNowAnimCopleted; public void SetAnim(string animStateName, bool isLoop, Action onCompleted) { nowAnim = Animator.StringToHash(animStateName); Animator anim = GetComponent(); anim.Play(animStateName); if (isLoop) onCompleted?.Invoke(); else OnNowAnimCopleted = onCompleted; OnNowAnimCopleted = onCompleted; if (isLoop) { ForbidMove(); } } private bool moveEnable = true; private void ForbidMove() { GetComponent().actions.Disable(); GetComponent().actions["Look"].Enable(); GetComponent().enabled = false; moveEnable = false; } private void AllowMove() { GetComponent().actions.Enable(); GetComponent().enabled = true; moveEnable = true; } private bool ctrlEnable = true; /// /// 控制使能 /// public bool CtrlEnable { set { GetComponent().enabled = value; GetComponent().enabled = value; GetComponent().enabled = moveEnable; if (!moveEnable) { ForbidMove(); } ctrlEnable = value; } get { return ctrlEnable; } } //#region 角色更换装备 //[Serializable] //public struct BodyEquip //{ // //public EquipType type; // public SkinnedMeshRenderer skinned; //} //public List equipList; //void ChangeEquipment(object sender, EventArgs e) //{ // ReplaceEquipEvent replaceEquipEvent = (ReplaceEquipEvent)e; // foreach (var equip in equipList) // { // if (equip.type == replaceEquipEvent.EquipType) // { // if (replaceEquipEvent.EquipPath != string.Empty) // MainEntry.Resource.LoadAsset(replaceEquipEvent.EquipPath, new GameFramework.Resource.LoadAssetCallbacks(LoadSuccess, LoadFail), equip.skinned); // else // ChangeClothing(equip.skinned, null); // } // } //} //private void LoadFail(string assetName, LoadResourceStatus status, string errorMessage, object userData) //{ // ChangeClothing(userData as SkinnedMeshRenderer, null); //} //private void LoadSuccess(string assetName, object asset, float duration, object userData) //{ // // (userData as SkinnedMeshRenderer).sharedMesh = (asset as Mesh); // ChangeClothing(userData as SkinnedMeshRenderer, (asset as GameObject).GetComponent()); //} ///// ///// 换装 ///// ///// 人物原有模型 ///// 替换模型 //private void ChangeClothing(SkinnedMeshRenderer origRenderer, SkinnedMeshRenderer changeRenderer) //{ // if (changeRenderer == null) // { // origRenderer.gameObject.SetActive(true); // return; // } // var goNew = Instantiate(changeRenderer.gameObject, origRenderer.transform.parent); // var newRenderer = goNew.GetComponent(); // //替换绑定的骨骼 // newRenderer.rootBone = origRenderer.rootBone; // newRenderer.bones = origRenderer.bones; // //根据人物(oldRenderer)的骨骼,对服装(newRenderer)的骨骼进行重新排序,然后重设模型的骨骼索引 // if (newRenderer == null) return; // //骨骼列表 // List tList = new List(newRenderer.bones); // List nList = new List(); // foreach (var sel in origRenderer.bones) // { // Transform T = tList.Find((x) => x.name == sel.name); // if (T != null) nList.Add(T); // } // Dictionary remap = new Dictionary(); // for (int i = 0; i < newRenderer.bones.Length; i++) // { // remap[i] = nList.IndexOf(newRenderer.bones[i]); // } // //remap bone weight indexes // BoneWeight[] bw = newRenderer.sharedMesh.boneWeights; // for (int i = 0; i < bw.Length; i++) // { // bw[i].boneIndex0 = remap[bw[i].boneIndex0]; // bw[i].boneIndex1 = remap[bw[i].boneIndex1]; // bw[i].boneIndex2 = remap[bw[i].boneIndex2]; // bw[i].boneIndex3 = remap[bw[i].boneIndex3]; // } // //重新映射bindposes // Matrix4x4[] bp = new Matrix4x4[newRenderer.sharedMesh.bindposes.Length]; // for (int i = 0; i < bp.Length; i++) // { // bp[remap[i]] = newRenderer.sharedMesh.bindposes[i]; // } // //分配新的数据 // newRenderer.sharedMesh.boneWeights = bw; // newRenderer.sharedMesh.bindposes = bp; // //骨骼 // //rend.bones = source.bones; // origRenderer.gameObject.SetActive(false); //} //#endregion //#region 玩家图层设置 //void SetRoleLayer() //{ // for (int i = 0; i < transform.childCount; i++) // { // if (!transform.GetChild(i).name.Equals("Bip001")) // { // transform.GetChild(i).gameObject.layer = LayerMask.NameToLayer("Role"); // } // if (transform.GetChild(i).name.Equals("LookatPlayerModelView")) // { // Camera camera = transform.GetChild(i).GetComponent(); // camera.enabled = true; // camera.cullingMask = 1 << LayerMask.NameToLayer("Role"); // } // } //} //#endregion } }