JinChanChan/Assets/Scripts/Hexagon/HexGrid.cs

110 lines
2.8 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System;
using UnityEngine;
using Random = UnityEngine.Random;
public class HexGrid : MonoBehaviour
{
/// <summary>
/// 格子宽度
/// </summary>
public int width = 6;
/// <summary>
/// 格子高度
/// </summary>
public int height = 6;
/// <summary>
/// 格子实例预制体(用于实际角色放入交互,也有可能会删掉改用判断位置的方式处理交互)
/// </summary>
public HexCell cellPrefab;
/// <summary>
/// 六边形渲染mesh
/// </summary>
HexMesh hexMesh;
/// <summary>
/// 格子存储
/// </summary>
HexCell[] cells;
public Color defaultColor = Color.white;
public Color touchedColor = Color.magenta;
void Awake()
{
hexMesh = GetComponentInChildren<HexMesh>();
cells = new HexCell[height * width];
for (int z = 0, i = 0; z < height; z++)
{
for (int x = 0; x < width; x++)
{
CreateCell(x, z, i++);
}
}
}
private void Start()
{
// 渲染mesh
hexMesh.Triangulate(cells);
}
/// <summary>
/// 创建格子以及实例
/// </summary>
/// <param name="x"></param>
/// <param name="z"></param>
/// <param name="i"></param>
void CreateCell(int x, int z, int i)
{
Vector3 position;
position.x = (x + z * 0.5f - z / 2) * (HexMetrics.innerRadius * 2f);
position.y = 0f;
position.z = HexMetrics.offset * z;
HexCell cell = cells[i] = Instantiate<HexCell>(cellPrefab);
cell.transform.SetParent(transform, false);
cell.transform.localPosition = position;
cell.coordinates = HexCoordinates.FromOffsetCoordinates(x, z);
cell.color = new Color(Random.Range(0, 1f), Random.Range(0, 1f), Random.Range(0, 1f), 1);
}
private void Update()
{
if (Input.GetMouseButtonDown(0))
{
HandleInput();
}
}
/// <summary>
/// 射线检测拿到射线点然后传递给TouchCell进行实际位置判断
/// </summary>
void HandleInput()
{
Ray inputRay = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(inputRay, out hit))
{
TouchCell(hit.point);
}
}
/// <summary>
/// 判断点击的哪个格子
/// </summary>
/// <param name="position"></param>
public void TouchCell(Vector3 position)
{
// 将 position 从世界空间变换到本地空间
position = transform.InverseTransformPoint(position);
HexCoordinates coordinates = HexCoordinates.FromPosition(position);
int index = coordinates.X + coordinates.Z * width + coordinates.Z / 2;
HexCell cell = cells[index];
cell.color = touchedColor;
hexMesh.Triangulate(cells);
}
}