小地圖是游戲中極度常用的組件,在Unity中,實現方式非常簡單。
主要利用的原理是將一個單獨攝像機的當前拍攝畫面實時保存到一張渲染紋理圖中,同時將這張紋理圖更新顯示到ugui中。
得知這一點后,先創建一張用於顯示小地圖內容的紋理圖Render Texture,可以直接在資源文件列表中創建:
在信息面板中可以設置該紋理圖的大小,采樣方式,壓縮方式等。設置完成后將該紋理圖放入攝像機的Target Texture中:
這樣攝像機就會把實時渲染的結果存儲到這張紋理圖中。值得注意的是,一般渲染小地圖的攝像機多采用正交攝像機,而不采用透視攝像機,因為小地圖上不需要顯示攝像機縱深方向上的前后的位置關系。
這里設置的未渲染的背景圖為純黑,其實也可以根據需求改為Depth Only。
同時如果小地圖上不需要顯示所有拍攝到的物體,也可以在Culling Mask中選取需要渲染的層保存到最終輸出的紋理圖中。
在ugui中創建Raw Image組件用於顯示渲染出來的紋理圖:
為了更為方便的控制小地圖攝像機的初始化和目標跟隨,可以添加一個額外的簡單控制腳本:
1 using System.Collections; 2 using System.Collections.Generic; 3 using UnityEngine; 4 5 public class MiniCameraCtrl : MonoBehaviour 6 { 7 public float Size = 5f; 8 public float Height = 10f; 9 private Transform Player; 10 private Camera Camera; 11 12 public void Init() 13 { 14 Player = BattleUtils.ActorMgr.PlayerActor.transform; 15 Camera = GetComponent<Camera>(); 16 17 transform.position = Player.position + new Vector3(0, Height, 0); 18 transform.rotation = Quaternion.Euler(90, 0, 0); 19 Camera.orthographic = true; 20 Camera.orthographicSize = Size; 21 22 StartCoroutine(Follow()); 23 } 24 25 IEnumerator Follow() 26 { 27 for(; ; ) 28 { 29 yield return null; 30 31 if (Player) 32 { 33 transform.position = Player.position + new Vector3(0, Height, 0); 34 yield return null; 35 } 36 else 37 yield break; 38 } 39 } 40 }
例如在地圖和主角生成完成后,便開始初始化該攝像機的位置關系及設定跟隨等。
效果展示:(攝像機只渲染了地圖的地板層)
2020年4月24日更新:
在小地圖上增加指示圖標。
也很簡單,給需要添加指示圖標的角色(例如Player)下面放一個面片作為子物體,我的做法是將這個物體的高度調整到只有小地圖的攝像機能夠看到(發揮正交攝像機的優勢),游戲主攝像機視野范圍之外即可。
當然了,你也可以重新給這些標志增加一個層,然后僅在小地圖的攝像機中渲染該層,其余的攝像機都不渲染,可以達到一樣的效果。