генератор с выбором объекта

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

генератор с выбором объекта

Сообщение Dragon-FAST 16 фев 2017, 11:58

Имеется одна сцена на ней есть две кнопки с одним и тем же скриптом:
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class SelectPers : MonoBehaviour {
        public int pers = 0;
        public bool ray = false;
        public bool sheena = false;
        public bool back = false;
        public void OnMouseUp(){
                if (ray == true){
                        pers = 1;
                        Application.LoadLevel(5);
                }
                if (sheena == true){
                        pers = 2;
                        Application.LoadLevel(5);
                }
                if (back == true){
                        pers = 0;
                        Application.LoadLevel(0);
                }
        }
}
 

и переменная pers нажав на одну pers становится = 1, на другую =2.
на этой же сцене пустой объект, который объединяет две кнопки вместе, со скриптом:
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class pers : MonoBehaviour {
        public int person = 0;
        public SelectPers selectSheena;
        public SelectPers selectRoy;
        public void Update(){
                person = selectSheena.pers;
                if (person == 1) {
                }
                if (person == 2) {
                        person = selectRoy.pers;
                }
        }
}
 

и имеется на другой сцене (загружается через одну) пустой объект со скриптом:
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class generator : MonoBehaviour {
        public pers pers;
        public int personas = 0;
        public Transform generators;
        public GameObject sheena;
        public GameObject roy;
        void Start () {
                personas = pers.person;
                if (personas == 1) {
                        GameObject sheen = Instantiate<GameObject>(sheena);
                        sheen.transform.position = generators.position;
                }
                if (personas == 2) {
                        GameObject ray = Instantiate<GameObject>(roy);
                        ray.transform.position = generators.position;
                }
        }
}
 

он генерирует префабы в зависимости от personas которая перенимает значение у person (скрипт pers), а та у pers (скрипт SelectPers).
----------------------
По сути если переменную personas вручную менять из инспектора то создаётся всё правильно (при этом убрать: personas = pers.person;), но если через эти перенимания из скрипта в скрипт - ничего не создаёт!!

Кто знает в чём дело помогите пожалуйста... Заранее спасибо!
Аватара пользователя
Dragon-FAST
UNIт
 
Сообщения: 92
Зарегистрирован: 15 авг 2016, 08:29

Re: генератор с выбором объекта

Сообщение samana 16 фев 2017, 12:39

Dragon-FAST писал(а):и имеется на другой сцене (загружается через одну) пустой объект со скриптом:
Синтаксис:
Используется csharp
public class generator : MonoBehaviour {
        public pers pers; // <----???



А почему вы думаете, что здесь переменная pers имеет ссылку на скрипт из другой сцены?
p.s. имена классов принято писать с заглавной буквы (Pers).
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: генератор с выбором объекта

Сообщение Dragon-FAST 16 фев 2017, 13:37

samana писал(а):
Dragon-FAST писал(а):и имеется на другой сцене (загружается через одну) пустой объект со скриптом:
Синтаксис:
Используется csharp
public class generator : MonoBehaviour {
        public pers pers; // <----???



А почему вы думаете, что здесь переменная pers имеет ссылку на скрипт из другой сцены?
p.s. имена классов принято писать с заглавной буквы (Pers).

Я исправил:
Синтаксис:
Используется csharp
public class generator : MonoBehaviour {
        public Pers pers;

Но посути ничего не изменилось:
Аватара пользователя
Dragon-FAST
UNIт
 
Сообщения: 92
Зарегистрирован: 15 авг 2016, 08:29

Re: генератор с выбором объекта

Сообщение Tolking 16 фев 2017, 14:00

PS - это необязательная часть.


Обязательная часть: "А почему вы думаете, что здесь переменная pers имеет ссылку на скрипт из другой сцены?"
Ковчег построил любитель, профессионалы построили Титаник.
Аватара пользователя
Tolking
Адепт
 
Сообщения: 2716
Зарегистрирован: 08 июн 2009, 18:22
Откуда: Тула

Re: генератор с выбором объекта

Сообщение samana 16 фев 2017, 14:23

Я немного не об этом. Вы говорите о такой ситуации, если кратко то - есть две сцены:

а) на одной сцене есть объект со скриптом (pers : MonoBehaviour), в котором вы устанавливаете какие-то нужные вам значения;
б) на другой сцене есть объект со скриптом (generator : MonoBehaviour) у которого есть свойство для класса (pers : MonoBehaviour);

то, что у сприпта generator есть такое свойство (pers) совсем не означает, что это ссылка на скрипт из первой сцены! Насколько я понял, то вы в сцене "для создания префабов" - просто перетянули из окна проекта скрипт pers в поле (pers класса genetaror), предполагая, что теперь у вас есть ссылка на такой же скрипт (pers) из первой сцены. Но это не сработает..

Что произошло???
Когда вы переходите из одной сцены в другую, то все данные из первой сцены удаляются в том числе и тот объект со скриптом pers. А в новой сцене, в скрипте generator в его поле pers просто лежит новенький экземпляр класса pers, который совершенно не связан с экземпляром pers из первой сцены.

Да, уж.. непонятное объяснение.. А что делать то???
Можно воспользоваться статикой, например сделать так

Синтаксис:
Используется csharp
public class pers : MonoBehaviour {
        public static int person = 0;


теперь это свойство будет принадлежать типу (не тому типу, который бегает у вас с оружием, а типу класса, то-есть pers). И это означает, что доступ к нему можно получить в любом месте любого скрипта, через pers.person (pers - имя класса! Сделайте его с заглавной буквы, а то можно спутать с переменной).
Теперь ваш код генератора может выглядеть вот так и это должно рабоать

Синтаксис:
Используется csharp
public class generator : MonoBehaviour
{
    public Transform generators;
    public GameObject sheena;
    public GameObject roy;
    void Start()
    {
        if (pers.person == 1)
        {
            GameObject sheen = Instantiate<GameObject>(sheena);
            sheen.transform.position = generators.position;
        }
        if (pers.person == 2)
        {
            GameObject ray = Instantiate<GameObject>(roy);
            ray.transform.position = generators.position;
        }
    }
}


-----------------------------
p.s. Обычно в игре делают такие объекты-контроллеры, которые несут всю необходимую информацию на протяжении всей игры. Это пустые объекты с нужными скриптами с пометкой DontDestroyOnLoad, то-есть такие объект не удаляются при переходе на другую сцену. Почитайте об этом!
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: генератор с выбором объекта

Сообщение Dragon-FAST 16 фев 2017, 15:00

samana писал(а):Я немного не об этом. Вы говорите о такой ситуации, если кратко то - есть две сцены:

а) на одной сцене есть объект со скриптом (pers : MonoBehaviour), в котором вы устанавливаете какие-то нужные вам значения;
б) на другой сцене есть объект со скриптом (generator : MonoBehaviour) у которого есть свойство для класса (pers : MonoBehaviour);

то, что у сприпта generator есть такое свойство (pers) совсем не означает, что это ссылка на скрипт из первой сцены! Насколько я понял, то вы в сцене "для создания префабов" - просто перетянули из окна проекта скрипт pers в поле (pers класса genetaror), предполагая, что теперь у вас есть ссылка на такой же скрипт (pers) из первой сцены. Но это не сработает..

Что произошло???
Когда вы переходите из одной сцены в другую, то все данные из первой сцены удаляются в том числе и тот объект со скриптом pers. А в новой сцене, в скрипте generator в его поле pers просто лежит новенький экземпляр класса pers, который совершенно не связан с экземпляром pers из первой сцены.

Да, уж.. непонятное объяснение.. А что делать то???
Можно воспользоваться статикой, например сделать так

Синтаксис:
Используется csharp
public class pers : MonoBehaviour {
        public static int person = 0;


теперь это свойство будет принадлежать типу (не тому типу, который бегает у вас с оружием, а типу класса, то-есть pers). И это означает, что доступ к нему можно получить в любом месте любого скрипта, через pers.person (pers - имя класса! Сделайте его с заглавной буквы, а то можно спутать с переменной).
Теперь ваш код генератора может выглядеть вот так и это должно рабоать

Синтаксис:
Используется csharp
public class generator : MonoBehaviour
{
    public Transform generators;
    public GameObject sheena;
    public GameObject roy;
    void Start()
    {
        if (pers.person == 1)
        {
            GameObject sheen = Instantiate<GameObject>(sheena);
            sheen.transform.position = generators.position;
        }
        if (pers.person == 2)
        {
            GameObject ray = Instantiate<GameObject>(roy);
            ray.transform.position = generators.position;
        }
    }
}


-----------------------------
p.s. Обычно в игре делают такие объекты-контроллеры, которые несут всю необходимую информацию на протяжении всей игры. Это пустые объекты с нужными скриптами с пометкой DontDestroyOnLoad, то-есть такие объект не удаляются при переходе на другую сцену. Почитайте об этом!

Спасибо тебе большое, теперь всё заработало!!! обязательно прочту))
Аватара пользователя
Dragon-FAST
UNIт
 
Сообщения: 92
Зарегистрирован: 15 авг 2016, 08:29


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

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

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