| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393 |
- 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<RoleName, Player> Roles = new Dictionary<RoleName, Player>();
- 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<Animator>().SetBool("Sitting", sitting);
- // if (isLocalPlayer)
- // {
- // if (sitting)
- // {
- // GetComponent<PlayerInput>().actions.Disable();
- // GetComponent<PlayerInput>().actions["Look"].Enable();
- // GetComponent<CharacterController>().enabled = false;
- // }
- // else
- // {
- // GetComponent<PlayerInput>().actions.Enable();
- // GetComponent<CharacterController>().enabled = true;
- // }
- // }
- //}
- //[ClientRpc]
- //public void SetPlayerName(string name, RoleName roleName, Guid roomId)
- //{
- // playerName = name;
- // this.roleName = roleName;
- // textMesh.text = $"{roleName}({name})";
- // GetComponent<NetworkMatch>().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<PlayerInput>().enabled = isLocalPlayer;
- //GetComponent<ThirdPersonController>().enabled = isLocalPlayer;
- //GetComponent<CharacterController>().enabled = isLocalPlayer;
- //textMesh.gameObject.SetActive(!isLocalPlayer);
- if (textMesh != null) textMesh?.gameObject.SetActive(true);
- if (isLocalPlayer)
- {
- GameObject.Find("PlayerFollowCamera").GetComponent<CinemachineVirtualCamera>().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<Animator>().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<Animator>();
- if (animator != null)
- {
- triggers = animator.GetBehaviours<ObservableStateMachineTrigger>();
- 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<Animator>();
- anim.Play(animStateName);
- if (isLoop)
- onCompleted?.Invoke();
- else
- OnNowAnimCopleted = onCompleted;
- OnNowAnimCopleted = onCompleted;
- if (isLoop)
- {
- ForbidMove();
- }
- }
- private bool moveEnable = true;
- private void ForbidMove()
- {
- GetComponent<PlayerInput>().actions.Disable();
- GetComponent<PlayerInput>().actions["Look"].Enable();
- GetComponent<CharacterController>().enabled = false;
- moveEnable = false;
- }
- private void AllowMove()
- {
- GetComponent<PlayerInput>().actions.Enable();
- GetComponent<CharacterController>().enabled = true;
- moveEnable = true;
- }
- private bool ctrlEnable = true;
- /// <summary>
- /// 控制使能
- /// </summary>
- public bool CtrlEnable
- {
- set
- {
- GetComponent<PlayerInput>().enabled = value;
- GetComponent<ThirdPersonController>().enabled = value;
- GetComponent<CharacterController>().enabled = moveEnable;
- if (!moveEnable) { ForbidMove(); }
- ctrlEnable = value;
- }
- get
- {
- return ctrlEnable;
- }
- }
- //#region 角色更换装备
- //[Serializable]
- //public struct BodyEquip
- //{
- // //public EquipType type;
- // public SkinnedMeshRenderer skinned;
- //}
- //public List<BodyEquip> 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<SkinnedMeshRenderer>());
- //}
- ///// <summary>
- ///// 换装
- ///// </summary>
- ///// <param name="origRenderer">人物原有模型</param>
- ///// <param name="changeRenderer">替换模型</param>
- //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<SkinnedMeshRenderer>();
- // //替换绑定的骨骼
- // newRenderer.rootBone = origRenderer.rootBone;
- // newRenderer.bones = origRenderer.bones;
- // //根据人物(oldRenderer)的骨骼,对服装(newRenderer)的骨骼进行重新排序,然后重设模型的骨骼索引
- // if (newRenderer == null) return;
- // //骨骼列表
- // List<Transform> tList = new List<Transform>(newRenderer.bones);
- // List<Transform> nList = new List<Transform>();
- // foreach (var sel in origRenderer.bones)
- // {
- // Transform T = tList.Find((x) => x.name == sel.name);
- // if (T != null) nList.Add(T);
- // }
- // Dictionary<int, int> remap = new Dictionary<int, int>();
- // 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>();
- // camera.enabled = true;
- // camera.cullingMask = 1 << LayerMask.NameToLayer("Role");
- // }
- // }
- //}
- //#endregion
- }
- }
|