Как получить координаты из шестнадцатеричной карты по щелчку в Unity

#c# #unity3d #gameobject #hexagonal-tiles

#c# #unity3d #gameobject #шестиугольные плитки

Вопрос:

Я создаю настольную игру, известную как Hex. Когда я нажимаю на плитку, она меняется на синюю или желтую, но мне также нужно иметь возможность знать, каковы координаты этой плитки.

Я не могу использовать…

 rend.transform.position;
  

… потому что координаты, которые я хочу получить, выглядят аналогично этому (0,0), являющемуся нижним левым и (0,1) над ним:
введите описание изображения здесь

Координаты в консоли — это те, которые мне нужно получить.

введите описание изображения здесь

Я распечатал их, используя переменные столбца и строки, когда создавал шестнадцатеричную карту:

 using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class HexMap : MonoBehaviour
{
 // Use this for initialization
 void Start()
 {
    GenerateMap();
 }

public GameObject HexPrefab;

public void GenerateMap()
{
    for (int column = 0; column < 11; column  )
    {
        for (int row = 0; row < 11; row  )
        {
            // Instantiate a Hex
            Hex h = new Hex(column, row);

            Instantiate(HexPrefab, h.Position(), Quaternion.identity, this.transform);

            Debug.Log(column   ","   row);
        }
    }
}
}
  

Я хочу иметь возможность получать координаты при нажатии на шестнадцатеричную плитку, используя этот скрипт здесь:

 using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Net;
using UnityEngine;
using UnityEngine.Networking;

public class ColorChange : MonoBehaviour {

public Color[]colors; // allows input of material colors in a set sized array
public SpriteRenderer rend;  // what are we rendering? the hex

public enum Player {ONE, TWO};
public static Player currentPlayer = Player.ONE;

// Use this for initialization
void Start () {
    rend = GetComponent<SpriteRenderer> (); // gives functionality for the renderer
}

void NextPlayer() {

   if( currentPlayer == Player.ONE ) {
      currentPlayer = Player.TWO;
   }
   else if( currentPlayer == Player.TWO) {
      currentPlayer = Player.ONE;
   }
}

// Update is called once per frame
void OnMouseDown () {
    // if there are no colors present nothing happens
    if (colors.Length == 0)
        return;

    if (currentPlayer == Player.ONE)
        rend.color = colors [0];
    else if (currentPlayer == Player.TWO)
        rend.color = colors [1];

    NextPlayer();
}
  

Вот скрипт, который я использую, чтобы определить, где должны быть шестнадцатеричные плитки:

 using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Hex{

public Hex (int q, int r){
    this.Q = q;
    this.R = r;
}

public readonly int Q; // x
public readonly int R;  // y

static readonly float WIDTH_MULTIPLIER = Mathf.Sqrt(3) / 2;

public Vector2 Position(){
    float radius = 0.513f;
    float height = radius * 2;
    float width = WIDTH_MULTIPLIER * height;

    float vert = height * 0.75f;
    float horiz = width;

    return new Vector2(horiz * (this.Q - this.R/2f), vert * this.R);
}
}
  

Я подумал, что мне нужно иметь возможность присваивать каждой шестнадцатеричной модели значение столбца и строки при ее создании, но я не уверен, как это сделать. Я попробовал несколько решений, которые нашел в Интернете, а также с помощью GetComponent, но я не смог заставить их работать.
Если у кого-нибудь есть идея о том, как это может быть возможно, я был бы очень признателен!

Комментарии:

1. возможно, вы захотите прочитать это catlikecoding.com/unity/tutorials/hex-map/part-1

Ответ №1:

Причина, по которой GetComponent в вашем случае не работает, заключается в том, что скрипт координат находится на дочернем объекте шестнадцатеричной сборки. Вы могли бы получить доступ к компоненту дочернего объекта, вызвав GetComponentInChildren . Это выглядело бы примерно следующим образом:

 // Instantiate a Hex
Hex h = new Hex(column, row);

// Instantiate the prefab
GameObject instance = Instantiate(HexPrefab, h.Position(), Quaternion.identity, this.transform);

// Let's find the coorinates component on the hex prefab instance.
Coordinates coordinates = instance.GetComponentInChildren<Coordinates>();

// now you may assign the column and row values to it
// ...
  

Существует множество возможных подходов к этой проблеме. Но просто имейте в виду, где в иерархии сборных находятся компоненты, и все будет в порядке.

Комментарии:

1. Спасибо, это сработало! Вы знаете, как я мог бы использовать эти координаты, чтобы найти соответствующий шестнадцатеричный игровой объект? Потому что после отправки этих координат на сервер я собираюсь получить другую пару координат для хода, который делает искусственный интеллект, и мне нужно отметить на доске, где находятся эти координаты.