需求:假如在第一人称游戏中,需要做一个小地图。为了美观和简便选择做成正方形
小地图拿来干嘛呢?用于实时检测自身相对于小地图的位置,顺便监测敌人相距自身的距离远近,从而方便玩家判断危险性和优先级。
方案大致思路:用一个正投影Orthographic的相机(取消透视的那种相机),竖直正对场景朝下看。在敌人和主角脚下固定一个物体(比如球体)用一些显眼的颜色渲染,从而作为指示器,方便在地图中指示。
通过一系列设置达到:主摄像机不显示特殊物体,作为小地图的相机只显示特殊物体+场景。
同时需要对地图用的摄像机的边框进行设置,避免形状不符合预期。
相机面向正对竖直朝下,设为Orthographic,调整Size值,调整Viewport Rect到自己满意为止。
解释:
Size:可以看作是取景范围大小。
ViewportRect中:XYWH四个量取值范围0-1,四个值指示将在屏幕上绘制此摄像机视图的位置。
X、Y——代表绘制摄像机视图的起始水平位置、起始垂直位置
W(Width)H(Height)——代表屏幕上摄像机输出的宽度、高度。
特别注意:删除相机上的AudioListener组件,同一个场景,只允许一个AudioListener。
------------
——给主角和敌人脚下各自放不同颜色的比较大的基本球体,shader可以选个LegacyShader/Self-illumin/Diffuse(自发光着色器,自身会发光,同时会响应场景中平行光),然后放到对应主角/敌人的层级之下。
它将作为只能显示在小地图摄像机中的代表物。(删除Collider,因为用不到)
——给代表物设置新Layer
——随后让主摄像机不显示这一层(Camera-->Culling Mask);让小地图摄像机只显示地图层和新Layer层
-------------
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MapCamera : MonoBehaviour
{
void Start()
{
//屏幕分辨率获取
float ratio = (float)Screen.width / (float)Screen.height;
this.GetComponent().rect = new Rect((1 - 0.2f), (1 - 0.2f * ratio), 0.2f, 0.2f * ratio);
}
}
1、Screen.width、Screen.height:以像素为单位的当前屏幕窗口宽/高;是int。
这里获取到宽/高比,用来调整小地图窗口使其变为正方形。否则得到的窗口比例和屏幕比例将保持一致,就不是正方形了。
2、Camera.rect:摄像机屏幕上是以标准化坐标呈现的。rect中的四个值范围从0(左/下)到1(右/上)。
——这里Camera中的所谓rect结构体3种构造方式,用到了第三种:
public Rect(Rect source);
public Rect(Vector2 position, Vector2 size);
public Rect(float x, float y, float width, float height);
——其中x和y分别表示矩形的XY坐标;在这里理解为矩形的左下角点位的位置
(注意有一个例外是 GUI 和 GUILayout 类的Rect,这俩例外情况中的 Y 向下增加。即矩形的左上角位置)
——width是矩形的宽度,根据X测量得到
——Height是矩形高度,根据Y测量得到
笔记记录中,如果有考虑不周或者谬误,欢迎评论留言指正~