Ребята-эксперты, нужна ваша помощь или подсказка. Я сгенерировал гексагональную сетку. Код на C# ниже по тексту. Координаты копий гексов (Vector2 gridPos) рассчитываются в скрипте с помощью методов createGrid() и calcWorldCoord(Vector2 gridPos). Этот скрипт основной и кидается на... например, камеру. Мне нужно всего-лишь считывать эти координаты при наведении мышки и выводить в виде текста, например, в дебаг. А также подкрашивать гекс при наведении на него мышки. Но делать я это хочу из другого скрипта, который будет прикреплен к префабу гекса. Т.е., как я понимаю, мне нужно вытащить из первого скрипта из метода переменные gridPos.x и gridPos.у и использовать их во втором скрипте.... В инете много про это уже порасписано - и использование static, GetComponent, Transform, Instance и пр.... как я не пытался - не получается. Переменная gridPos видна только в рамках тех методов и как ее оттуда выудить в другой скрипт я не понимаю. Поможете новичку?) Вот код первого скрипта:
Код
using UnityEngine; using System.Collections;
public class GridManager: MonoBehaviour { public GameObject Hex;
public static int gridWidthInHexes = 100; public static int gridHeightInHexes = 100;
//method used to convert hex grid coordinates to game world coordinates public Vector3 calcWorldCoord(Vector2 gridPos) { //Position of the first hex tile Vector3 initPos = calcInitPos(); //Every second row is offset by half of the tile width float offset = 0; if (gridPos.y % 2 != 0) offset = hexWidth / 2;
float x = initPos.x + offset + gridPos.x * hexWidth; //Every new line is offset in z direction by 3/4 of the hexagon height float z = initPos.z + gridPos.y * hexHeight * 0.75f; return new Vector3(x, 0, z); }
//Finally the method which initialises and positions all the tiles void createGrid() { //Game object which is the parent of all the hex tiles GameObject hexGridGO = new GameObject("HexGrid");
for (float y = 0; y < gridHeightInHexes; y++) { for (float x = 0; x < gridWidthInHexes; x++) { //GameObject assigned to Hex public variable is cloned GameObject hex = (GameObject)Instantiate(Hex); //Current position in grid Vector2 gridPos = new Vector2(x, y); hex.transform.position = calcWorldCoord(gridPos); hex.transform.parent = hexGridGO.transform; //Debug.Log("HexClone position is (" + gridPos.x + "," + gridPos.y + ")"); } } }
void Start() { setSizes(); createGrid(); } }
А вот код второго скрипта, где я хочу вызывать координаты гексов и подкрашивать:
Код
using UnityEngine; using System.Collections;
public class Hex : MonoBehaviour {
Vector2 gridPos;
void Start () {}
void Update () {}
void OnMouseEnter() { transform.renderer.material.color = Color.yellow; Debug.Log("HexClone position is (" + gridPos.x + "," + gridPos.y + ")"); }
Внутриметодовую переменную получать из другого класса еще не приходилось (да и пишу я в основном на Js). Как вариант можно ее значение отправить в нужный класс аргументом вызова метода или корутины в том классе. X.cor.R (Prologue)
//В другом скрипте if (HexManagerMain.CurrentHex != null) Debug.Log(String.Format("Hex position is ({0}, {1})", HexManagerMain.CurrentHex.gridPos.x, HexManagerMain.CurrentHex.gridPos.y));
Сообщение отредактировал Hunjeth - Сб, 02 Авг 2014, 00:09