//实例化一个hexGrid- public void AchieveHexGrid(HexGridItem HexGrid) { this.modelInfo = HexGrid.modelInfo; foreach (KeyValuePair <HexCoordinates, HexCellItem> keyValuePair in HexGrid.cellMap) { HexCellItem hexCellItem = keyValuePair.Value; int x = hexCellItem.X; int z = hexCellItem.Z; Vector3 position = new Vector3(); //格子中心坐标 position = HexMetrics.erectPosition(position, x, z, this.modelInfo.arrayMode); //创建一个格子实例 HexCellView cell = Instantiate <HexCellView>(cellPrefab); cell.transform.SetParent(transform, false); cell.transform.localPosition = position; cell.hexCellItem = hexCellItem; TextMeshProUGUI HexCellLabel = UtilityHelper.FindChild <TextMeshProUGUI>(cell.transform, "HexCellLabel"); HexCellLabel.text = hexCellItem.coordinates.ToStringOnSeparateLines(); cellViewMap.Add(keyValuePair.Key, cell); //Text label = Instantiate<Text>(cellLabelPrefab); //label.rectTransform.SetParent(gridCanvas.transform, false); //label.rectTransform.anchoredPosition = // new Vector2(position.x, position.y); //label.text = hexCellItem.coordinates.ToStringOnSeparateLines(); } //渲染需要放在格子生成完毕后 hexMesh.Triangulate(cellViewMap, this.modelInfo.arrayMode); }
//监听 public override void HandleNotification(INotification notification) { //处理公共请求 HandleNotificationCommon(notification); switch (notification.Name) { //划线相关 case OperateSystemEvent.OPERATE_TRAIL_DRAW: switch (notification.Type) { //划线开始 case OperateSystemEvent.OPERATE_TRAIL_DRAW_START: operateSystemView.trailDrawLine.TrailDrawStart(); break; //添加划线组件 case OperateSystemEvent.OPERATE_TRAIL_DRAW_CREATE: operateSystemView.AchieveOperateSystemView(); hexGridMediator = Facade.RetrieveMediator(HexGridMediator.NAME) as HexGridMediator; operateSystemView.trailDrawLine.OnMouseButtonUp += () => { if (operateSystemView.trailDrawLine.overVec == null) { return; } //如果没有移动只是点击也需要判断 if (operateSystemView.trailDrawLine.overVec.x == 0 && operateSystemView.trailDrawLine.overVec.y == 0 && operateSystemView.trailDrawLine.overVec.z == 0) { return; } //判断选择了什么,放在视图层做 HexCellView hexCellView = hexGridMediator.GetHexCellViewByPosition(operateSystemView.trailDrawLine.overVec); if (hexCellView != null) { //战场上哪一个格子 SendNotification(OperateSystemEvent.OPERATE_SYS, hexCellView.hexCellItem, OperateSystemEvent.OPERATE_SYS_DRAW_END_HEX); return; } Vector3 startPosition = new Vector3(); startPosition.x = 100; startPosition.z = -15; //选择了献祭区域 bool isCircuit = GeometricUtil.CheckPointInSomeRectangle(10, 10, startPosition, operateSystemView.trailDrawLine.last); if (isCircuit) { SendNotification(OperateSystemEvent.OPERATE_SYS, null, OperateSystemEvent.OPERATE_SYS_DRAW_END_CIRCUIT); return; } //还可能选择了其他目标 //如果什么都没选 SendNotification(OperateSystemEvent.OPERATE_SYS, null, OperateSystemEvent.OPERATE_SYS_DRAW_END_NULL); }; break; } break; } }
public void TouchCell(Vector3 position) { HexCellView cell = GetCellByPosition(position); if (cell != null) { cell.OnClick(); } }
//根据坐标返回所点击的cell public HexCellView GetCellByPosition(Vector3 position) { HexCellView cell = null; position = transform.InverseTransformPoint(position); if (HexUtil.CheckOnHexGrid(position, this.modelInfo)) { HexCoordinates coordinates = HexUtil.FromPosition(position, this.modelInfo); cell = cellViewMap[coordinates]; } return(cell); }
//确定顶点 void Triangulate(HexCellView cell, string arrayMode) { Vector3 center = cell.transform.localPosition; Vector3[] arrayCorners = HexMetrics.getCornersByArrayMode(arrayMode); for (int i = 0; i < 6; i++) { AddTriangle( center, center + arrayCorners[i], center + arrayCorners[i + 1] ); AddTriangleColor(Color.grey); } }