Локальные координаты объекта - Форум Игроделов
Пт, 17 Май 2024, 05:15 
 
Приветствую Вас Гость Главная | Регистрация | Вход
Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум Игроделов » UNITY3D » СКРИПТИНГ » Локальные координаты объекта
Локальные координаты объекта
polousДата: Пт, 01 Авг 2014, 14:55 | Сообщение # 1
Нет аватара
 
Сообщений: 2
Награды: 0
Репутация: 0
Статус: Offline
Ребята-эксперты, нужна ваша помощь или подсказка.
Я сгенерировал гексагональную сетку. Код на 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;  
   }  
}
 
СообщениеРебята-эксперты, нужна ваша помощь или подсказка.
Я сгенерировал гексагональную сетку. Код на 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:55
ЛевшаДата: Пт, 01 Авг 2014, 18:06 | Сообщение # 2
Черный Волк
 
Сообщений: 7257
Награды: 30
Репутация: 3313
Статус: Offline
Внутриметодовую переменную получать из другого класса еще не приходилось (да и пишу я в основном на Js).
Как вариант можно ее значение отправить в нужный класс аргументом вызова метода или корутины в том классе.


X.cor.R (Prologue)
 
СообщениеВнутриметодовую переменную получать из другого класса еще не приходилось (да и пишу я в основном на Js).
Как вариант можно ее значение отправить в нужный класс аргументом вызова метода или корутины в том классе.

Автор - Левша
Дата добавления - 01 Авг 2014 в 18:06
HunjethДата: Пт, 01 Авг 2014, 22:29 | Сообщение # 3
 
Сообщений: 354
Награды: 1
Репутация: 112
Статус: Offline
Поробуй такой метод..

Код
public static class HexManagerMain {
          private Hex xescr;
          public static Hex CurrentHex {
              get { return xescr; }
              set { xescr = value; }
          }
}

//В скрипте Hex
public Vector2 gridPos;     
void OnMouseEnter() {          
HexManagerMain.CurrentHex = this;

void OnMouseExit() {    
HexManagerMain.CurrentHex = null;

//В другом скрипте
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
 
СообщениеПоробуй такой метод..

Код
public static class HexManagerMain {
          private Hex xescr;
          public static Hex CurrentHex {
              get { return xescr; }
              set { xescr = value; }
          }
}

//В скрипте Hex
public Vector2 gridPos;     
void OnMouseEnter() {          
HexManagerMain.CurrentHex = this;

void OnMouseExit() {    
HexManagerMain.CurrentHex = null;

//В другом скрипте
if (HexManagerMain.CurrentHex != null)
Debug.Log(String.Format("Hex position is ({0}, {1})", HexManagerMain.CurrentHex.gridPos.x, HexManagerMain.CurrentHex.gridPos.y));

Автор - Hunjeth
Дата добавления - 01 Авг 2014 в 22:29
polousДата: Вс, 03 Авг 2014, 11:12 | Сообщение # 4
Нет аватара
 
Сообщений: 2
Награды: 0
Репутация: 0
Статус: Offline
Ребята, огромное спасибо за советы и помощь, на буднях обязательно испробую и отпишусь о результатах
 
СообщениеРебята, огромное спасибо за советы и помощь, на буднях обязательно испробую и отпишусь о результатах

Автор - polous
Дата добавления - 03 Авг 2014 в 11:12
Форум Игроделов » UNITY3D » СКРИПТИНГ » Локальные координаты объекта
  • Страница 1 из 1
  • 1
Поиск:
Загрузка...

Game Creating CommUnity © 2009 - 2024