说到小地图,大家可能有些不是很了解,但是说到英雄联盟大家可能眼前一亮,这个我知道!
Q:英雄联盟右下角的小地图看到了吗?
A:有些人会说那是小地图吗?
Q:是的。
只是他们做的太好了,看起来不觉得像小地图罢了!——所以相信团队的力量!
不扯了,言归正传,开始咱们的小地图学习了!
1,打开Unity 建一个空的工程,结构如下。
2,开始写脚本了。
miniMap.cs
1 using UnityEngine;
2 using System.Collections;
3
4 public class miniMap : MonoBehaviour
5 {
6
7 //大地图地形对象
8 GameObject plane;
9 //大地图主角对象
10 GameObject cube;
11
12 //大地图的宽度
13 float mapWidth;
14 //大地图的高度
15 float mapHeight;
16 //地图边界的检测数值
17 float widthCheck;
18 float heightCheck;
19
20 //小地图主角的位置
21 float mapcube_x =0;
22 float mapcube_y = 0;
23
24 float mapcube1_x ;
25 float mapcube1_y;
26
27 //GUI按钮是否被按下
28 bool keyUp;
29 bool keyDown;
30 bool keyLeft;
31 bool keyRight;
32
33 //小地图的背景贴图
34 public Texture map;
35 //小地图的主角贴图
36 public Texture map_cube;
37 GameObject[] cubes;
38
39 void Awake()
40 {
41 cubes = GameObject.FindGameObjectsWithTag ("cube");
42 Debug.Log (cubes[0].name);
43
44 }
45 void Start()
46 {
47 //得到大地图对象
48 plane = GameObject.Find("Plane");
49 //得到大地图主角对象
50 cube = GameObject.Find("Player");
51 //得到大地图默认宽度
52 float size_x = plane.GetComponent<MeshFilter>().mesh.bounds.size.x;
53 //得到大地图宽度的缩放比例
54 float scal_x = plane.transform.localScale.x;
55 //得到大地图默认高度
56 float size_z = plane.GetComponent<MeshFilter>().mesh.bounds.size.z;
57 //得到大地图高度缩放地理
58 float scal_z = plane.transform.localScale.z;
59
60 //原始宽度乘以缩放比例计算出真实宽度
61 mapWidth = size_x * scal_x;
62 mapHeight = size_z * scal_z;
63
64 //越界监测的宽度
65 widthCheck = mapWidth / 2;
66 heightCheck = mapHeight / 2;
67
68 check();
69 }
70
71 void OnGUI()
72 {
73 keyUp = GUI.RepeatButton(new Rect(500,10,100,30),"向前移动");
74
75 keyDown = GUI.RepeatButton(new Rect(500,40,100,30),"向后移动");
76
77 keyLeft = GUI.RepeatButton(new Rect(500,70,100,30),"向左移动");
78
79 keyRight = GUI.RepeatButton(new Rect(500,100,100,30),"向右移动");
80
81 //绘制小地图背景
82 GUI.DrawTexture(new Rect(0,0,map.width,map.height),map);
83 //绘制小地图上的“主角”
84 GUI.DrawTexture(new Rect(mapcube_x,mapcube_y,map_cube.width,map_cube.height),map_cube);
85
86 foreach(var obj in cubes)
87 {
88 float x1 = obj.transform.position.x;
89 float z1 = obj.transform.position.z;
90 mapcube1_x = (map.width / mapWidth * x1)+map.width/2;
91 mapcube1_y = ((map.height/mapHeight * z1)+map.height/2);
92 GUI.DrawTexture(new Rect(mapcube1_x,mapcube1_y,map_cube.width,map_cube.height),map_cube);
93 }
94 }
95
96 void FixedUpdate()
97 {
98 if(keyUp)
99 {
100 //向前移动
101 cube.transform.Translate(Vector3.forward * Time.deltaTime *5);
102 check();
103 }
104 if(keyDown)
105 {
106 //向后移动
107 cube.transform.Translate(-Vector3.forward * Time.deltaTime *5);
108 check();
109 }
110 if(keyLeft)
111 {
112 //向左移动
113 cube.transform.Translate(-Vector3.right * Time.deltaTime *5);
114 check();
115 }
116 if(keyRight)
117 {
118 //向右移动
119 cube.transform.Translate(Vector3.right * Time.deltaTime *5);
120 check();
121 }
122 }
123
124 //越界检测
125 void check()
126 {
127 //得到当前主角在地图中的坐标
128 float x = cube.transform.position.x;
129 float z = cube.transform.position.z;
130
131 //当控制主角超过地图范围时,重新计算主角坐标
132 if(x >= widthCheck)
133 {
134 x = widthCheck;
135 }
136 if(x <= -widthCheck)
137 {
138 x = -widthCheck;
139 }
140 if(z >= heightCheck)
141 {
142 z = heightCheck;
143 }
144 if(z <= -heightCheck)
145 {
146 z = -heightCheck;
147 }
148
149 cube.transform.position = new Vector3(x,cube.transform.position.y,z);
150
151 //根据比例计算小地图“主角”的坐标
152 mapcube_x = (map.width / mapWidth * x)+map.width/2;
153 mapcube_y = ((map.height/mapHeight * z)+map.height/2);
154 //Debug.Log (mapcube_x+","+mapcube_y);
155 }
156 }
View Code
将此脚本挂到Camera上
到这里就结束了,咱们看下小地图的效果吧!
点击向左移动
PS:小地图的制作难点主要是计算出小地图与地形真是的大小的缩放比例,通过该比例计算出场景中物体映射到小地图的坐标位置。
下面是我自己推理的笔记,希望对大家有帮助!
有问题联系我哦,工程链接:http://pan.baidu.com/s/1qWOAq2g
测试环境:Win 8.1+Unity4.5.5,打不开请更新Unity哦!