【Unity 3D】学习笔记二十九:游戏实例——简单小地图制作

任何的学习,光看不练是学不好的。所以这次就总结回顾下怎么制作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学习笔记会接触到游戏元素这方面的知识了。

【Unity 3D】学习笔记二十九:游戏实例——简单小地图制作

时间: 2024-08-24 19:47:28

【Unity 3D】学习笔记二十九:游戏实例——简单小地图制作的相关文章

Android学习笔记二十九之SwipeRefreshLayout、RecyclerView和CardView

Android学习笔记二十九之SwipeRefreshLayout.RecyclerView和CardView 前面我们介绍了AlertDialog和几个常用的Dialog,ProgressDialog进度条提示框.DatePickerDialog日期选择对话框和TimePickerDialog时间选择对话框.这一节我们介绍几个新的API控件SwipeRefreshLayout.RecyclerView和CardView,这几个API控件都是google在Android5.0推出的.下面我们来学

[傅里叶变换及其应用学习笔记] 二十九. 高维Ш函数修改版

一维Ш函数复习 我们前面(十六课,十七课)已经学习过一维的Ш函数,标准的Ш函数表现为无数个脉冲函数分布在整数点上, 我们定义Ш为 $Ш(x) = \displaystyle{ \sum_{k=-\infty}^{\infty}\delta(x-k) }$ 而Ш函数最为深刻的一个性质就是:Ш的傅里叶变换是它自身 $\mathcal{F}Ш=Ш$ 进一步推广到脉冲间隔为$p$的函数$Ш_p$ $\displaystyle{ Ш_p(x)=\sum_{k=-\infty}^{\infty}\delta

PHP学习笔记二十九【接口】

<?php //定义接口 //接口可以定义属性,但必须是常量而且是public //接口的所有方法必须是public interface Iusb{ public function start(); public function stop(); } //手机类实现接口关键字implements,必须实现这个所有方法 //类可以同时实现多个接口 //一个类可以实现多个接口 implements 接口1,接口2,接口 class Phone implements Iusb{ public func

Linux学习笔记&lt;二十九&gt;——http服务

基础概念: HTTP:Hyper Text Transfer Protocol 超文本传输协议 versions: HTTP/0.9:只接收GET一种请求方法,只支持纯文本 HTTP/1.0:支持PUT.POST.DELETE和HEAD,支持MINE HTTP/1.1:在HTTP/1.0的基础上,增加了缓存功能,支持长连接,支持管道方式同时                  发送多个请求 HTTP请求方法:获取资源的方法 HTTP/0.9:GET HTTP/1.0:PUT(修改服务器上的内容),

【Unity 3D】学习笔记二十六:unity游戏脚本(六)

在3D游戏世界中,任何一个游戏对象在创建的时候都会附带Transform(变换)组件,并且该组件是无法删除的,也不应该删除.在unity中,Transform面板一共有3个属性: Position  (位置) Rotation(旋转) Scale(缩放) 这三个值都是用来调整游戏对象在游戏界面中的位置,状态等相关参数. Position  (位置) 任何一个游戏对象的三维坐标都保存在Vector3容器中,该容器记录对象在X轴,Y轴,Z轴的坐标.一旦Vector33容器中的坐标发生变化,那么Sce

【Unity 3D】学习笔记二十八:unity工具类

unity为开发者提供了很多方便开发的工具,他们都是由系统封装的一些功能和方法.比如说:实现时间的time类,获取随机数的Random.Range( )方法等等. 时间类 time类,主要用来获取当前的系统时间. using UnityEngine; using System.Collections; public class Script_04_13 : MonoBehaviour { void OnGUI() { GUILayout.Label("当前游戏时间:" + Time.t

unity3d学习笔记(十九)--ngui制作3d人物头顶的头像和血条

原地址:http://blog.csdn.net/lzhq1982/article/details/18793479 本系列文章由Aimar_Johnny编写,欢迎转载,转载请标明出处,谢谢. http://blog.csdn.net/lzhq1982/article/details/18793479 先上张图,自己做的一个demo. 这里的人物头像和血条是在3d世界生成的,所以有真正的纵深感和遮挡关系,废话不多说,看我是怎么实现的. 第一步,先在UI Root里制作头像和血条. 这个制作步骤基

《Javascript权威指南》学习笔记之十九--HTML5 DOM新标准---处理文档元信息和管理交互能力

一.了解DOM 1.DOM是Document Object Model的缩写,即文档对象类型,是文档在内存中的表示形式,是一个应用程序接口,定义了文档的逻辑结构以及一套访问和处理文档的方法. 2.HTML DOM与Core DOM的区别:前者提供了大量的方法和属性,与现有的程序模型一致,更便于脚本的编写者控制. 二.document对象 使用window.document属性返回一个document对象,代表当前window内加载的文档.window可以省略.winName.document返回

马哥学习笔记二十四——分布式复制快设备drbd

DRBD: 主从 primary: 可执行读.写操作 secondary: 文件系统不能挂载 DRBD: dual primay, 双主(基于集群文件系统的高可用集群) 磁盘调度器:合并读请求,合并写请求: Procotol:drbd数据同步协议 A: Async, 异步  数据发送到本机tcp/ip协议栈 B:semi sync, 半同步  数据发送到对方tcp/ip协议 C:sync, 同步  数据到达对方存储设备 DRBD Source: DRBD资源 资源名称:可以是除了空白字符外的任意