在Unity中,我們經常需要讓攝像機跟隨一個物體移動,如果物體是水平移動的,而自身沒有發生任何的偏轉,那麼我們可以直接將攝像機放在該物體下。這樣就可以實現它們一起移動了,但是,如果移動的物體是圓的,比如小球,它在移動的過程中,自身是不斷旋轉的,所以,攝像機也會跟著一起旋轉,那麼我們看到得畫面將是天旋地轉的,很明顯,這樣是不行的。那麼我們該如何正確的讓攝像機跟隨小球一起運動呢?
工具/原料
Unity3D遊戲引擎
電腦
不可用的方法:
如圖,我們已經給小球添加了移動的腳本,小球是Sphere,現在想實現的是讓攝像機MainCamera跟隨小球一起運動。
我們先來看看上面說的不可行的方法:如圖,直接將"Main Camera"拖動到"Sphere"的子目錄,即讓攝像機成為小球的子物體,這樣,兩個對象就可以一起運動了,那麼我們來看看到底可不可行。
我們記錄一開始兩物體的位置,此時讓小球向右移動,此時,我們從這個視角看去,的確是一起運動了,但是,這不是我們在遊戲裡面看到得視角,我們看到的是攝像機的視角。
運行遊戲後,我們可以看到,畫面是"天旋地轉"的。所以,這種方法對於自身還在運動的物體來時,是不可行的。那麼下來我們說說正確的做法。
正確的方法:
我們要實現的是讓相機跟隨物體一起移動,其實就是讓相機和小球的相對位置不變即可。這裡我們需要使用代碼來控制兩個對象之間的相對位置,使其保持不變。
首先,在MainCamera裡面創建一個C# 腳本。如圖所示,點擊MainCamera,在右邊屬性欄最下方,選擇 AddComponent。然後,在彈出的選項里拉到最下方,選擇NewScript,然後創建一個C#腳本,命名為 Move。此時可以看到,我們新添加的一個C#腳本。
然後,開始寫代碼了。我們打開這個C# 腳本,我們要讓攝像機和小球的相對位置保持不變,那麼就必須獲取到小球的位置。在Unity裡,我們用transform 組件來獲取一個物體的位置。所以先定義一個transform組件,命名為bolltransform,選擇保存。
此時,我們返回Unity,在MainCamera的C#腳本里,多了一項。這裡就是我們要添加的組件,可以看到這裡還沒有添加組件。我們要獲取的是小球的位置,所以我們需要添加Sphere:將Sphere用鼠標拖進這個選擇框即可。這樣,我們就成功的將攝像機和小球關聯了起來。
我們點擊小球,在右邊的屬性欄裡可以看見小球的一個transform屬性,只要小球一開始運動,那麼它的transform屬性的值就被傳遞到了相機的bolltransform那裡。我想,這裡大家都是非常明白的。
我們已經獲取到了小球的位置,要使得它們之間的位置不變,也就是說小球和攝像機之間初始的偏移量始終不變就可以了。
所以,第一步:我們首先要計算出小球和攝像機之間的偏移量。
我們把偏移量設為offset,並且計算出offset。用代碼定義出來,因為偏移量是三維空間,所以我們用到Vector3。繼續在c#腳本里寫。如圖所示:
第二步:寫出它們之間的關係,即 初始偏移量=攝像機的位置-小球的位置。用代碼表示出來如下圖所示:
第三步,我們要通過此公式確定攝像機的位置,即:小球的位置+偏移量就等於攝像機的位置。而小球是不停地在動的,我們要不停的更新計算攝像機的位置,而在unity裡,update方法是不停地執行的。所以這一步的公式需要寫在 Update方法裡面就可以了。如圖所示:
這樣,整個過程就完成了,我們保存,開始運行,可以看到,現在攝像機看到的畫面也就一起跟著小球運動了。這就是在unity中用代碼控制兩個對象,使其距離保持不變的方法。我想,通過我這樣的講解,大家應該都懂了吧!
總結:
Unity3D是一款非常不錯的遊戲引擎,也是非常強大和值得學習的。這其中有許許多多的方法的技巧,是值得我們去向別人請教的。我和大家一樣,也是unity3D的愛好者。在unity3D的學習中,如果大家有什麼疑問,都可以在下方留言,我非常樂意和大家一起討論!