using SC.XR.Unity.Module_InputSystem; using ShadowStudio.Tool; using ShadowStudio.UI; using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using XRTool.Util; namespace ShadowStudio.Model { /// /// 用户角色同步 /// public class PlayerContainer : GoodsComponen { public static string userArtId = "ArtId_GamePlayer"; public static string containerName = "PlayerContainer"; private Peer user; private TextMesh nameLable; private PlayerAnimatorController playerAnimator; private Transform leftHandTarget; private Transform rightHandTarget; private Transform playerRoot; private bool leftActive = false; private bool rightActive = false; private Transform containerTransfer; public TextMesh NameLable { get { if (!nameLable) { nameLable = UnityUtil.GetBreadthChild(transform, "NameLable"); } return nameLable; } } public PlayerAnimatorController PlayerAnimator { get { if (!playerAnimator) { playerAnimator = GetComponentInChildren(); } return playerAnimator; } } public Transform PlayerRoot { get { if (!playerRoot) { playerRoot = UnityUtil.GetBreadthChild(transform, "PlayerRoot"); } return playerRoot; } } public Transform LeftHandTarget { get { if (!leftHandTarget) { leftHandTarget = UnityUtil.GetBreadthChild(transform, "LeftHandTarget"); } return leftHandTarget; } } public Transform RightHandTarget { get { if (!rightHandTarget) { rightHandTarget = UnityUtil.GetBreadthChild(transform, "RightHandTarget"); } return rightHandTarget; } } public override void SetContainer(ArtContainerHandler container, UnityEngine.Object art, ArtInfo info) { base.SetContainer(container, art, info); if (art is GameObject && PlayerRoot) { GameObject obj = art as GameObject; UnityUtil.SetParent(PlayerRoot, obj.transform); } containerTransfer = Container.transform; } private void Start() { StartCoroutine(SynUser()); } private IEnumerator SynUser() { while (user == null) { yield return new WaitForFixedUpdate(); } if (NameLable) { NameLable.text = user.NickName; } //if (PlayerAnimator) //{ // PlayerAnimator.SetHands(LeftHandTarget, RightHandTarget); //} if (user.PeerId == CommonMethod.MyPeer.PeerId) { DispatcherBase.KeyDownDelegateRegister(OnKeyDownAction); DispatcherBase.KeyUpDelegateRegister(OnKeyUpAction); if (PlayerAnimator) { PlayerAnimator.gameObject.SetActive(false); } if (NameLable) NameLable.gameObject.SetActive(false); Container.data.art_id = user.PeerId; Container.data.id = 0; Container.data.goods_name = user.NickName; Container.data.goods_info = UnityUtil.TransferToString(containerTransfer, 2); containerTransfer = Container.transform; GameSession.Instance.ReSetBodyForward(); while (user != null) { containerTransfer.position = GameSession.Instance.gameHead.position; containerTransfer.forward = GameSession.Instance.BodyForward; if (PlayerAnimator) { //PlayerAnimator.playerHead.forward = GameSession.Instance.gameHead.forward; PlayerAnimator.playerHead.rotation = GameSession.Instance.gameHead.rotation; Vector3 leftpos; Quaternion leftRot; if (leftActive = GameSession.Instance.TryHandLeftPosition(out leftpos, out leftRot)) { if (!PlayerAnimator.HandLeft.gameObject.activeSelf) { PlayerAnimator.HandLeft.gameObject.SetActive(true); } PlayerAnimator.HandLeft.position = leftpos; PlayerAnimator.HandLeft.rotation = leftRot; } else { if (PlayerAnimator.HandLeft.gameObject.activeSelf) { PlayerAnimator.HandLeft.gameObject.SetActive(false); } } Vector3 rightpos; Quaternion rightRot; if (rightActive = GameSession.Instance.TryHandRightPosition(out rightpos, out rightRot)) { if (!PlayerAnimator.HandRight.gameObject.activeSelf) { PlayerAnimator.HandRight.gameObject.SetActive(true); } PlayerAnimator.HandRight.position = rightpos; PlayerAnimator.HandRight.rotation = rightRot; } else { if (PlayerAnimator.HandRight.gameObject.activeSelf) { PlayerAnimator.HandRight.gameObject.SetActive(false); } } } if (!ArtInfoMgr.Instance.IsSingleMan()) { SendTransfer(2, (int)TransferState.Over); } yield return new WaitForFixedUpdate(); } } } private void OnKeyUpAction(InputKeyCode keyCode, InputDevicePartBase part) { if (part.PartType == InputDevicePartType.HandLeft) { if (PlayerAnimator) { PlayerAnimator.LeftHandState = 0; } } else if (part.PartType == InputDevicePartType.HandRight) { if (PlayerAnimator) { PlayerAnimator.RightHandState = 0; } } } private void OnKeyDownAction(InputKeyCode keyCode, InputDevicePartBase part) { if (part.PartType == InputDevicePartType.HandLeft) { if (PlayerAnimator) { PlayerAnimator.LeftHandState = 1; } } else if (part.PartType == InputDevicePartType.HandRight) { if (PlayerAnimator) { PlayerAnimator.RightHandState = 1; } } } private void OnDestroy() { DispatcherBase.KeyDownDelegateUnRegister(OnKeyDownAction); DispatcherBase.KeyUpDelegateUnRegister(OnKeyUpAction); } /// /// 设置同步 /// /// /// public override void SendTransfer(int state, int status) { //var data = Container.data; if (PlayerAnimator) { Container.data.goods_extended = UnityUtil.QuaterToString(PlayerAnimator.playerHead.localRotation) + "!"; if (leftActive) { Container.data.goods_extended += UnityUtil.TransferToString(PlayerAnimator.HandLeft, 2); } Container.data.goods_extended += "!"; if (rightActive) { Container.data.goods_extended += UnityUtil.TransferToString(PlayerAnimator.HandRight, 2); } Container.data.status = 10 * PlayerAnimator.LeftHandState + PlayerAnimator.RightHandState; } base.SendTransfer(2, state); //data.goods_info = UnityUtil.TransferToString(containerTransfer, state); //ArtInfoMgr.Instance.SendTransfer(data); } public override void TransferSyn(GoodsInfo goods, bool smooth = true) { float smoothTween = Container.smoothTween; //base.TransferSyn(goods, smooth); Posture posture = UnityUtil.GetPosture(goods.goods_info); containerTransfer.localPosition = Vector3.Lerp(containerTransfer.localPosition, posture.position, (Time.deltaTime * smoothTween)); Quaternion q = Quaternion.Euler(posture.angle); containerTransfer.localRotation = Quaternion.Lerp(containerTransfer.localRotation, q, (Time.deltaTime * smoothTween)); if (PlayerAnimator && !string.IsNullOrEmpty(goods.goods_extended)) { string[] exts = goods.goods_extended.Split('!'); Quaternion rot = UnityUtil.StringToQuater(exts[0]); if (!string.IsNullOrEmpty(exts[1])) { Posture left = UnityUtil.GetPosture(exts[1]); if (!PlayerAnimator.HandLeft.gameObject.activeSelf) { PlayerAnimator.HandLeft.gameObject.SetActive(true); } Quaternion leftRot = Quaternion.Euler(left.angle); PlayerAnimator.HandLeft.localRotation = Quaternion.Lerp(PlayerAnimator.HandLeft.localRotation, leftRot, (Time.deltaTime * smoothTween)); { PlayerAnimator.HandLeft.localPosition = Vector3.Lerp(PlayerAnimator.HandLeft.localPosition, left.position, (Time.deltaTime * smoothTween)); } } else { if (PlayerAnimator.HandLeft.gameObject.activeSelf) { PlayerAnimator.HandLeft.gameObject.SetActive(false); } } if (!string.IsNullOrEmpty(exts[2])) { Posture right = UnityUtil.GetPosture(exts[2]); if (!PlayerAnimator.HandRight.gameObject.activeSelf) { PlayerAnimator.HandRight.gameObject.SetActive(true); } Quaternion rightRot = Quaternion.Euler(right.angle); PlayerAnimator.HandRight.localRotation = Quaternion.Lerp(PlayerAnimator.HandRight.localRotation, rightRot, (Time.deltaTime * smoothTween)); { PlayerAnimator.HandRight.localPosition = Vector3.Lerp(PlayerAnimator.HandRight.localPosition, right.position, (Time.deltaTime * smoothTween)); } } else { if (PlayerAnimator.HandRight.gameObject.activeSelf) { PlayerAnimator.HandRight.gameObject.SetActive(false); } } PlayerAnimator.playerHead.localRotation = Quaternion.Lerp(PlayerAnimator.playerHead.localRotation, rot, (Time.deltaTime * smoothTween)); if (PlayerAnimator.HandLeft.gameObject.activeSelf) { PlayerAnimator.LeftHandState = (goods.status / 10) >= 1 ? 1 : 0; } if (PlayerAnimator.HandRight.gameObject.activeSelf) { int rightState = goods.status % 10; PlayerAnimator.RightHandState = rightState >= 1 ? 1 : 0; } } } /// /// 设置用户信息 /// /// public void SetPeer(Peer peer) { this.user = peer; } public void StopSyn() { StopAllCoroutines(); user = null; } } }