2017-04-11 20:05:26 Mogoson 阅读数 2121

MGS-Map

概述

Unity3D 制作场景地图,地图轨迹 插件包。

方案

  • 计算小地图UI与场景地形的尺寸比例,获取地图标记的位置。
  • 计算地形上标记与世界方向的方向差,获取地图标记的方向。
  • 动态生成UI贴图,绘制地图标记运动轨迹。

实现

  • MapFlag.cs 地图标记,例如:漫游角色。
  • GlobalMap.cs 全局地图。
  • LocalMap.cs 局部地图。
  • FlagTrail.cs 地图轨迹。

源码

2016-04-25 13:21:24 begonia__z 阅读数 2139

在3D游戏中常常使用小地图来显示自己角色所在的位置,之前项目遇到过用NGUI来制作一个简单的小地图的功能,尝试制作一个简单的小地图功能,怎样丰富小地图的功能这个就要自己去慢慢摸索咯~

用UGUI制作一个简单的小地图的思路有很多,这里简单介绍一下思路再大体弄一个小Demo出来。

方法一:

利用两个摄像机一个为角色的摄像机,另一个作为俯视全地图的摄像机,然后用RenderTextrue以及RawImage渲染到需要的位置,然后再角色摄像机上方在添加一个3D UI来指示角色所在位置(PS:也可以将指向放到UGUI上去,这种方法就需要将角色转动的偏向值传到指向的UI上)。

然后俯视摄像机跟随角色摄像机移动这样地图大体上实现出来了,但是要注意计算摄像机是否到了边距位置。虽然这种方法很简单,但是要用到两个摄像机以及实时渲染这一方面,这样就要考虑到内存问题,KGFMapSystem这个插件大体上也是用这种方式来制作小地图的。代码就自己去想想怎么写吧!大体的设置方向如图所示:


接下来说一说第二种方法

方法二:

这种方法是不采用两个摄像机的,直接用一张做好的图片代替实时渲染的摄像机的图片,然后通过计算模型与图片的比例来计算角色摄像机所在地图位置映射到小地图上对应的位置,相对第一种方法来说这种方式的小地图就较为繁琐。

这里我们要梳理一下需求:

1、要知道模型以及图片大小,用来计算比例。

2、通过角色位置,利用模型与图片的之间的比例,计算指标位置所在位置。

3、角色左右旋转的角度传到到UI指标的上来。

大体上也就是这两个功能,但是也有可能因为小地图过大需要重新计算它们之间的比例,因此我们根据项目需求来做。

这里只提供思路,大体上的思路就有这些,由于时间问题我并没有写代码出来(PS:我也有可能找个时间去写出来,也有可能不写~一切看心情来定~)

                                                                                                                                                                                                                                                                 ——Begonia

2015-01-13 09:29:49 alayeshi 阅读数 1228

制作小地图的方法很多,简单介绍最简单的两种方法。

第一种方法比较实用也很简单,我们用一个实例来说明

假如是FPS游戏,当然FPS必然有个Player(玩家)enemy(敌人)。先拿player来举例子,我们可以在player下面建立一个子物体用Sphere这个球体来做子物体,这个子物体就是用来代替player在小地图中的显示的。然后把Sphere的属性中的collider这个属性去掉。然后给把其Shader设置成发光的材质,本例中设为绿色发光的。如图所示:



                                               

给他新建一个layer命名为dd,并且让其在dd这一层里。如图:




下面就可以新建一个摄像机,命名为mincamera,把他的放到整个场景的上方,使其镜头俯视整个场景,然后把属性里的viewport Rect 的数值调整到适合的大小,大小都可以在

camera preview里看到,同时在camera preview里也能看到用来代替Player的发光的绿色小球。如下面3副图:

     

 

这样小地图就已经见到雏形了,然后呢就So easy了。把mincamera的Culling Mask属性的摄像层次只设定到level和dd这两个层就OK了,这样mincamera就只能看到level和dd这两个层的物体了,leve就是我们的场景地图所在层,dd就是我们上面说到的用来代替Player的发光Sphere所在层。如图:


然后呢不要忘记我们的主相机,主相机不能摄像到dd这一层其他的都要摄到,如下图:


看下运行结果有图有真相:那个绿色的小点就是我们的玩家player。无论玩家在场景里怎么走,小地图都能跟踪显示了。那同样的enemy也用这个方法,小地图就可以显示敌人的位置了。ok了,So easy 完成了!简单吧一句代码都没写。。。



下面介绍一下第二种方法,主要使用GUI控制,举例说明:

场景里用plan代替地图,用cube代替玩家,如图:



然后呢很简单,把下面的代码绑定给Maincamera把对应的MAP和mapcube拖给脚本就OK了。如图:


代码如下:

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));
	}
}

运行结果图:



2014-07-23 14:22:12 G__Dragon 阅读数 2898


一个简单的方法,

首先先在俯视图视角截取一张图片,用作小地图的背景图片。然后新建一个Plane,把截图附到Plane上,然后把Plane与刚才截图的场景的相应位置重合,要尽量重合,当做地图。(见第二张图,中间亮的部分就是截图的Plane)

然后在新建一个相机,单独照射该图片,将相机位置与图片对准,铺满相机屏幕。再在控制的第一人称视角下添加子物体,一张图片,用来表示在小地图表示移动的人物。然后将背景图片,相机、人物指示图片都放到一个新层如“Map”层中,并且场景中其他相机不得照射此层。

然后调整地图相机的ViewProt Rect,使之在右上角显示,并且地图相机层要在第一人称相机之上,

2017-11-07 23:28:02 qq_40695551 阅读数 933

Unity3D技巧之小地图的实现

 首先在UI画布下创建一个空物体改名叫Minmap。并在Minmap下创建Raw Image用来做遮罩。

.
然后再建立一个Sprite于Player的子对象下并且改名为icon,设置Layer为icon。用来作为游戏主人公的在小地图的标识,并把制作好的icon箭头应用于Sprite中(导入的图片记得改为Sprite(2D and UI格式 )。设置好后旋转合适角度并拉到player正上方一段距离。



新建一个Camera 改名为MinpapCam(用作跟随Player的摄像机)并适当调整位置。
调整MinmapCam相机的Culling Mask为地形 icon什么的(想在小地图出现什么选什么)
新建一个Render Texture于Project面板中并托给MinmapCam的Target Texture中。
新建Minmap脚本拖给MinmapCam。并把icon拖给Minmap中。
代码如下
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Minmap : MonoBehaviour
{

    private Transform newtransform;
    public GameObject icon;
    void Start()
    {
        newtransform = GetComponent<Transform>();
    }

    void Update()
    {
        transform.position = new Vector3(icon.transform.position.x, 25f, icon.transform.position.z);//修改摄像机的位置 需要适当调整。
    }
}

再把Render Texture拖给Raw Image。

基本已经实现了如果要圆形的话给画布下的Minmap加个Mask遮罩就好了。然后再加个边框什么的。




没有更多推荐了,返回首页