Проблема инициализацией RectTransform

Программирование на Юнити.

Проблема инициализацией RectTransform

Сообщение Ancloosee 21 май 2017, 12:20

Итак всем Привет
Очередная проблема связанна с инициализацией RectTransform
Имеется класс который содержит свойство RectTransform
Синтаксис:
Используется csharp
public class BoardElements:MonoBehaviour
{

    public string Name { get;  set; }
    public RectTransform Position { set; get; }
    public Image Images { set; get; }

    public BoardProperty boardProterty { get; set; }
    public BoardCard boardCard { set; get; }
    public BoardPayOnly boardPayOnly { set; get; }
    public BoardSingleProperty boardSingleProperty { set; get; }

    public BoardElements(string name,string path,BoardProperty boardProterty = null,BoardCard boardCard = null,
        BoardPayOnly boardPayOnly = null,BoardSingleProperty boardSingleProperty = null)
    {
        Name = name;

        this.boardCard = boardCard;
        this.boardPayOnly = boardPayOnly;
        this.boardProterty = boardProterty;
        this.boardSingleProperty = boardSingleProperty;

        this.Images = GameObject.Find("Board").GetComponent<Image>();
        Images.sprite = Resources.Load<Sprite>(path);

        Position = new RectTransform();
//ради эксперимента
        Position.anchorMax = new Vector2();
        Position.anchorMin = new Vector2();
     
    }
}
 


В другой классе программы мы инициализируем один объект этого класса
Синтаксис:
Используется csharp

 RectTransform tmpTransform = GameObject.Find("Board").GetComponent<RectTransform>();

        boardElements[0].Position.anchorMax = new Vector2(tmpTransform.anchorMax.x, tmpTransform.anchorMin.y + 0.1f);
        boardElements[0].Position.anchorMin = new Vector2(tmpTransform.anchorMax.x - 0.1f, tmpTransform.anchorMin.y);
 


И у нас выскакивает нулреференсексепшин

UnityEngine.RectTransform.set_anchorMax (Vector2 value) (at C:/buildslave/unity/build/artifacts/generated/common/runtime/RectTransformBindings.gen.cs:122)
BoardElements..ctor (System.String name, System.String path, .BoardProperty boardProterty, .BoardCard boardCard, .BoardPayOnly boardPayOnly, .BoardSingleProperty boardSingleProperty) (at Assets/Scripts/BasicClass/BoardElements.cs:38)

Что не так??Я уже ради эксперимента и просто в конструкторе присваивал ему Вектор 2 пустой,тогда вылетает там

Помогите пожалуйста разобраться
Ancloosee
UNец
 
Сообщения: 25
Зарегистрирован: 27 янв 2017, 11:53

Re: Проблема инициализацией RectTransform

Сообщение samana 21 май 2017, 12:43

Я просто скажу о том, что я думаю по этому поводу
- помню, что не советуют делать конструкторы у MonoBehaviour
- RectTransform должен быть добавлен как компонент, а не просто создаваться с помощью new
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Проблема инициализацией RectTransform

Сообщение Ancloosee 21 май 2017, 13:21

Да понял, повесил пустой элемент и присвоил потом от него все

А такой еще вопрос можно как то весь RectTransform присвоить
типа
Синтаксис:
Используется csharp
tmp.GetComponent<RectTransform>()  = boardElements[0].Position;
 


Оно не работает, можно как то все сразу?
Ancloosee
UNец
 
Сообщения: 25
Зарегистрирован: 27 янв 2017, 11:53

Re: Проблема инициализацией RectTransform

Сообщение samana 21 май 2017, 13:30

Ancloosee писал(а):А такой еще вопрос можно как то весь RectTransform присвоить
типа
Синтаксис:
Используется csharp
tmp.GetComponent<RectTransform>()  = boardElements[0].Position;
 
Оно не работает, можно как то все сразу?


Нет, вы не можете просто взять и присвоить компоненту другой компонент. Я не знаю, что хранится у вас в boardElements[0].Position, поэтому ответить сложно. Попробуйте установить свойство через tmp.GetComponent<RectTransform>().rect = какой-то другой rect.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Проблема инициализацией RectTransform

Сообщение Ancloosee 21 май 2017, 13:44

Не хочет
в Position - RectTransform
Синтаксис:
Используется csharp
 tmp.GetComponent<RectTransform>().rect  = boardElements[0].Position.rect;
 

пишет из рид онли
Ancloosee
UNец
 
Сообщения: 25
Зарегистрирован: 27 янв 2017, 11:53

Re: Проблема инициализацией RectTransform

Сообщение samana 21 май 2017, 13:54

Даже не знаю, это надо самому попробовать, чтобы лишний раз не давать пустых советов, но открывать Unity не хочется. Возможно тогда нужно обращаться ко свойствам rect-а напрямую tmp.GetComponent<RectTransform>().rect.x = ... и т.д.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Проблема инициализацией RectTransform

Сообщение seaman 21 май 2017, 19:21

