首先我要實現的是顯示模型,這個很簡單了。需要將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軸滑動方向也就是人類的習慣了。不再反人類。