小地图是游戏中极度常用的组件,在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 }
例如在地图和主角生成完成后,便开始初始化该摄像机的位置关系及设定跟随等。
效果展示:(摄像机只渲染了地图的地板层)