using BeinLab.Util; using DG.Tweening; using SC.XR.Unity.Module_InputSystem; using ShadowStudio.Model; using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; using XRTool.Util; namespace ShadowStudio.Tool { ///// ///// 编辑状态 ///// //public enum TransferState //{ // Start = 0, // Doing = 1, // Stop = 2 //} //[RequireComponent(typeof(XBoundingBox))] //[RequireComponent(typeof(XDragComponent))] public class TransferComponent : MonoBehaviour/*, IPointerDownHandler*/ { //[SerializeField] ///// ///// 是否垂直水平面 ///// //private bool isLookHead; ///// ///// 拖拽事件 ///// //public event Action DragTransfer; ///// ///// 缩放事件 ///// //public event Action ZoomTransfer; ///// ///// 旋转事件 ///// //public event Action RoteTransfer; ///// ///// 编辑事件 ///// 当物体进行拖拽,缩放,旋转时都会触发 ///// //public event Action EditTransfer; ///// ///// 选中和非选中的事件 ///// //public event Action TransferSelect; //public static TransferComponent curActiveCell; //private XDragComponent dragCell; //private XBoundingBox boundBox; //private Coroutine editCoroutine; //private bool isLock; ///// ///// 编辑模式 ///// -1代表未编辑 ///// 0代表拖拽 ///// 1代表旋转 ///// 2代表缩放 ///// 开始前/结束后要设置为-1 ///// 开始后到执行中设置对应的状态 ///// //private int editType = -1; //private Timer dragTimer; //public float autoDisDrag = 5f; //private Stack postureHistroy; //private Stack postureFuture; //private GameObject boundCell; //[SerializeField] //private bool isDragEnable; ///// ///// 后退的栈 ///// //public Stack PostureBack //{ // get // { // if (postureHistroy == null) // { // postureHistroy = new Stack(); // } // return postureHistroy; // } //} ///// ///// 前进的栈 ///// //public Stack PostureAhead //{ // get // { // if (postureFuture == null) // { // postureFuture = new Stack(); // } // return postureFuture; // } //} ///// ///// 锁定 ///// //public bool IsLock //{ // get // { // return isLock; // } // set // { // isLock = value; // if (isLock) // { // PostureAhead.Clear(); // PostureBack.Clear(); // IsDragEnable = false; // SetBoundActive(true); // SetBoundColor(value, Color.yellow); // } // else // { // SetBoundColor(value, Color.white); // if (curActiveCell != this) // { // SetBoundActive(false); // } // } // } //} ///// ///// 拖拽组件 ///// //public XDragComponent DragCell //{ // get // { // if (!dragCell) // { // dragCell = GetComponent(); // dragCell.PointerDrag.AddListener(OnPointerDrag); // //dragCell.PointerDown.AddListener(OnPointerDown); // dragCell.PointerUp.AddListener(OnPointerUp); // } // return dragCell; // } //} ///// ///// 包围盒显示对象 ///// //public GameObject BoundCell //{ // get // { // if (!boundCell) // { // boundCell = UnityUtil.GetBreadthChild(transform, "XRTool.Util.XBoundingBox"); // } // return boundCell; // } //} ///// ///// 包围盒算法组件 ///// //public XBoundingBox BoundBox //{ // get // { // if (!boundBox) // { // boundBox = GetComponent(); // if (!boundBox) // { // UnityLog.Instance.LogError(gameObject.name + "this is no XBoundingBox"); // } // else // { // DragTransfer += state => { EditTransfer?.Invoke(state); }; // ZoomTransfer += state => { EditTransfer?.Invoke(state); }; // RoteTransfer += state => { EditTransfer?.Invoke(state); }; // EditTransfer += OnEditTransfer; // boundBox.ScaleStarted.AddListener(OnScaleStarted); // boundBox.ScaleStopped.AddListener(OnScaleStopped); // boundBox.RotateStarted.AddListener(OnRotateStarted); // boundBox.RotateStopped.AddListener(OnRotateStopped); // } // } // return boundBox; // } //} //public void SetBoundActive(bool isShow) //{ // if (BoundCell) // { // BoundCell.SetActive(isShow); // } //} ///// ///// 初始化 ///// //private void Start() //{ // if (BoundBox) // { // TimerMgr.Instance.CreateTimer(() => // { // IsDragEnable = false; // }, 0); // } //} ///// ///// 当编辑物体的时候 ///// ///// //private void OnEditTransfer(TransferState state) //{ // if (state == TransferState.Start) // { // ClearTime(); // AddBackNode(UnityUtil.GetPosture(transform)); // } // if (state == TransferState.Stop) // { // ClearTime(); // if (autoDisDrag > 0) // { // dragTimer = TimerMgr.Instance.CreateTimer(() => { IsDragEnable = false; }, autoDisDrag); // } // } // print(editType + "__" + state); //} ///// ///// 清除协程 ///// //private void ClearEditor() //{ // if (editCoroutine != null) // { // StopCoroutine(editCoroutine); // editCoroutine = null; // } //} ///// ///// 旋转结束 ///// //private void OnRotateStopped() //{ // ClearEditor(); // RoteTransfer?.Invoke(TransferState.Stop); // editType = -1; //} ///// ///// 旋转开始 ///// //private void OnRotateStarted() //{ // ClearEditor(); // RoteTransfer?.Invoke(TransferState.Start); // editCoroutine = StartCoroutine(EditorCoroutine(1)); //} ///// ///// 缩放结束 ///// //private void OnScaleStopped() //{ // ClearEditor(); // ZoomTransfer?.Invoke(TransferState.Stop); // editType = -1; // TimerMgr.Instance.CreateTimer(RemoveBound, 0.01f); //} ///// ///// 缩放开始 ///// //private void OnScaleStarted() //{ // ClearEditor(); // ZoomTransfer?.Invoke(TransferState.Start); // editCoroutine = StartCoroutine(EditorCoroutine(2)); //} ///// ///// 编辑的协程 ///// ///// //private IEnumerator EditorCoroutine(int state) //{ // editType = state; // while (editType != -1) // { // if (editType == 1) // { // RoteTransfer?.Invoke(TransferState.Doing); // } // else if (editType == 2) // { // ZoomTransfer?.Invoke(TransferState.Doing); // } // yield return new WaitForFixedUpdate(); // } //} ///// ///// 当按下的时候 ///// 如果物体没有被锁定,处于可操作的状态时,显示操作框 ///// ///// //public void OnPointerDown(PointerEventData eventData) //{ // if (IsLock || (SCInputModule.Instance && !SCInputModule.Instance.CanDrag)) // { // return; // } // transform.DOKill(); // editType = -1; // IsDragEnable = true; // if (BoundBox) // { // BoundBox.OnPointerDown(eventData); // } // if (DragCell) // { // DragCell.OnPointerDown(eventData); // } //} ///// ///// 当抬起的时候 ///// ///// //public void OnPointerUp(PointerEventData eventData) //{ // if (SCInputModule.Instance && !SCInputModule.Instance.CanDrag) // { // return; // } // if (editType != -1) // { // DragTransfer?.Invoke(TransferState.Stop); // editType = -1; // } //} ///// ///// 拖拽事件 ///// ///// //private void OnPointerDrag(PointerEventData eventData) //{ // if (editType == -1) // { // DragTransfer?.Invoke(TransferState.Start); // //EditorTransfer?.Invoke(state, false); // } // if (isLookHead) // { // editType = 1; // } // else // { // editType = 0; // } // if (isLookHead && GameSession.Instance && GameSession.Instance.gameHead) // { // Vector3 pos = GameSession.Instance.gameHead.position; // pos.y = transform.position.y; // Vector3 forward = (transform.position - pos).normalized; // pos.y = 0; // if (forward != Vector3.zero) // { // transform.forward = forward; // } // } // DragTransfer?.Invoke(TransferState.Doing); //} ///// ///// 添加一个后退的节点 ///// 当退出一个前进的节点或者编辑物体的时候添加 ///// ///// //public void AddBackNode(Posture posture) //{ // if (PostureBack != null) // { // PostureBack.Push(posture); // } //} ///// ///// 退出一个后退的节点 ///// //public bool PeekBackNode() //{ // if (PostureBack != null && PostureBack.Count > 0) // { // AddAheadNode(UnityUtil.GetPosture(transform)); // Posture posture = PostureBack.Pop(); // DelaySyn(posture, 0.2f); // return true; // } // return false; //} ///// ///// 延时控制 ///// ///// ///// //public void DelaySyn(Posture posture, float time) //{ // ClearTime(); // editType = -1; // EditTransfer?.Invoke(TransferState.Start); // editType = 2; // UnityUtil.SetPosture(transform, posture, time); // ///同步3次位置,保持位移的实时性 // TimerMgr.Instance.CreateTimer(() => // { // EditTransfer?.Invoke(TransferState.Doing); // }, time / 4f, 3); // TimerMgr.Instance.CreateTimer(() => // { // EditTransfer?.Invoke(TransferState.Stop); // editType = -1; // }, time + 0.01f); //} ///// ///// 添加一个前进的节点,仅当回退的时候添加 ///// ///// //public void AddAheadNode(Posture posture) //{ // if (PostureAhead != null) // { // PostureAhead.Push(posture); // } //} ///// ///// 退出一个前进的节点 ///// //public bool PeekAheadNode() //{ // if (PostureAhead != null && PostureAhead.Count > 0) // { // AddBackNode(UnityUtil.GetPosture(transform)); // Posture posture = PostureAhead.Pop(); // DelaySyn(posture, 0.2f); // return true; // } // return false; //} ///// ///// 清理此计时器 ///// //private void ClearTime() //{ // if (dragTimer != null && TimerMgr.Instance) // { // TimerMgr.Instance.DestroyTimer(dragTimer); // } // dragTimer = null; //} ///// ///// 重构包围盒 ///// ///// //public void RemoveBound() //{ // if (BoundCell) // { // Destroy(BoundCell); // } // BoundBox.Start(); //} ///// ///// 设置编辑框的颜色 ///// 用来判定颜色无法被选中的效果 ///// ///// //public void SetBoundColor(bool isLock, Color color) //{ // if (BoundBox) // { // BoundBox.SetZoomColor(isLock, color); // } //} ///// ///// 获得距离最近的低啊 ///// ///// ///// //public Vector3 GetCastPoint(Vector3 point) //{ // if (BoundBox) // { // return BoundBox.GetCastPoint(point); // } // return transform.position; //} ///// ///// 设置位移编辑激活和失活 ///// ///// //public void SetTransferActive(bool isActive) //{ // if (BoundBox && BoundBox.isActiveAndEnabled != isActive) // { // BoundBox.enabled = isActive; // } // if (DragCell && DragCell.isActiveAndEnabled != isActive) // { // DragCell.enabled = isActive; // } // SetBoundActive(isActive); // if (!isActive) // { // DisActiveCell(); // } //} ///// ///// 设置可操作性 ///// //public bool IsDragEnable //{ // get => isDragEnable; // set // { // isDragEnable = value; // SetTransferActive(isDragEnable); // if (isDragEnable && !IsLock) // { // ChangeActive(); // } // } //} //public void ChangeActive() //{ // if (curActiveCell && curActiveCell != this) // { // if (!curActiveCell.IsLock) // { // curActiveCell.IsDragEnable = false; // } // } // if (!IsLock) // { // if (curActiveCell != this) // { // curActiveCell = this; // TransferSelect?.Invoke(this, true); // } // if (curActiveCell) // { // curActiveCell.SetBoundActive(true); // } // } //} //public void DisActiveCell() //{ // if (curActiveCell == this) // { // TransferSelect?.Invoke(this, false); // curActiveCell = null; // } //} } }