using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
public class JiugongGridSegmentation : MonoBehaviour {
///
/// 地形
///
public Terrain Terrain;
///
/// 角色Transform
///
public Transform Target;
///
/// 角色位置
///
public Vector2 PlayerPos;
///
/// 当前实时位置标号
///
public Vector2 CalPos;
///
/// 格子尺寸
///
public Vector2 GridSize = new Vector2(10, 10);
///
/// 当前所在标号
///
public byte[] CenterIndex = new byte[2];
///
/// 当前所在格子
///
public Rect CurrentRect;
///
/// 格子列表
///
public List GridRects = new List();
///
/// 格子标号与位置信息
///
public Dictionary CellRects = new Dictionary();
private Coroutine SelfInfoCoroutine; //更新坐标协程
private Vector2 TerrainPosition; //地形坐标
private float XCount; //X方向格子数量
private float ZCount; //Z方向格子数量
// Use this for initialization
void Start () {
Terrain = FindObjectOfType();
TerrainPosition = new Vector2(Terrain.GetPosition().x, Terrain.GetPosition().z);
Generate();
SelfInfoCoroutine = StartCoroutine(UpdateSelfPosInfo());
}
// Update is called once per frame
void Update()
{
if (Target != null) {
PlayerPos = new Vector2(Target.position.x, Target.position.z);
CalPos = new Vector2(Mathf.FloorToInt((PlayerPos.x - TerrainPosition.x) / 10), Mathf.FloorToInt((PlayerPos.y - TerrainPosition.y) / 10));
}
}
void OnDestroy() {
StopCoroutine(SelfInfoCoroutine);
}
///
/// 生成格子
///
public void Generate()
{
float xwidth = Terrain.terrainData.size.x;
float zwidth = Terrain.terrainData.size.z;
Vector2 terrainPosxz = new Vector2(TerrainPosition.x, TerrainPosition.y); //起始位置
XCount = xwidth / GridSize.x;
ZCount = zwidth / GridSize.y;
for (int i = 0; i < ZCount; i++)
{
for (int j = 0; j < XCount; j++)
{
Vector2 pos = new Vector2(terrainPosxz.x + GridSize.x * j, terrainPosxz.y + GridSize.y * i);
Rect rect = new Rect(pos, GridSize);
GridRects.Add(rect);
CellRects.Add(new byte[2] { ((byte)j), ((byte)i) }, rect);
#if UNITY_EDITOR
TestCube(pos);
#endif
}
}
}
///
/// 生成测试方块
///
///
private void TestCube(Vector2 pos)
{
GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
Vector3 position = new Vector3(pos.x, 0, pos.y);
position.y = Terrain.activeTerrain.SampleHeight(position);
cube.transform.position = position;
cube.transform.localScale = Vector3.one;
cube.transform.SetParent(this.transform);
}
///
/// 获取自身位置信息
///
public void GetSelfPosInfo()
{
if (Target == null) return;
Vector2 currentPos = new Vector2(Target.position.x, Target.position.z);
for (int i = 0; i < GridRects.Count; i++)
{
//得到当前Rect
if (GridRects[i].Contains(currentPos))
{
CurrentRect = GridRects[i];
//找到当前Rect对应的序号
var current = CellRects.FirstOrDefault(rect => rect.Value.Equals(CurrentRect));
CenterIndex = current.Key;
break;
}
}
}
public float GetTerrainHeight(Vector3 pos)
{
return Terrain.SampleHeight(pos);
}
///
/// 更新位置协程
///
///
IEnumerator UpdateSelfPosInfo()
{
while (true)
{
yield return new WaitForSeconds(1);
GetSelfPosInfo();
}
}
}