說到小地圖,大家可能有些不是很了解,但是說到英雄聯盟大家可能眼前一亮,這個我知道!
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 }
將此腳本掛到Camera上
到這里就結束了,咱們看下小地圖的效果吧!
點擊向左移動
PS:小地圖的制作難點主要是計算出小地圖與地形真是的大小的縮放比例,通過該比例計算出場景中物體映射到小地圖的坐標位置。
下面是我自己推理的筆記,希望對大家有幫助!
有問題聯系我哦,工程鏈接:http://pan.baidu.com/s/1qWOAq2g
測試環境:Win 8.1+Unity4.5.5,打不開請更新Unity哦!