制作小地图的方法很多,简单介绍最简单的两种方法。
第一种方法比较实用也很简单,我们用一个实例来说明
注意:该场景为固定场景,即小地图会看到整个场景而非跟随主角的局部地图。适合用于小的游戏场景。
假如是FPS游戏,当然FPS必然有个Player(玩家)和enemy(敌人)。先拿player来举例子,我们可以在player下面建立一个子物体用Sphere这个球体来做子物体,这个子物体就是用来代替player在小地图中的显示的。然后把Sphere的属性中的collider这个属性去掉。然后给把其Shader设置成发光的材质,本例中设为绿色发光的。如图所示:
给他新建一个layer命名为dd,并且让其在dd这一层里。如图:
下面就可以新建一个摄像机,命名为mincamera,把他的放到整个场景的上方,使其镜头俯视整个场景,然后把属性里的viewport Rect 的数值调整到适合的大小,大小都可以在
camera preview里看到,同时在camera preview里也能看到用来代替Player的发光的绿色小球。如下面3副图:
这样小地图就已经见到雏形了,然后呢就So easy了。把mincamera的Culling Mask属性的摄像层次只设定到level和dd这两个层就OK了,这样mincamera就只能看到level和dd这两个层的物体了,leve就是我们的场景地图所在层,dd就是我们上面说到的用来代替Player的发光Sphere所在层。如图:
然后呢不要忘记我们的主相机,主相机不能摄像到dd这一层其他的都要摄到,如下图:
看下运行结果有图有真相:那个绿色的小点就是我们的玩家player。无论玩家在场景里怎么走,小地图都能跟踪显示了。那同样的enemy也用这个方法,小地图就可以显示敌人的位置了。ok了,So easy 完成了!简单吧一句代码都没写。。。
下面介绍一下第二种方法,主要使用GUI控制,举例说明:
场景里用plan代替地图,用cube代替玩家,如图:
然后呢很简单,把下面的代码绑定给Maincamera把对应的MAP和mapcube拖给脚本就OK了。如图:
代码如下:
using UnityEngine;
using System.Collections;
public class Script_04_17 : MonoBehaviour
{
//大地图地形对象
GameObject plane;
//大地图主角对象
GameObject cube;
//大地图的宽度
float mapWidth;
//大地图的高度
float mapHeight;
//地图边界的检测数值
float widthCheck;
float heightCheck;
//小地图主角的位置
float mapcube_x =0;
float mapcube_y = 0;
//GUI按钮是否被按下
bool keyUp;
bool keyDown;
bool keyLeft;
bool keyRight;
//小地图的背景贴图
public Texture map;
//小地图的主角贴图
public Texture map_cube;
void Start()
{
//得到大地图对象
plane = GameObject.Find("Plane");
//得到大地图主角对象
cube = GameObject.Find("Cube");
//得到大地图默认宽度
float size_x = plane.GetComponent<MeshFilter>().mesh.bounds.size.x;
//得到大地图宽度的缩放比例
float scal_x = plane.transform.localScale.x;
//得到大地图默认高度
float size_z = plane.GetComponent<MeshFilter>().mesh.bounds.size.z;
//得到大地图高度缩放地理
float scal_z = plane.transform.localScale.z;
//原始宽度乘以缩放比例计算出真实宽度
mapWidth = size_x * scal_x;
mapHeight = size_z * scal_z;
//越界监测的宽度
widthCheck = mapWidth / 2;
heightCheck = mapHeight / 2;
check();
}
void OnGUI()
{
keyUp = GUILayout.RepeatButton("向前移动");
keyDown = GUILayout.RepeatButton("向后移动");
keyLeft = GUILayout.RepeatButton("向左移动");
keyRight = GUILayout.RepeatButton("向右移动");
//绘制小地图背景
GUI.DrawTexture(new Rect(Screen.width - map.width,0,map.width,map.height),map);
//绘制小地图上的“主角”
GUI.DrawTexture(new Rect(mapcube_x,mapcube_y,map_cube.width,map_cube.height),map_cube);
}
void FixedUpdate()
{
if(keyUp)
{
//向前移动
cube.transform.Translate(Vector3.forward * Time.deltaTime *5);
check();
}
if(keyDown)
{
//向后移动
cube.transform.Translate(-Vector3.forward * Time.deltaTime *5);
check();
}
if(keyLeft)
{
//向左移动
cube.transform.Translate(-Vector3.right * Time.deltaTime *5);
check();
}
if(keyRight)
{
//向右移动
cube.transform.Translate(Vector3.right * Time.deltaTime *5);
check();
}
}
//越界检测
void check()
{
//得到当前主角在地图中的坐标
float x = cube.transform.position.x;
float z = cube.transform.position.z;
//当控制主角超过地图范围时,重新计算主角坐标
if(x >= widthCheck)
{
x = widthCheck;
}
if(x <= -widthCheck)
{
x = -widthCheck;
}
if(z >= heightCheck)
{
z = heightCheck;
}
if(z <= -heightCheck)
{
z = -heightCheck;
}
cube.transform.position = new Vector3(x,cube.transform.position.y,z);
//根据比例计算小地图“主角”的坐标
mapcube_x = (map.width/mapWidth * x) + ((map.width / 2) - (map_cube.width/2)) + (Screen.width - map.width);
mapcube_y =map.height - ((map.height/mapHeight * z) + (map.height / 2));
}
}
运行结果图: