Страница 1 из 1

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

СообщениеДобавлено: 16 фев 2017, 11:58
Dragon-FAST
Имеется одна сцена на ней есть две кнопки с одним и тем же скриптом:
Синтаксис:
Используется 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;), но если через эти перенимания из скрипта в скрипт - ничего не создаёт!!

Кто знает в чём дело помогите пожалуйста... Заранее спасибо!

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

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



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

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

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



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

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

Но посути ничего не изменилось:

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

СообщениеДобавлено: 16 фев 2017, 14:00
Tolking
PS - это необязательная часть.


Обязательная часть: "А почему вы думаете, что здесь переменная pers имеет ссылку на скрипт из другой сцены?"

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

СообщениеДобавлено: 16 фев 2017, 14:23
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, то-есть такие объект не удаляются при переходе на другую сцену. Почитайте об этом!

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

СообщениеДобавлено: 16 фев 2017, 15:00
Dragon-FAST
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, то-есть такие объект не удаляются при переходе на другую сцену. Почитайте об этом!

Спасибо тебе большое, теперь всё заработало!!! обязательно прочту))