初識unity3D-手勢操作篇(轉)

首先我要實現的是顯示模型,這個很簡單了。需要將dae,obj或者fbx文件拖動到assets文件夾下面,然後呢將文件拖動到上面的主頁上面。

 

拖到這裏

然後我們可以看到上面有一個Main Camera和Directional Light,一個是主攝像機,另外一個是環境光。

然後下面的是我的模型,在還沒有完全繪製完的模型就已經500M了,很難想象真正畫完是有多大.

然後我們只需要將攝像機對準我們的模型,然後我們就可以去遊戲視圖中看到我們的模型。雖然我們在預覽的頁面可以上下左右的控制模型的旋轉縮放和擴大,但是真正運行到手機上,卻不能旋轉縮放了 ,我一直以爲運行到手機上能和預覽效果一樣呢。誰知道....

然後我就開始了爬坑操作。

從網上瘋狂搜索關於unity3D模型的手勢操作的代碼,然後一遍又一遍的往裏面粘貼,但是根本沒有用。後來中潛下心來,用心摸索。終於實現了自己想要的結果,當然也有一部分代碼是借鑑前賢手札,照葫蘆畫瓢的。

真是正題了

1.編寫主攝像機的腳本

首先點擊主攝像機,找到 Add  Component 並且點擊。然後找到new script,新建一個腳本。

然後在裏面聲明一個公共變量

public Transform engTransform;

這個東西其實是我們一會要關聯我們要查看的模型的關鍵字段。我們聲明完這個字段之後執行保存操作,然後去看unity3D的面板,會多一個這個畫面。

 

關聯

然後我們可以將模型拖動到這個transform中,之後我們繼續編寫攝像機的腳本。

private Vector3 offset;

聲明偏移量;

然後在start()方法中,讓我們攝像機的transform對準我們模型的座標位置。正對着。

然後計算攝像機和模型的初始偏移量,也就是距離。

transform.LookAt(engTransform.position);

 offset = transform.position - engTransform.position;

然後在update()方法中,

我們只需要用模型的位置座標+偏移量 就得到了改變之後的攝像機的位置。

void Update () {

        transform.position = offset + engTransform.position;

    }

虧我踩了那麼多坑,真相卻如此赤裸裸。可能是真正的unity3D大神都已經不屑寫這個東西了。所以在網上找的大多都有問題。

然後貼出模型的腳本文件。這裏面有個問題需要澄清一下。

public class tyreTouch : MonoBehaviour

{

    private Touch oldTouch1;

    private Touch oldTouch2;

    private GameObject engGameObject;

    // Use this for initialization

    void Start()

    {

        engGameObject = GameObject.Find("engine");

    }

    // Update is called once per frame

    void Update()

    {

        //沒有觸摸

        if (Input.touchCount <= 0)

        {

            return;

        }

        if (Input.touchCount == 1)

        {

            Touch touch = Input.GetTouch(0);

            Vector2 deltaPos = touch.deltaPosition;

            engGameObject.transform.Rotate(Vector3.down * deltaPos.x, Space.World);

            engGameObject.transform.Rotate(-Vector3.right * deltaPos.y, Space.World);

        }

        Touch newTouch1 = Input.GetTouch(0);

        Touch newTouch2 = Input.GetTouch(1);

        if (newTouch2.phase == TouchPhase.Began)

        {

            oldTouch2 = newTouch2;

            oldTouch1 = newTouch1;

            return;

        }

        float oldDistance = Vector2.Distance(oldTouch1.position, oldTouch2.position);

        float newDistance = Vector2.Distance(newTouch1.position, newTouch2.position);

        float offest = newDistance - oldDistance;

        float scaleFactor = offest / 1000f;

        Vector3 localScale = transform.localScale;

        Vector3 scale = new Vector3(localScale.x + scaleFactor, localScale.y + scaleFactor, +localScale.z + scaleFactor);

        if (scale.x > 0.3f && scale.y > 0.3f && scale.z > 0.3f)

        {

            engGameObject.transform.localScale = scale;

        }

        oldTouch1 = newTouch1;

        oldTouch2 = newTouch2;

    }

}

這是從網上粘過來的代碼,我只改動了標黑的兩處。

第一處是我們自己的模型,要替換爲項目中我們自己模型的名字。

然後第二處,是我運行網上代碼,發現的問題,我發現手勢操作左右滑動時的方向是正確的,但是當我上下滑動時,方向卻是相反的。所以我就將這個向量變成了負數,相應的y軸滑動方向也就是人類的習慣了。不再反人類。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章