タグおよびレイヤモデルがモードです
System.Collectionsを使用しました。 System.Collections.Genericを使用しました。 UnityEngineを使用しました。 パブリッククラスARModelOperator:MonoBehaviour { プライベートカメラaRCamera。 //パブリック文字列TargetNameは、 プライベート列挙TouchType { DefaultTypeで指定= 0、 ShortClick = 1、 LongClick = 2、 のDoubleClick = 3、 右クリック= 4 }。 プライベートブールonDrag =偽; プライベートベクトル2 startPos。 TouchType operatorType = TouchType.DefaultType。 フロートスピード= 250F; ベクトル2 oldPosition1、oldPosition2。 フロート距離= 30F。 scaleRatio = 0.1Fフロート; パブリックブールisAnimation =偽; スタートボイド() { aRCamera = GameObject.Find( "RenderCamera")GetComponent <カメラ>();. } //拡大機能は狭くする真、falseを返すを返す ブールisEnlarge(ベクトル2 OP1、OP2ベクトル2 、ベクトル2 NP1、NP2ベクトル2 ) { //関数にワンタッチ位置と現在算出されたユーザのジェスチャーに応じて2つのタッチ点の位置を通過 するvar leng1 = Mathf.Sqrtを((oP1.x - oP2.x)*(oP1.x - OP2 .X)+(oP1.y - oP2.y)*(oP1.y - oP2.y)); VAR leng2 Mathf.Sqrt =((nP1.x - nP2.x)*(nP1.x - nP2.x )+(nP1.y - nP2.y)*(nP1.y - nP2.y)); IF(leng1 <leng2) { //ズームジェスチャ をtrueに戻り; } そう 偽に戻ります; } { //缩小手势 } の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(ベクトル2 mousePos) { 光線= aRCamera.ScreenPointToRay(mousePos)。 返すPhysics.Raycast(光線は、アウトヒット)。 } フロートintervalTime = 0F。 RaycastHitがヒット。 レイ線; doubleTouch = falseのブール値。 平滑= 0.1Fフロート。 ボイド更新() { ///鼠标滚轮控制模型缩放 VAR SC1 = transform.localScale。 //Debug.LogError("distance "+距離)。 IF(Input.GetAxis( "マウススクロールホイール")> 0) { IF(距離> 18.5f) { 距離- = ARModelData.Instance.GetItem(ARGlobalData.CurrentTargetModeName).InitScale * ARModelData.Instance.GetItem(ARGlobalData.CurrentTargetModeName).MaxScalingMultiplier。 IF(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( "マウススクロールホイール")<0) { IF(距離<= 34F) { //Debug.LogError(hit.collider.name)。 距離+ = 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)であれば { = 2 * Vector3.one *平滑* ARModelData.Instance - SC1。 GetItem(ARGlobalData.CurrentTargetModeName).scalingMultiplier * ARModelData.Instance.GetItem(ARGlobalData.CurrentTargetModeName).MaxScalingMultiplier。 } } } transform.localScale = SC1。 もし(Input.touchCount> 1) {//双指 IF(!doubleTouch) { doubleTouch = CheckIsDoubleTouch(Input.touches [0] .position)|| CheckIsDoubleTouch(Input.touches [1] .position)。 } IF(doubleTouch) { IF(hit.collider.tag == "モード") { (Input.GetTouch(0)== .phase TouchPhase.Moved || Input.GetTouch(1).phase == TouchPhase.Moved場合) { VAR tempPosition1 = Input.GetTouch(0).position。 VAR tempPosition2 = Input.GetTouch(1).position。 VAR SC = transform.localScale。 (isEnlarge(oldPosition1、oldPosition2、tempPosition1、tempPosition2))であれば { IF(距離> 18.5f) { 距離- = ARModelData.Instance.GetItem(ARGlobalData.CurrentTargetModeName).InitScale * ARModelData.Instance.GetItem(ARGlobalData.CurrentTargetModeName).MaxScalingMultiplier。 IF(sc.x <= 0.4 * ARModelData.Instance.GetItem(ARGlobalData.CurrentTargetModeName).MaxScalingMultiplier && sc.x> 0) { SC + = 2 * Vector3.one *平滑* ARModelData.Instance.GetItem(hit.collider.name) .scalingMultiplier * ARModelData.Instance.GetItem(ARGlobalData.CurrentTargetModeName).MaxScalingMultiplier。 } } } } 他 { IF(距離<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 - SC。 GetItem(ARGlobalData.CurrentTargetModeName).scalingMultiplier * ARModelData.Instance.GetItem(ARGlobalData.CurrentTargetModeName).MaxScalingMultiplier。 } } transform.localScale =皮下。 oldPosition1 = tempPosition1。 oldPosition2 = tempPosition2。 } } } もし(Input.GetTouch(1)== TouchPhase.Endedを.phase) { doubleTouch = FALSE; } } 他 { IF(Input.GetMouseButton(0)) { IF(Input.GetMouseButtonDown(0))// || Input.touches [0] == .phase TouchPhase.Began) { startPos = Input.mousePosition。 光線= aRCamera.ScreenPointToRay(startPos)。 onDrag = Physics.Raycast(線、ヒットアウト)。 intervalTime = Time.realtimeSinceStartup。 isAnimation =はtrue。 } IF(onDrag) { IF(hit.collider.tag == "モード") { IF(operatorType == TouchType.DefaultType) { IF(Time.realtimeSinceStartup - intervalTime> 0.5F)//长按 isAnimation = falseは、 { //Debug.LogError("animales "); operatorType = TouchType.ShortClick; //旋转 operatorType = TouchType.LongClick。 StartCoroutine(OnMouseDownClick())。 } 他 { ベクトル2 curPos = Input.mousePosition。 IF(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) { IF(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 = FALSE; operatorType = TouchType.DefaultType。 } } }