Локальные координаты объекта
| |
polous | Дата: Пятница, 01 Августа 2014, 14:23 | Сообщение # 1 |
частый гость
Сейчас нет на сайте
| Ребята-эксперты, нужна ваша помощь или подсказка. Я сгенерировал гексагональную сетку. Код на 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;
private float hexWidth; private float hexHeight;
void setSizes() { hexWidth = Hex.renderer.bounds.size.x; hexHeight = Hex.renderer.bounds.size.z;
} Vector3 calcInitPos() { Vector3 initPos; initPos = new Vector3(0, 0, 0); return initPos; } //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 + ")"); } void OnMouseExit() { transform.renderer.material.color = Color.white; } }
Сообщение отредактировал polous - Пятница, 01 Августа 2014, 14:25 |
|
| |
MANMANA | Дата: Суббота, 02 Августа 2014, 00:06 | Сообщение # 2 |
почти ветеран
Сейчас нет на сайте
| В первом скрипте: после public GameObject Hex; вставь public Vector2 gridPosExport;
после Vector2 gridPos = new Vector2(x, y); вставь gridPosExport = gridPos;
Во втором скрипте бери первый скрипт и переменную gridPosExport, которая является копией gridPos типа Vector2, т.е. у нее есть gridPosExport.x и gridPosExport.y.
firstScriptName myScript = Find("firstObjectName").GetComponent("firstScriptName") as firstScriptName; Vector2 myExportedVar = myScript.gridPosExport; //переменная со значениями из первого скрипта myExportedVar.x = myScript.gridPosExport.x;//вот и х из первого скрипта
как-то так
http://www.3dbuffer.com/ Текстуры, Unity3D, Blender: Эффекты, скрипты, моделирование, текстурирование, скульптинг VKонтакте 3Dbuffer
Последнее:
Новый раздел "Текстуры"
Как запатентовать, защитить техническое решение, игру, идею
Сообщение отредактировал MANMANA - Суббота, 02 Августа 2014, 00:06 |
|
| |
polous | Дата: Воскресенье, 03 Августа 2014, 17:15 | Сообщение # 3 |
частый гость
Сейчас нет на сайте
| Спасибо большое, MANMANA, за помощь! На буднях попробую и отпишусьДобавлено (03.08.2014, 17:15) --------------------------------------------- Я еще не пробовал предложенный вариант, т.к. проект на другом компе, но возникает следующий вопрос - неужели нельзя считать координаты уже созданного первым скриптом объекта без обращения к этому скрипту? Например, при помощи GameObject.transform.position? Это не работает здесь лишь потому, что в первом скрипте создавались не самостоятельные объекты, а копии одно? (По любому, наиглупейший вопрос но что делать, я учусь)
|
|
| |
JonLivingston | Дата: Воскресенье, 03 Августа 2014, 18:04 | Сообщение # 4 |
почетный гость
Сейчас нет на сайте
| polous, если скрипт натянут на объект, то координаты этого объекта (а так же любая другая необходимая информация) узнаются через transform.position;
Если же необходимо обратиться к любому другому объекту на сцене, то сначала ищете сам объект, потом его компонент (скрипт), а после переменную или метод этого скрипта. Схематично это выглядит так: Код Найти объект -> в нем найти скрипт -> в скрипте найти переменную В коде так: Код Find("ObjectName").GetComponent("ScriptName").ValueName; Ну, и естественно переменная должна быть public. А вообще, вопрос действительно глупый, ибо у вас даже переменные объявлены, как локальные (в теле метода). Поэтому, для начала советую почитать в целом про объектно-ориентированное программирование, а конкретно про локальные и глобальные, приватные и публичные переменные.
"Почему труднее всего на свете заставить птицу поверить в то, что она свободна?" - Ричард Бах Наша первая игра Dark Forest Let's play на Dark Forest
|
|
| |
|