码迷,mamicode.com
首页 > 编程语言 > 详细

unity 小地图的制作

时间:2014-11-11 21:06:41      阅读:300      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   http   io   color   ar   os   java   

说到小地图,大家可能有些不是很了解,但是说到英雄联盟大家可能眼前一亮,这个我知道!

Q:英雄联盟右下角的小地图看到了吗?

A:有些人会说那是小地图吗?

Q:是的。

只是他们做的太好了,看起来不觉得像小地图罢了!——所以相信团队的力量!

不扯了,言归正传,开始咱们的小地图学习了!

1,打开Unity 建一个空的工程,结构如下。

bubuko.com,布布扣

2,开始写脚本了。

miniMap.cs

bubuko.com,布布扣
  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上

bubuko.com,布布扣

到这里就结束了,咱们看下小地图的效果吧!

bubuko.com,布布扣

点击向左移动

bubuko.com,布布扣

PS:小地图的制作难点主要是计算出小地图与地形真是的大小的缩放比例,通过该比例计算出场景中物体映射到小地图的坐标位置。

下面是我自己推理的笔记,希望对大家有帮助!

 

bubuko.com,布布扣

 

有问题联系我哦,工程链接:http://pan.baidu.com/s/1qWOAq2g

测试环境:Win 8.1+Unity4.5.5,打不开请更新Unity哦!

 

unity 小地图的制作

标签:des   style   blog   http   io   color   ar   os   java   

原文地址:http://www.cnblogs.com/wuzhang/p/wuzhang20141111.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!