Пример #1
0
        /// <summary>
        /// 根据2/3D的状态
        /// 设置f3DSpaceInputModule visibale
        /// Cursor.visible
        /// 投屏状态
        /// </summary>
        void Set23DUIModel()
        {
            if (_is3D != is3D || flag) //默认第一次执行一次判断
            {
                flag  = false;
                _is3D = is3D;
                PenRayObj?.SetActive(is3D);
                SetCameraAccordingTo23DState(is3D);
                f3DSpaceInputModule.is3D = is3D;

                if (is3D)
                {
#if UNITY_STANDALONE
                    //Cursor.visible = false;
#endif
                    FCore.SetScreen3DSelf();
                }
                else
                {
#if UNITY_STANDALONE
                    //Cursor.visible = true;
#endif
                    FCore.SetScreen2DSelf();
                }
            }
        }
Пример #2
0
        /// <summary>
        /// 3D 拖拽或者移动
        /// </summary>
        private void OnKey0Down()
        {
            RaycastHit raycastHit;
            GameObject dragObj = Raycast(out raycastHit);

            if (dragObj != null)
            {
                if (Monitor23DMode.instance.is3D)
                {
                    _curDragObj = dragObj;


                    if (GlobalConfig.Instance.operationModel == OperationModel.Move)//移动物体
                    {
                        //添加抓取的物体
                        FCore.addDragObj(_curDragObj, raycastHit.distance, true);
                    }
                    else if (GlobalConfig.Instance.operationModel == OperationModel.Rotate)//旋转物体
                    {
                        OperationModelTool.Instance.AddRotaObject(_curDragObj);
                    }

                    if (enableShake)
                    {
                        FCore.PenShake();//震动一下
                    }

                    GlobalConfig.Instance._curOperateObj = _curDragObj;
                }
            }
        }
Пример #3
0
 ///-------------------------------------------------------------------------------------------------
 /// <summary>
 /// 按键1按下的事件响应.
 /// </summary>
 ///
 /// <remarks> Dx, 2018/3/5. </remarks>
 ///-------------------------------------------------------------------------------------------------
 private void OnKey1Down()
 {
     if (FCore.isDraging)
     {
         FCore.pushDragObj(_curDragObj, 0.10f);
     }
 }
Пример #4
0
        public void OnKey0Up()
        {
            //移出抓取的物体
            FCore.deleteDragObj(_curDragObj);

            //移除旋转的物体
            OperationModelTool.Instance.DeleRotaObject();

            _curDragObj = null;
        }
Пример #5
0
        void Start()
        {
            //设置屏幕为3D显示模式
            FCore.SetScreen3D();

            FCore.EventKey1Down += OnKey1Down;
            FCore.EventKey1Up   += OnKey1Up;

            _penObj = new GameObject("penRay");
            _penObj.AddComponent <PenRay>();
        }
Пример #6
0
 /// <summary>
 /// 设置2、3D相机的状态
 /// </summary>
 /// <param name="is3D"></param>
 void SetCameraAccordingTo23DState(bool is3D)
 {
     refCamera2D.ActiveCameras(!is3D);
     refCamera3D.ActiveCameras(is3D);
     if (is3D)
     {
         FCore.SetScreen3DSelf();
     }
     else
     {
         FCore.SetScreen2DSelf();
     }
 }
Пример #7
0
        ///-------------------------------------------------------------------------------------------------
        /// <summary>
        /// 按键0按下的事件响应.
        /// </summary>
        ///
        /// <remarks> Dx, 2017/9/22. </remarks>
        ///-------------------------------------------------------------------------------------------------
        private void OnKey0Down()
        {
            RaycastHit raycastHit;
            GameObject dragObj = Raycast(out raycastHit);

            if (dragObj != null)
            {
                _curDragObj = dragObj;//记录当前拖拽物体
                FCore.addDragObj(raycastHit.collider.gameObject, raycastHit.distance);
                if (enableShake)
                {
                    FCore.PenShake();//震动一下
                }
            }
        }
Пример #8
0
 private void Update()
 {
     if (FCore.isDraging)
     {
         //响应两个按键长按的功能
         if (FCore.isKey1Down)
         {
             FCore.pushDragObj(_curDragObj, 1.50f * Time.deltaTime);
         }
         if (FCore.isKey2Down)
         {
             FCore.pullDragObj(_curDragObj, 1.50f * Time.deltaTime);
         }
     }
 }
