實作分享 - 攝影機捕捉多角色

N 人看过

You can also see my post in Bahamut.

最近在開發2D遊戲攝影機的時候,參考到一篇2D攝影機設計經典文章

就是2015年的這篇 Scroll Back - 2D 捲軸遊戲的攝影機理論與實務

其中有提到,在多人操作的時候,會希望攝影機能照到所有角色,這篇就將討論如何實做這件事。

Smash is best

分析

在開始製作之前,我們先試著簡化遇到的問題

smash bounding box

從上面這張圖來看,四個紅圈是我們的目標(角色),我們希望的是將他們都顯示在畫面中。
那也就是說,我們希望能夠用一個長方形(螢幕)來塞下他們全部。

如下圖

Smash box

我當初看到這個問題的時候,馬上想到演算法學到的convex-hull問題,
找出最小凸包之後,就可以沿著凸包求得最小的方形。

但是在我們攝影機不會旋轉的情況,我們不需要那麼麻煩,因為軸是固定的,
我們只要找到這些點之中最大和最小的x,y值即可
如下圖

![Smash] (https://i.imgur.com/wEs8HUp.png)

判斷的程式碼如下

unity

接著我們就可以利用判斷出來的這四個點做延伸,找出目標的長方形

unity

此時將攝影機放在這個長方形的中心點,再將攝影機縮放到比長方形大小還要大
就可以拍到所有角色囉!

實作

接下來實作長方形大小的計算,以及攝影機的縮放部分

這邊我的攝影機縮放以orthographic的攝影機為例(因為直接size乘上去就好),
使用投影的情況就再額外計算Z軸距離吧!

以下是我實作的程式碼:
code

使用前面說的方法獲得整個長方形的四個點之後,可以簡單地算出他們的中心點(第15行)
接著算出畫面長寬相對於長方形的長寬比例,將較大的一方回傳給攝影機設定就可以了!(17~20行以及22行所做)

執行結果大致如下影片

整個專案的repo在這,如果有興趣也歡迎參考使用喔XD
https://github.com/HaoxDev/UnityPractices