任何的学习,光看不练是学不好的。所以这次就总结回顾下怎么制作MMROPG类游戏中的小地图。在MMROPG类游戏里,主角在游戏世界里走动时,一般在屏幕右上角都会有一个区域来显示当前游戏场景的小地图。主角在游戏世界里走动,小地图里代表着主角的小标记也会随之移动。那怎么实现咧?
首先需要确定两个贴图,第一个是右上角的小地图背景贴图,应该是从Y轴俯视向下截取主角所在的位置大地图。第二个就是主角的位置大贴图。在本例中,因为没有学习unity地图制作,所以地图用一个面对象代替,主角用立方体代替,使用GUI来控制主角的移动。右上角小地图,中间的红色矩形代表着主角。通过小地图的宽,高,与真是地图的宽高计算出缩放比例,从而根据缩放比例来确定主角在小地图中的位置。
代码:
- 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));
- }
- }
点击按钮后:
这只是一个非常非常基本的例子,在后面,会慢慢学到使用unity制作的地图,而不是一个简单的平面。但基本的原理和思想是相同的,花两个贴图,根据两张图的比例来计算小地图主角位置。然后注意下主角的边界监测。就是这样。以后的unity学习笔记会接触到游戏元素这方面的知识了。