刚刚接触Unity,新手入门,项目为GIS类应用,包括地图的显示,漫游和缩放等功能,记录如下:
1.新建Unity2D项目,准备好一张世界地图
2.建立空物体,命名为MapView,把上面的图片拖放到MapView下面(Scale的设置自己调整,最好高度与camera差不多,并且添加一个BoxCollider2D的组件)
显示如下:
3.接下来我们需要控制地图的缩放、漫游拖动效果,在MapView上挂载MapView.cs来控制,代码部分如下:
using System.Collections.Generic;
using UnityEngine;
public class MapView : MonoBehaviour
{
public Camera m_camera;
public float moveSpeed = 0.001f;
private Vector3 mouseFirstPos = Vector3.zero;// 鼠标第一位置点【长按拖动】
private GameObject mapview;
float camara_min = 0.001f;
float camara_max = 5f;
float aspectRatio = 1f; //屏幕宽高比
float earth_width = 1f; //地图的宽度
float earth_height = 1f;//地图的高度
float truemapscale = 1f;//实际地图与显示地图的比例
// Start is called before the first frame update
void Start()
{
aspectRatio = Screen.width * 1.0f / Screen.height;
mapview = GameObject.Find("MapView");
GameObject earth = GameObject.Find("Earth4");
BoxCollider2D box2d = earth.GetComponent
earth_width = box2d.size.x * earth.transform.localScale.x;
earth_height = box2d.size.y * earth.transform.localScale.x;
truemapscale = earth_height / 180f;
LoadAirport();
}
// Update is called once per frame
void Update()
{
if (!ExistPopups()) //PS:该部分代码可忽略,是我用来控制弹出窗体后禁用的,可不判断
{
//长按
if (Input.GetMouseButton(0) || Input.GetMouseButton(1))
{
if (mouseFirstPos != Vector3.zero && mouseFirstPos != Input.mousePosition)
{
var position = new Vector2(Input.mousePosition.x - mouseFirstPos.x, Input.mousePosition.y - mouseFirstPos.y);
if (Input.GetMouseButton(0))
{
DragMove(position);
}
mouseFirstPos = Input.mousePosition;
}
else
{
mouseFirstPos = Input.mousePosition;
}
}
//鼠标抬起事件
if (Input.GetMouseButtonUp(0) || Input.GetMouseButtonUp(1))
{
mouseFirstPos = Vector3.zero;
}
//鼠标滑轮滚动
if (Input.GetAxis("Mouse ScrollWheel") != 0)
{
float swheel = Input.GetAxis("Mouse ScrollWheel") > 0 ? 0.1f : -0.1f;
ZoomInOut(m_camera.orthographicSize - swheel * m_camera.orthographicSize / 5);
}
}
}
///
/// 鼠标拖动【相机】
///
///
void DragMove(Vector2 position)
{
float bs = 5 / m_camera.orthographicSize;
float max_x = earth_width / 2 - aspectRatio*m_camera.orthographicSize;
float move_x = position.x * moveSpeed/bs;
float newx = m_camera.transform.position.x - move_x;
if (newx >= -max_x && newx <= max_x)
{
m_camera.transform.Translate(Vector3.right * -move_x, transform);
}
float max_y = earth_height / 2 - m_camera.orthographicSize;
float move_y = position.y * moveSpeed/bs;
float newy = m_camera.transform.position.y - move_y;
if (newy >= -max_y && newy <= max_y)
{
m_camera.transform.Translate(Vector3.up * -move_y, transform);
}
}
///
/// 放大缩小【相机】
///
///
void ZoomInOut(float zoom)
{
float old_level = m_camera.orthographicSize; //原级别
if (zoom > camara_max) { zoom = camara_max; }
if (zoom < camara_min) { zoom = camara_min; }
m_camera.orthographicSize = zoom;
Vector3 nowcamera = m_camera.transform.position;
float max_x = earth_width / 2 - aspectRatio * m_camera.orthographicSize;
float max_y = earth_height / 2 - m_camera.orthographicSize;
if (nowcamera.x < -max_x) { nowcamera.x = -max_x; }
if (nowcamera.x > max_x) { nowcamera.x = max_x; }
if (nowcamera.y < -max_y) { nowcamera.y = -max_y; }
if (nowcamera.y > max_y) { nowcamera.y = max_y; }
m_camera.transform.position = nowcamera;
}
///
/// 监测是否存在弹出窗体,如果存在就禁用地图拖动和缩放功能
///
///
bool ExistPopups()
{
bool ispopups = false;
GameObject[] objs = GameObject.FindGameObjectsWithTag("Popups");
for (var i = 0; i < objs.Length; i++)
{
BasePanel panel = objs[i].GetComponent
if (panel.Isshow) { ispopups = true; break; }
}
return ispopups;
}
}
好了,地图的简易显示功能就这样了,后面我会继续更新~~~
PS:因为是新手的关系,所以代码不是很完善,后面等功能完成,会和大家一起分享代码的