zoukankan      html  css  js  c++  java
  • 【Unity 3D】学习笔记29:游戏的例子——简单的小制作地图

    无论学习。只看不练是坏科学。

    因此,要总结回想这怎么生产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后:



    这仅仅是一个很很主要的样例。在后面。会慢慢学到使用unity制作的地图,而不是一个简单的平面。但主要的原理和思想是同样的,花两个贴图。依据两张图的比例来计算小地图主角位置。然后注意下主角的边界监測。

    而已。后unity学习笔记将暴露于游戏的元素在这方面的知识。

    版权声明:本文博客原创文章。博客,未经同意,不得转载。

  • 相关阅读:
    Android 开发工具类 19_NetworkStateReceiver
    Android 开发工具类 18_NetWorkUtil
    Sticky Footer (让页脚永远停靠在页面底部,而不是根据绝对位置)
    min-height最小高度的实现(兼容IE6、IE7、FF)(解决IE6不兼容min-height)
    不同浏览器设置背景透明度
    讨论内外边距对行内元素是否起作用,则要对行内替换元素和行内非替换元素分别讨论:
    超链接访问过后hover样式就不出现的问题
    解决:子元素设置margin-top,父元素也受影响的问题
    制作0.5px像素的细条
    去掉inline-block元素间隙的几种方法
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4711365.html
Copyright © 2011-2022 走看看