/// <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(); } } }
/// <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; } } }
///------------------------------------------------------------------------------------------------- /// <summary> /// 按键1按下的事件响应. /// </summary> /// /// <remarks> Dx, 2018/3/5. </remarks> ///------------------------------------------------------------------------------------------------- private void OnKey1Down() { if (FCore.isDraging) { FCore.pushDragObj(_curDragObj, 0.10f); } }
public void OnKey0Up() { //移出抓取的物体 FCore.deleteDragObj(_curDragObj); //移除旋转的物体 OperationModelTool.Instance.DeleRotaObject(); _curDragObj = null; }
void Start() { //设置屏幕为3D显示模式 FCore.SetScreen3D(); FCore.EventKey1Down += OnKey1Down; FCore.EventKey1Up += OnKey1Up; _penObj = new GameObject("penRay"); _penObj.AddComponent <PenRay>(); }
/// <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(); } }
///------------------------------------------------------------------------------------------------- /// <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();//震动一下 } } }
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); } } }
/// <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); }
/*-------------支持投屏和触屏修改部分--------------*/ // 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); }
void OnApplicationQuit() { //在程序退出的时候设置屏幕为2D显示 FCore.SetScreen2D(); }
///------------------------------------------------------------------------------------------------- /// <summary> /// 按键0抬起的事件响应. /// </summary> /// /// <remarks> Dx, 2017/9/22. </remarks> ///------------------------------------------------------------------------------------------------- private void OnKey0Up() { FCore.deleteDragObj(_curDragObj); }
private void OnApplicationQuit() { FCore.SetScreen2D(); }