Пример #9
0
    /// <summary>
    /// 单个模块点击事件
    /// </summary>
    /// <param name="img"></param>
    void ItemClickCallback(GameObject img)
    {
        if (!CheckObj(img.name))
        {
            img.GetComponent <BoxItem>().ShowError();
            return;
        }

        //加载预制体模型
        if (objsDic.ContainsKey(img.name))
        {
            ClickedObj = objsDic[img.name];
        }
        else
        {
            ClickedObj = ResManager.GetPrefab("Prefabs/" + img.name);

            ClickedObj.transform.position = img.transform.position;

            objsDic.Add(img.name, ClickedObj);

            if (Monitor23DMode.instance.is3D)
            {
                simpleDrag._curDragObj = ClickedObj;
                FCore.addDragObj(ClickedObj, 1, true);
            }
        }



        ItemModel itm = ClickedObj.GetComponent <ItemModel>();

        if (itm == null)
        {
            itm = ClickedObj.AddComponent <ItemModel>();
        }
        objectsList.Add(img.name);


        Check();
    }
        // The following 2 functions are equivalent to PointerInputModule.GetMousePointerEventData but are customized to
        // get data for ray pointers and canvas mouse pointers.

        /// <summary>
        /// State for a pointer controlled by a world space ray. E.g. gaze pointer
        /// </summary>
        /// <returns></returns>
        virtual protected MouseState GetGazePointerData()
        {
            // Get the OVRRayPointerEventData reference
            GCSeriesPointerEventData leftData;

            GetPointerData(kMouseLeftId, out leftData, true);
            leftData.Reset();
            //Now set the world space ray. This ray is what the user uses to point at UI elements
            leftData.worldSpaceRay = new Ray(FCore.penPosition, FCore.penDirection);
            //leftData.scrollDelta = GetExtraScrollDelta();

            //Populate some default values
            leftData.button           = PointerEventData.InputButton.Left;
            leftData.useDragThreshold = true;
            // Perform raycast to find intersections with world
            eventSystem.RaycastAll(leftData, m_RaycastResultCache);
            var raycast = FindFirstRaycast(m_RaycastResultCache);

            leftData.pointerCurrentRaycast = raycast;
            m_RaycastResultCache.Clear();
            //hitPos = new Vector3(1000f, 1000f, 1000f);
            GCSeriesRaycaster ovrRaycaster = raycast.module as GCSeriesRaycaster;

            // We're only interested in intersections from OVRRaycasters
            if (ovrRaycaster)
            {
                // The Unity UI system expects event data to have a screen position
                // so even though this raycast came from a world space ray we must get a screen
                // space position for the camera attached to this raycaster for compatability
                leftData.position = ovrRaycaster.GetScreenPosition(raycast);


                // Find the world position and normal the Graphic the ray intersected
                RectTransform graphicRect = raycast.gameObject.GetComponent <RectTransform>();
                if (graphicRect != null)
                {
                    // Set are gaze indicator with this world position and normal
                    Vector3 worldPos = raycast.worldPosition; //射到UI上的点
                                                              //Vector3 normal = GetRectTransformNormal(graphicRect);
                                                              //hitPos = worldPos;
                }

                //获取父物体是否有button组件
                Button uiButton = raycast.gameObject.GetComponentInParent <Button>();
                if (uiButton)
                {
                    Transform[] transforms = raycast.gameObject.GetComponentsInParent <Transform>();
                    //在限定的层级里寻找是否存在button组件,存在且不与上次的物体同名,则说明需要响应shake操作
                    int traverseTime = transforms.Length < traverseButtonTime ? transforms.Length : traverseButtonTime;
                    for (int i = 0; i < traverseTime; i++)
                    {
                        if (transforms[i].name == uiButton.name)
                        {
                            if (lastCheckObj)
                            {
                                if (lastCheckObj.name != uiButton.name)
                                {
                                    FCore.PenShake();
                                    lastCheckObj = uiButton.gameObject;
                                }
                            }
                            else
                            {
                                FCore.PenShake();
                                lastCheckObj = uiButton.gameObject;
                            }
                        }
                    }
                }
                else
                {
                    Toggle toggle = raycast.gameObject.GetComponentInParent <Toggle>();
                    if (toggle)
                    {
                        Transform[] transforms = raycast.gameObject.GetComponentsInParent <Transform>();
                        //在限定的层级里寻找是否存在button组件,存在且不与上次的物体同名,则说明需要响应shake操作
                        int traverseTime = transforms.Length < traverseToggleTime ? transforms.Length : traverseToggleTime;
                        for (int i = 0; i < traverseTime; i++)
                        {
                            if (transforms[i].name == toggle.name)
                            {
                                if (lastCheckObj)
                                {
                                    if (lastCheckObj.name != toggle.name)
                                    {
                                        FCore.PenShake();
                                        lastCheckObj = toggle.gameObject;
                                    }
                                }
                                else
                                {
                                    FCore.PenShake();
                                    lastCheckObj = toggle.gameObject;
                                }
                            }
                        }
                    }
                    else
                    {
                        lastCheckObj = null;
                    }
                }
            }
            else
            {
                //没有点到UI 或者说是移出UI
                lastCheckObj = null;
            }
            m_PenState.SetButtonState(PointerEventData.InputButton.Left, GetPenButtonState(), leftData);
            return(m_PenState);
        }
