unity 小地圖的制作


說到小地圖,大家可能有些不是很了解,但是說到英雄聯盟大家可能眼前一亮,這個我知道!

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哦!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM