Понедельник, 21 Октября 2019, 07:36

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Модератор форума: beril  
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Локальные координаты объекта
Локальные координаты объекта
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? Это не работает здесь лишь потому, что в первом скрипте создавались не самостоятельные объекты, а копии одно? (По любому, наиглупейший вопрос smile но что делать, я учусь)

JonLivingstonДата: Воскресенье, 03 Августа 2014, 18:04 | Сообщение # 4
почетный гость
Сейчас нет на сайте
polous, если скрипт натянут на объект, то координаты этого объекта (а так же любая другая необходимая информация) узнаются через transform.position;

Если же необходимо обратиться к любому другому объекту на сцене, то сначала ищете сам объект, потом его компонент (скрипт), а после переменную или метод этого скрипта. Схематично это выглядит так:
Код
Найти объект -> в нем найти скрипт -> в скрипте найти переменную

В коде так:
Код
Find("ObjectName").GetComponent("ScriptName").ValueName;

Ну, и естественно переменная должна быть public. А вообще, вопрос действительно глупый, ибо у вас даже переменные объявлены, как локальные (в теле метода). Поэтому, для начала советую почитать в целом про объектно-ориентированное программирование, а конкретно про локальные и глобальные, приватные и публичные переменные.


"Почему труднее всего на свете заставить птицу поверить в то, что она свободна?" - Ричард Бах
Наша первая игра Dark Forest
Let's play на Dark Forest
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Локальные координаты объекта
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2019 Рейтинг