Пример #11
0
        /*-------------支持投屏和触屏修改部分--------------*/

        // The following 2 functions are equivalent to PointerInputModule.GetMousePointerEventData but are customized to
        // get data for ray pointers and canvas mouse pointers.

        /// <summary>
        /// State for a pointer controlled by a world space ray. E.g. gaze pointer
        /// </summary>
        /// <returns></returns>
        virtual protected MouseState GetGazePointerData()
        {
            // Get the OVRRayPointerEventData reference
            GCSeriesPointerEventData leftData;

            GetPointerData(kMouseLeftId, out leftData, true);
            leftData.Reset();

            leftData.position = GCInput.mouseUIPosition;

            //Now set the world space ray. This ray is what the user uses to point at UI elements
            leftData.worldSpaceRay = new Ray(FCore.penPosition, FCore.penDirection);
            //leftData.scrollDelta = GetExtraScrollDelta();

            //Populate some default values
            leftData.button           = PointerEventData.InputButton.Left;
            leftData.useDragThreshold = true;
            // Perform raycast to find intersections with world
            m_RaycastResultCache.Clear();
            eventSystem.RaycastAll(leftData, m_RaycastResultCache);
            var raycast = FindFirstRaycast(m_RaycastResultCache);

            leftData.pointerCurrentRaycast = raycast;

            //hitPos = new Vector3(1000f, 1000f, 1000f);

            GCSeriesRaycaster ovrRaycaster = raycast.module as GCSeriesRaycaster;

            if (!curPenRay)
            {
                curPenRay = GameObject.FindObjectOfType <PenRay>();
            }

            bool isClickButtonOrToggle = false;

            // We're only interested in intersections from OVRRaycasters
            if (ovrRaycaster)
            {
                // The Unity UI system expects event data to have a screen position
                // so even though this raycast came from a world space ray we must get a screen
                // space position for the camera attached to this raycaster for compatability

                leftData.position = ovrRaycaster.GetScreenPosition(raycast);

                // Find the world position and normal the Graphic the ray intersected
                RectTransform graphicRect = raycast.gameObject.GetComponent <RectTransform>();
                if (graphicRect != null)
                {
                    // Set are gaze indicator with this world position and normal
                    Vector3 worldPos = raycast.worldPosition; //射到UI上的点
                                                              //Vector3 normal = GetRectTransformNormal(graphicRect);
                                                              //hitPos = worldPos;

                    if (curPenRay)
                    {
                        curPenRay.hitUI_bool    = true;
                        curPenRay.hitUIWorldPos = worldPos;
                    }
                }


                //获取父物体是否有button组件
                Button uiButton = raycast.gameObject.GetComponentInParent <Button>();
                if (uiButton)
                {
                    Transform[] transforms = raycast.gameObject.GetComponentsInParent <Transform>();
                    //在限定的层级里寻找是否存在button组件,存在且不与上次的物体同名,则说明需要响应shake操作
                    int traverseTime = transforms.Length < traverseButtonTime ? transforms.Length : traverseButtonTime;
                    for (int i = 0; i < traverseTime; i++)
                    {
                        if (transforms[i].name == uiButton.name)
                        {
                            isClickButtonOrToggle = true;
                            if (lastCheckObj)
                            {
                                if (lastCheckObj.name != uiButton.name)
                                {
                                    FCore.PenShake();
                                    lastCheckObj = uiButton.gameObject;
                                }
                            }
                            else
                            {
                                FCore.PenShake();
                                lastCheckObj = uiButton.gameObject;
                            }
                        }
                    }
                }
                else
                {
                    Toggle toggle = raycast.gameObject.GetComponentInParent <Toggle>();
                    if (toggle)
                    {
                        Transform[] transforms = raycast.gameObject.GetComponentsInParent <Transform>();
                        //在限定的层级里寻找是否存在button组件,存在且不与上次的物体同名,则说明需要响应shake操作
                        int traverseTime = transforms.Length < traverseToggleTime ? transforms.Length : traverseToggleTime;
                        for (int i = 0; i < traverseTime; i++)
                        {
                            if (transforms[i].name == toggle.name)
                            {
                                isClickButtonOrToggle = true;
                                if (lastCheckObj)
                                {
                                    if (lastCheckObj.name != toggle.name)
                                    {
                                        FCore.PenShake();
                                        lastCheckObj = toggle.gameObject;
                                    }
                                }
                                else
                                {
                                    FCore.PenShake();
                                    lastCheckObj = toggle.gameObject;
                                }
                            }
                        }
                    }
                    else
                    {
                        lastCheckObj = null;
                    }
                }
            }
            else
            {
                if (curPenRay)
                {
                    curPenRay.hitUI_bool = false;
                    //没有点到UI 或者说是移出UI
                    lastCheckObj = null;
                }
            }

            if (curPenRay)
            {
                curPenRay.hitGameObject = raycast.gameObject;
            }
            if (!isClickButtonOrToggle)
            {
                m_PenState.SetButtonState(PointerEventData.InputButton.Left, GetPenButtonState(), leftData);
            }
            else
            {
                m_PenState.SetButtonState(PointerEventData.InputButton.Left, GetPenButtonClickToggleOrButton(), leftData);
            }


            //F3D.AppLog.AddMsg($"GCSeriesInputModule.eventSystem.RaycastAll.Count = {m_RaycastResultCache.Count}");
            //m_PenState.SetButtonState(PointerEventData.InputButton.Left, PointerEventData.FramePressState.Released, leftData);

            //情况1:默认笔命中结果 (命中有交互功能UI)

            //情况2:笔没有命中 鼠标也没有命中 释放按压状态
            if (raycast.gameObject == null)
            {
                m_PenState.SetButtonState(PointerEventData.InputButton.Left, GCInput.GetStateForMouseButton(0), leftData);
            }
            //情况3:笔没有命中  鼠标命中了
            else if (raycast.gameObject != null && !(raycast.module is GCSeriesRaycaster))
            {
                curPenRay.hitGameObject   = null;
                leftData.useDragThreshold = false;
                leftData.delta            = Vector2.zero;
                m_PenState.SetButtonState(PointerEventData.InputButton.Left, GCInput.GetStateForMouseButton(0), leftData);
            }
            //情况4:如果触笔命中了(但是无交互功能的UI) 则使用鼠标命中结果
            else if (raycast.gameObject == null || (raycast.module is GCSeriesRaycaster && raycast.gameObject.GetComponent <Interactable>() == null))
            {
                foreach (var item in m_RaycastResultCache)
                {
                    if (item.module is GCSeriesRaycaster)
                    {
                        continue;
                    }
                    if (item.gameObject == null)
                    {
                        continue;
                    }
                    // F3D.AppLog.AddMsg($"GetGazePointerData {item.gameObject.name}");
                    //第一个鼠标输入数据命中的对象处理
                    curPenRay.hitGameObject        = null;
                    leftData.position              = GCInput.mouseUIPosition;
                    leftData.pointerCurrentRaycast = item;
                    leftData.useDragThreshold      = false;
                    leftData.delta = Vector2.zero;
                    m_PenState.SetButtonState(PointerEventData.InputButton.Left, GCInput.GetStateForMouseButton(0), leftData);

                    break;
                }
            }
            m_RaycastResultCache.Clear();
            //IsPointerOverGameObject判断需要
            leftData.pointerEnter = leftData.pointerCurrentRaycast.gameObject;
            return(m_PenState);
        }
Пример #12
0
 void OnApplicationQuit()
 {
     //在程序退出的时候设置屏幕为2D显示
     FCore.SetScreen2D();
 }
Пример #13
0
 ///-------------------------------------------------------------------------------------------------
 /// <summary>
 /// 按键0抬起的事件响应.
 /// </summary>
 ///
 /// <remarks> Dx, 2017/9/22. </remarks>
 ///-------------------------------------------------------------------------------------------------
 private void OnKey0Up()
 {
     FCore.deleteDragObj(_curDragObj);
 }
Пример #14
0
 private void OnApplicationQuit()
 {
     FCore.SetScreen2D();
 }