无论学习。只看不练是坏科学。
因此,要总结回想这怎么生产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; //GUIbutton是否被按下
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));
}
}
执行:
点击button后:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzI4OTE4OA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
这仅仅是一个很很主要的样例。在后面。会慢慢学到使用unity制作的地图,而不是一个简单的平面。但主要的原理和思想是同样的,花两个贴图。依据两张图的比例来计算小地图主角位置。然后注意下主角的边界监測。
而已。后unity学习笔记将暴露于游戏的元素在这方面的知识。
版权声明:本文博客原创文章。博客,未经同意,不得转载。