運用モデルAR + Vuforia +

タグおよびレイヤモデルがモードです

 

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。
        } 
    } 
}

  

おすすめ

転載: www.cnblogs.com/WalkingSnail/p/11304115.html