地形地图管理器
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class PlaneManager : MonoBehaviour
{
public Slider slider;//控制地图缩放
public Transform water;//水面
public RectTransform mapBox;//地图的容器
public Image map;//地图块
public Transform player;//玩家
public MyPlane plane;//地形块
public static int wh = 100;//地形宽高
Vector2Int pos = Vector2Int.zero;//人物当前所处地图id
Dictionary<Vector2Int, MyPlane> show = new Dictionary<Vector2Int, MyPlane>();//已经显示出来的数据
public static Dictionary<Vector2Int, Dictionary<Vector3, int>> treeDic = new Dictionary<Vector2Int, Dictionary<Vector3, int>>();//全部地图上的植物数据
Queue<MyPlane> pool = new Queue<MyPlane>();//对象池 存储不使用的物体
Dictionary<Vector2Int, Image> showImage = new Dictionary<Vector2Int, Image>();//已经显示出来的数据
Queue<Image> MapPool = new Queue<Image>();//对象池 存储不使用的物体
public static float mapp = 0;//地形与地图的大小比例
void Start()
{
//计算比例尺(用于地图和地形的坐标转换)
mapp = map.rectTransform.sizeDelta.x / (float)wh;
//计算玩家初始高度
player.transform.position = Vector3.up *( MyPlane.Turbulence(0, 0, wh) * 10);
//初始化地形
OnMove();
}
public void OnSlider()
{
//控制地图缩放
mapBox.localScale = Vector3.one * slider.value;
}
//人物移动后调用
public void OnMove()
{
//确定玩家所属地形块
pos = new Vector2Int((int)(player.position.x - wh / 2) / wh, (int)(player.position.z - wh / 2) / wh);
//获取周围9块地图
Dictionary<Rect, Vector2Int> dic = new Dictionary<Rect, Vector2Int>();
for (int i = -1; i <= 1; i++)
{
for (int j = -1; j <= 1; j++)
{
Rect rect = new Rect((i + pos.x) * wh, (j + pos.y) * wh, wh, wh);
//这里是创建所以全部添加,如果是加载需要判断有数据再添加
dic.Add(rect, new Vector2Int(i + pos.x, j + pos.y));
}
}
//玩家矩形1.5倍地图块大小,与之重叠的地形块会被创建
Rect playerRect = new Rect(player.position.x - wh / 2, player.position.z - wh / 2, wh * 1.5f, wh * 1.5f);
//循环找到需要显示的数据
List<Vector2Int> datas = new List<Vector2Int>();
foreach (var item in dic)
{
if (IsLap(playerRect, item.Key))