теги и слой модель Mode
используя System.Collections; используя System.Collections.Generic; используя UnityEngine; ARModelOperator общественного класса: MonoBehaviour { частная aRCamera камеры; // строка Имя_целевого_объект общественности; частное перечисление TouchType { DefaultType = 0, ShortClick = 1, LongClick = 2, DoubleClick = 3, RightClick = 4, }; частная BOOL onDrag = ложь; частный Vector2 StartPos; TouchType operatorType = TouchType.DefaultType; Скорость поплавка = 250f; Vector2 oldPosition1, oldPosition2; поплавковый расстояние = 30f; плавать scaleRatio = 0.1f; BOOL isAnimation общественности = ложь; аннулированию Start () { aRCamera = GameObject.Find ( "RenderCamera") GetComponent <Camera> () ;. } // увеличена функция возвращает True, False возвращается сужать BOOL isEnlarge (Vector2 OP1, Vector2 ФП2 , то Vector2 NP1, NP2 Vector2) { // на функцию передается на одну позицию касания и положение двух точек касания в соответствии с настоящим вычисляемого жест пользователя вар leng1 = Mathf.Sqrt ((oP1.x - oP2.x) * (oP1.x - oP2.x) + (oP1.y - oP2.y) * (oP1.y - oP2.y)); вар leng2 Mathf.Sqrt = ((nP1.x - nP2.x) * (NP1 .x - nP2.x) + (nP1.y - nP2.y) * (nP1.y - nP2.y)); IF (leng1 <leng2) { // масштабирование жест возвращение к истине; } еще { //缩小手势 возврата к ложным; } } IEnumerator OnMouseDownClick () { Vector3 = aRCamera.WorldToScreenPoint размера рабочего стола (transform.position); Vector3 смещение = transform.position - aRCamera.ScreenToWorldPoint (новый Vector3 (Input.mousePosition.x, Input.mousePosition.y, screenSpace.z)); в то время как (Input.GetMouseButton (0)) { Vector3 curScreenSpace = новый Vector3 (Input.mousePosition.x, Input.mousePosition.y, screenSpace.z); Vector3 curPosition = aRCamera.ScreenToWorldPoint (curScreenSpace) + смещение; transform.position = curPosition; Выход возврата нового WaitForFixedUpdate (); } } BOOL CheckIsDoubleTouch (Vector2 mousePos) { луч = aRCamera.ScreenPointToRay (mousePos); вернуться Physics.Raycast (луч, вне хит); } Плавать intervalTime = 0f; RaycastHit удар; Луч излучения; BOOL doubleTouch = ложь; плавать гладкий = 0.1f; Обновление недействительными () { ///鼠标滚轮控制模型缩放 вар SC1 = transform.localScale; //Debug.LogError("distance "+ расстояние); если (Input.GetAxis ( "Мышь ScrollWheel")> 0) { если (расстояние> 18.5f) { Расстояние - = ARModelData.Instance.GetItem (ARGlobalData.CurrentTargetModeName) .InitScale * ARModelData.Instance.GetItem (ARGlobalData.CurrentTargetModeName) .MaxScalingMultiplier; если (sc1.x <0,4 * ARModelData.Instance.GetItem (ARGlobalData.CurrentTargetModeName) .MaxScalingMultiplier && sc1.x> 0) { SC1 + = 2 * Vector3.one * * гладкая ARModelData.Instance.GetItem (ARGlobalData.CurrentTargetModeName) .scalingMultiplier * ARModelData.Instance.GetItem (ARGlobalData.CurrentTargetModeName) .MaxScalingMultiplier; } } } Если (Input.GetAxis ( "Мышь ScrollWheel") <0) { если (расстояние <= 34f) { //Debug.LogError(hit.collider.name); } Transform.localScale = SC1; Расстояние + = ARModelData.Instance.GetItem (ARGlobalData.CurrentTargetModeName) .InitScale * ARModelData.Instance.GetItem (ARGlobalData.CurrentTargetModeName) .MaxScalingMultiplier; если (sc1.x> 0,8 * ARModelData.Instance.GetItem (ARGlobalData.CurrentTargetModeName) .scalingMultiplier * ARModelData.Instance.GetItem (ARGlobalData.CurrentTargetModeName) .MaxScalingMultiplier) { SC1 - = 2 * Vector3.one * * гладкая ARModelData.Instance. GetItem (ARGlobalData.CurrentTargetModeName) .scalingMultiplier * ARModelData.Instance.GetItem (ARGlobalData.CurrentTargetModeName) .MaxScalingMultiplier; } } Если (Input.touchCount> 1) {//双指 если (! DoubleTouch) { DoubleTouch = CheckIsDoubleTouch (Input.touches [0] .position) || CheckIsDoubleTouch (Input.touches [1] .position); } Если (doubleTouch) { если (hit.collider.tag == "Режим") { если (Input.GetTouch (0) .phase == TouchPhase.Moved || Input.GetTouch (1) .phase == TouchPhase.Moved ) { вар tempPosition1 = Input.GetTouch (0) .position; если (isEnlarge (oldPosition1, oldPosition2, tempPosition1, tempPosition2)) { вар tempPosition2 = Input.GetTouch (1) .position; вар подкожно = transform.localScale; если (расстояние> 18.5f) { расстояние - = ARModelData.Instance.GetItem (ARGlobalData.CurrentTargetModeName) .InitScale * ARModelData.Instance.GetItem (ARGlobalData.CurrentTargetModeName) .MaxScalingMultiplier; если (sc.x <= 0,4 * ARModelData.Instance.GetItem (ARGlobalData.CurrentTargetModeName) .MaxScalingMultiplier && sc.x> 0) { СБН + = 2 * Vector3.one * * гладкая ARModelData.Instance.GetItem (hit.collider.name) .scalingMultiplier * ARModelData.Instance.GetItem (ARGlobalData.CurrentTargetModeName) .MaxScalingMultiplier; } } } } Еще { если (расстояние <34f) { расстояние + = ARModelData.Instance.GetItem (ARGlobalData.CurrentTargetModeName) .InitScale * ARModelData.Instance.GetItem (ARGlobalData.CurrentTargetModeName) .MaxScalingMultiplier; если (sc.x> 0,8 * ARModelData.Instance.GetItem (ARGlobalData.CurrentTargetModeName) .scalingMultiplier * ARModelData.Instance.GetItem (ARGlobalData.CurrentTargetModeName) .MaxScalingMultiplier) { подкожно - = 2 * Vector3.one * * гладкая ARModelData.Instance. GetItem (ARGlobalData.CurrentTargetModeName) .scalingMultiplier * ARModelData.Instance.GetItem (ARGlobalData.CurrentTargetModeName) .MaxScalingMultiplier; } } { transform.localScale = подкожно; oldPosition1 = tempPosition1; oldPosition2 = tempPosition2; } } } Если (Input.GetTouch (1) .phase == TouchPhase.Ended) { doubleTouch = ложь; } } Еще { если (Input.GetMouseButton (0)) { если (Input.GetMouseButtonDown (0)) // || Input.touches [0] .phase == TouchPhase.Began) StartPos = Input.mousePosition; Луч = aRCamera.ScreenPointToRay (StartPos); onDrag = Physics.Raycast (луч, из хит); intervalTime = Time.realtimeSinceStartup; isAnimation = TRUE; } Если (onDrag) { если (hit.collider.tag == "Mode") { если (== operatorType TouchType.DefaultType) { если (Time.realtimeSinceStartup - intervalTime> 0.5f) //长按 isAnimation = ложь; { //Debug.LogError("animales "); operatorType = TouchType.ShortClick; //旋转 operatorType = TouchType.LongClick; StartCoroutine (OnMouseDownClick ()); } Иначе { Vector2 curPos = Input.mousePosition; если (Mathf.Abs (curPos.x - startPos.x)> Mathf.Abs (curPos.y - startPos.y) && Mathf.Abs (curPos.x - startPos.x)> 5f) { isAnimation = false; } Еще { IsAnimation = TRUE; } } } Еще если (operatorType == TouchType.ShortClick) { если (startPos.x> Input.mousePosition.x) //向左滑动 { transform.Rotate (Vector3.up * Time.deltaTime * скорость); } Еще если (startPos.x <Input.mousePosition.x) //向右滑动 { transform.Rotate (Vector3.down * Time.deltaTime * скорость); } StartPos = Input.mousePosition; } } } } Иначе , если (Input.GetMouseButton (1)) { operatorType = TouchType.RightClick; StartCoroutine (OnMouseDownClick ()); } } Если (Input.GetMouseButtonUp (0)) // || Input.touches [0] .phase == TouchPhase.Ended) { onDrag = ложь; operatorType = TouchType.DefaultType; } } }