152 lines
3.7 KiB
C#
152 lines
3.7 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using UnityEngine;
|
|
|
|
public class JiugongGridSegmentation : MonoBehaviour {
|
|
|
|
/// <summary>
|
|
/// 地形
|
|
/// </summary>
|
|
public Terrain Terrain;
|
|
/// <summary>
|
|
/// 角色Transform
|
|
/// </summary>
|
|
public Transform Target;
|
|
/// <summary>
|
|
/// 角色位置
|
|
/// </summary>
|
|
public Vector2 PlayerPos;
|
|
/// <summary>
|
|
/// 当前实时位置标号
|
|
/// </summary>
|
|
public Vector2 CalPos;
|
|
|
|
/// <summary>
|
|
/// 格子尺寸
|
|
/// </summary>
|
|
public Vector2 GridSize = new Vector2(10, 10);
|
|
/// <summary>
|
|
/// 当前所在标号
|
|
/// </summary>
|
|
public byte[] CenterIndex = new byte[2];
|
|
/// <summary>
|
|
/// 当前所在格子
|
|
/// </summary>
|
|
public Rect CurrentRect;
|
|
/// <summary>
|
|
/// 格子列表
|
|
/// </summary>
|
|
public List<Rect> GridRects = new List<Rect>();
|
|
/// <summary>
|
|
/// 格子标号与位置信息
|
|
/// </summary>
|
|
public Dictionary<byte[],Rect> CellRects = new Dictionary<byte[], Rect>();
|
|
|
|
|
|
private Coroutine SelfInfoCoroutine; //更新坐标协程
|
|
private Vector2 TerrainPosition; //地形坐标
|
|
private float XCount; //X方向格子数量
|
|
private float ZCount; //Z方向格子数量
|
|
// Use this for initialization
|
|
void Start () {
|
|
Terrain = FindObjectOfType<Terrain>();
|
|
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);
|
|
}
|
|
/// <summary>
|
|
/// 生成格子
|
|
/// </summary>
|
|
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
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 生成测试方块
|
|
/// </summary>
|
|
/// <param name="pos"></param>
|
|
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);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取自身位置信息
|
|
/// </summary>
|
|
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);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 更新位置协程
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
IEnumerator UpdateSelfPosInfo()
|
|
{
|
|
while (true)
|
|
{
|
|
yield return new WaitForSeconds(1);
|
|
GetSelfPosInfo();
|
|
}
|
|
}
|
|
}
|