Надо понимать, что rect - это не поле, а свойство. Там внутри рассчитывается этот самый rect. Причем рассчитывается функцией на плюсах. Так что даже изменив rect.x Вы ничего не измените. При следующем обращении к retc оно наплюет на то,что Вы изменили и просто посчитает его заново.
Нужно менять не rect, а как я понимаю анкоры, на основе которых считается рект.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Проблема инициализацией RectTransform

Сообщение Ancloosee 22 май 2017, 10:06

Спасибо за ответы, вроде разобрался, но опять возникает проблема

Есть функция Start
Синтаксис:
Используется csharp
[syntax=csharp]
 initBoardElements();
        initBoardElementsPosition();

   

        boardElements[0].setPositionsInTheCase(Interface.GetIterface().PlayersLogo);
[/syntax]



Синтаксис:
Используется csharp
Вот функция которая там вызывается
 private void initBoardElementsPosition()
    {
        int index = 0;
        //init first Board element
        boardElements[index].Position.anchorMax = new Vector2(1, GameObject.Find("Board").GetComponent<RectTransform>().anchorMin.y + 0.13f);
        boardElements[index].Position.anchorMin = new Vector2(GameObject.Find("Board").GetComponent<RectTransform>().anchorMax.x+0.09f, 0);

//это вообще не нужно, только для того что бы посмотреть на карте правильно ли разместилось
        GameObject tmp = new GameObject("TMP");
        tmp.transform.SetParent(GameObject.Find("Board").transform);
        tmp.AddComponent<RectTransform>();
        tmp.GetComponent<RectTransform>().anchorMax = boardElements[index].Position.anchorMax;
        tmp.GetComponent<RectTransform>().anchorMin = boardElements[index].Position.anchorMin;

 

Вот проходим мы отладчиком и видим какие значения присваиваются
AnctorMax.x=1,AnctorMax.y=0.1,
AnctorMin.x=0.86,AnctorMin.y=0

Потом в следующей функции(setPositionsInTheCase)
Мы должны расположить всех игроков которые присутствуют в клетке

Синтаксис:
Используется csharp
 public void setPositionsInTheCase(List<GameObject> playersLogo)
    {
        Count = playersLogo.Count;
        float length=(Position.anchorMax.x-Position.anchorMin.x)/Count;
        float width=(Position.anchorMax.y-Position.anchorMin.y)/Count;


        for (int i = 0; i < playersLogo.Count; i++)
        {
            //first element
            if(i==0)
            {
                playersLogo[i].GetComponent<RectTransform>().anchorMax = new Vector2(Position.anchorMax.x, Position.anchorMin.y + width);
                playersLogo[i].GetComponent<RectTransform>().anchorMin = new Vector2(Position.anchorMax.x - length, Position.anchorMin.y);
                playersLogo[i].GetComponent<RectTransform>().transform.localPosition = Vector3.zero;
                playersLogo[i].GetComponent<RectTransform>().offsetMax = new Vector2(0, 0);
                playersLogo[i].GetComponent<RectTransform>().offsetMin = new Vector2(0, 0);
            }
            //even element
            else if(i%2==0)
            {
                playersLogo[i].GetComponent<RectTransform>().anchorMax = new Vector2(playersLogo[i - 2].GetComponent<RectTransform>().anchorMin.x, playersLogo[i - 2].GetComponent<RectTransform>().anchorMax.y);
                playersLogo[i].GetComponent<RectTransform>().anchorMin = new Vector2(playersLogo[i - 2].GetComponent<RectTransform>().anchorMin.x-length, playersLogo[i - 2].GetComponent<RectTransform>().anchorMax.y);
                playersLogo[i].GetComponent<RectTransform>().transform.localPosition = Vector3.zero;
                playersLogo[i].GetComponent<RectTransform>().offsetMax = new Vector2(0, 0);
                playersLogo[i].GetComponent<RectTransform>().offsetMin = new Vector2(0, 0);
            }
            //odd element
            else if(i%2!=0)
            {
                playersLogo[i].GetComponent<RectTransform>().anchorMax = new Vector2(playersLogo[i-1].GetComponent<RectTransform>().anchorMax.x, playersLogo[i - 1].GetComponent<RectTransform>().anchorMax.y+width);
                playersLogo[i].GetComponent<RectTransform>().anchorMin = new Vector2(playersLogo[i - 1].GetComponent<RectTransform>().anchorMin.x, playersLogo[i - 1].GetComponent<RectTransform>().anchorMax.y);
                playersLogo[i].GetComponent<RectTransform>().transform.localPosition = Vector3.zero;
                playersLogo[i].GetComponent<RectTransform>().offsetMax = new Vector2(0, 0);
                playersLogo[i].GetComponent<RectTransform>().offsetMin = new Vector2(0, 0);
            }


        }
    }
 

Так вот когда мы тут проходим отладчиком, то тот же Position имеет совсем другие значения
AnctorMax.x=1,AnctorMax.y=0.23,
AnctorMin.x=0.86,AnctorMin.y=15,

Почему значения не что мы в функции initBoardElementsPosition() присваивали не сохранились?
Ancloosee
UNец
 
Сообщения: 25
Зарегистрирован: 27 янв 2017, 11:53


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8