Проблема с Random

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Проблема с Random

Сообщение Huruffus 16 июл 2012, 00:10

прошу прощения что вклиниваюсь в чужую тему, но у меня проблема с Рендомом.
Дело в том, что в моём скрипте случайногенерируемая переменная генерируется в void Start(). По идеи оно должно генерироваться один раз, но в моём случае генерится каждый раз, когда я нажимаю на кнопку.
Посмотрите пожалуйста скрипт. В чём дело, почему генерится несколько раз?

Это скрипт по передвижению объектов в пустое место. За расположение пустого места отвечает случайно сгенерированная переменная. Как в головоломке (скрин сцены прикреплен).
Всего в сцене 16 кнопок.

Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class SmartChangePosition : MonoBehaviour {
        private float dx, dz;   //переменные разницы векторов
        private GameObject Empty, State; //объекты с одноимёнными тегами
        private Vector3 polozhenie;
        private Vector3 polozhenieEmpty;
        private string Tag;
                private int RandomValue;
        private int RandomObject;
        void Start ()  {
                        RandomValue = Random.Range(1, 16); //генерируем случайное число
                                                                                                //но каждый раз при нажатии ЛКМ генерируется новое. Почему?
                                                                                                //Генерирование происходит в методе Start. Тогда почему генерится новое?
                if (RandomValue == 1) Tag = "E1"; //сравниваем генерированное число с цифрой, символизирующей один из 16 тегов
                if (RandomValue == 2) Tag = "E2";
                if (RandomValue == 3) Tag = "E3";
                if (RandomValue == 4) Tag = "E4";
                if (RandomValue == 5) Tag = "E5";
                if (RandomValue == 6) Tag = "E6";
                if (RandomValue == 7) Tag = "E7";
                if (RandomValue == 8) Tag = "E8";
                if (RandomValue == 9) Tag = "E9";
                if (RandomValue == 10) Tag = "E10";
                if (RandomValue == 11) Tag = "E11";
                if (RandomValue == 12) Tag = "E12";
                if (RandomValue == 13) Tag = "E13";
                if (RandomValue == 14) Tag = "E14";
                if (RandomValue == 15) Tag = "E15";
                if (RandomValue == 16) Tag = "E16";
                //if (RandomValue == RandomObject) Tag = "E" + RandomObject;
        }
        void Update ()  {
        }
       
        void OnMouseDown(){
                if (Input.GetMouseButton(0)){ //при нажатии на ЛКМ происходят следующие действия -->
                        GameObject Empty = GameObject.FindWithTag(Tag); //объекту Empty приписывается один из 16 тегов
                        Empty.renderer.enabled = false; //Делаем объект Empty невидимым
                        Empty.collider.enabled = false; //активируем коллайдер объекта Empty
                                               
                        dx = transform.position.x - Empty.transform.position.x; //вычисляем разницу в "Х" координатах между активным объектом и объектом Empty
                        dz = transform.position.z - Empty.transform.position.z; //вычисляем разницу в "Z" координатах между активным объектом и объектом Empty
                        if (dx == -1) //Если разница "Х" получается отрицательной -->
                        dx *= -1;         //то преобразуем её в положительную, для того, чтобы не путаться. Расстояние только положительное
                        if (dz == -1) //Если разница "Z" получается отрицательной -->
                        dz *= -1;     //то преобразуем её в положительную, для того, чтобы не путаться. Расстояние только положительное
                       
                        if ((dx == 1)&(dz == 0)){   //условие для последующих действий с объектом (кнопкой). Разрешаем передвигать только
                                                                                //соседние объекты рядом с объектом Empty
                                gameObject.tag = "Untagged";
                                gameObject.tag = "State"; //задаём активному объекту (Кнопке) тег State
                        GameObject State = GameObject.FindWithTag("State"); //вгоняем активный объект с тегом State в переменную
                        polozhenie = State.transform.position; //приравниваем переменную к позиции активного объекта
                                transform.position = Empty.transform.position; //Кнопка становится на позицию "Empty"
                                Empty.transform.position = polozhenie; //невидимый объект Empty переходит на позицию Кнопки
                                                                                                           //Т.Е. они ПОМЕНЯЛИСЬ местами 
                                gameObject.tag = "Untagged"; //удаляем тег активного объекта (Кнопки), чтобы мы могли назначить его другой кнопке.
                                                                                        //если в сцене возникнет два объекта с одинаковыми тегами, скрипт будет работать некорректно
                        }
                        if ((dz == 1)&(dx == 0)){       //условие для последующих действий с объектом (кнопкой). Разрешаем передвигать только
                                                                                //соседние объекты рядом с объектом Empty
                                gameObject.tag = "Untagged";
                                gameObject.tag = "State"; //задаём активному объекту (Кнопке) тег State
                        GameObject State = GameObject.FindWithTag("State"); //вгоняем активный объект с тегом State в переменную
                        polozhenie = State.transform.position; //приравниваем переменную к позиции активного объекта
                                transform.position = Empty.transform.position; //Кнопка становится на позицию "Empty"
                                Empty.transform.position = polozhenie; //невидимый объект Empty переходит на позицию Кнопки
                                                                                                           //Т.Е. они ПОМЕНЯЛИСЬ местами 
                                gameObject.tag = "Untagged"; //удаляем тег активного объекта (Кнопки), чтобы мы могли назначить его другой кнопке.
                                                                                        //если в сцене возникнет два объекта с одинаковыми тегами, скрипт будет работать некорректно
                        }
                }
        }
}
 
_ttp://rebirthgame.tumblr.com/
@jonarhipov
vk.com/jonarhipov
_jonarhipov@gmail.com
Huruffus
UNITрон
 
Сообщения: 174
Зарегистрирован: 02 июл 2012, 20:53
  • Сайт

Re: Проблема с Random

Сообщение DobrijZmej 16 июл 2012, 00:51

а точно ли генерируется новое ? если через Debug.Log наблюдать за ним в Update() например - оно меняется ?
Аватара пользователя
DobrijZmej
UNIт
 
Сообщения: 146
Зарегистрирован: 03 июл 2012, 20:38

Re: Проблема с Random

Сообщение M.A.K. 16 июл 2012, 10:37

имхо если оно и меняется, то меняется где-то не из этого скрипта. Я записи в RandomValue ровно как и его использования не в старте не нашел. А скрипт выключается/включается откуда-нибудь? Если да, то при каждом таком включении отрабатывает Start() и следовательно генерит новое случайное число.
M.A.K.
UNец
 
Сообщения: 42
Зарегистрирован: 16 июн 2011, 12:02

Re: Проблема с Random

Сообщение Nicloay 16 июл 2012, 11:06

Кот у тебя просто сногсшибительный. =).
РАсскажи на что ты его вешаешь и как


Скрытый текст:
вот эту кашу убери и сделай одну конкатенацию
if (RandomValue == 4) Tag = "E4";
if (RandomValue == 5) Tag = "E5";
if (RandomValue == 6) Tag = "E6";
if (RandomValue == 7) Tag = "E7";
if (RandomValue == 8) Tag = "E8";
if (RandomValue == 9) Tag = "E9";



gameObject.tag = "Untagged"; // зачем это делать если дальше он будет State
gameObject.tag = "State";
GameObject State = GameObject.FindWithTag("State"); //зачем это делать если это gameObject по ссылке выше


По поводу 2х ифов - сделай один - у тебя вроде код там одинаковый

If (((dx == 1)&&(dz == 0))||((dz == 1)&(dx == 0)))


судя по коду, это пятнашки ?
If you wish to make an apple pie from scratch, you must first invent the universe.(Carl Sagan, Cosmos)
| My Asset Store | coloring book | github | _wiki.unity3d.com | twitter | linkedin |
Аватара пользователя
Nicloay
Адепт
 
Сообщения: 1288
Зарегистрирован: 31 май 2012, 09:27
Откуда: Альпс
  • Сайт

Re: Проблема с Random

Сообщение waruiyume 16 июл 2012, 11:49

M.A.K. писал(а):...при каждом таком включении отрабатывает Start() и следовательно генерит новое случайное число.

Пруфф?
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Проблема с Random

Сообщение Huruffus 16 июл 2012, 11:50

Спасибо DobrijZmej, я понял почему генерируется новое. Так как у меня 16 кнопок и на каждую повешен этот скрипт, то получается у каждой кнопки генерится разное число! :) Надеюсь, что так (как допишу пост сяду проверять)

M.A.K., запись RandomValue была нужна, чтобы избавиться от 16 if, но так как скрипт работал неправильно, я упростил эту конструкцию.

Nicloay, какой есть)) Шучу, править буду эту лабуду. RandomValue было нужно, чтоб упростить код. Там даже кусок неиспользуемого кода есть ( (RandomValue == RandomObject) Tag = "E" + RandomObject;). Он нужен был, чтобы избавиться от if'оф.
Спасибо, что переписал условие (c dx, dz) :)
_ttp://rebirthgame.tumblr.com/
@jonarhipov
vk.com/jonarhipov
_jonarhipov@gmail.com
Huruffus
UNITрон
 
Сообщения: 174
Зарегистрирован: 02 июл 2012, 20:53
  • Сайт

Re: Проблема с Random

Сообщение Huruffus 16 июл 2012, 11:52

такая игра. в самом начале исчезает одна кнопка
У вас нет доступа для просмотра вложений в этом сообщении.
_ttp://rebirthgame.tumblr.com/
@jonarhipov
vk.com/jonarhipov
_jonarhipov@gmail.com
Huruffus
UNITрон
 
Сообщения: 174
Зарегистрирован: 02 июл 2012, 20:53
  • Сайт

Re: Проблема с Random

Сообщение Nicloay 16 июл 2012, 12:03

Huruffus писал(а):Спасибо DobrijZmej, я понял почему генерируется новое. Так как у меня 16 кнопок и на каждую повешен этот скрипт, то получается у каждой кнопки генерится разное число! :) Надеюсь, что так (как допишу пост сяду проверять)


Я бы так не сказал, если хочешь чтоб каждой было разное число тебе нужно проинициализировать массив значений, а потом его перетасовать,
Синтаксис:
Используется csharp
void reshuffle(string[] texts)

    {

        // Knuth shuffle algorithm :: courtesy of Wikipedia <img src="./images/smilies/1.gif" alt=":)" title="Happy" />

        for (int t = 0; t < texts.Length; t++ )

        {

            string tmp = texts[t];

            int r = Random.Range(t, texts.Length);

            texts[t] = texts[r];

            texts[r] = tmp;

        }

    }

ну и потом брать значения массива по индексу.
If you wish to make an apple pie from scratch, you must first invent the universe.(Carl Sagan, Cosmos)
| My Asset Store | coloring book | github | _wiki.unity3d.com | twitter | linkedin |
Аватара пользователя
Nicloay
Адепт
 
Сообщения: 1288
Зарегистрирован: 31 май 2012, 09:27
Откуда: Альпс
  • Сайт

Re: Проблема с Random

Сообщение Huruffus 16 июл 2012, 12:31

но я не хочу чтоб у меня было у каждой кнопки разное число :)
_ttp://rebirthgame.tumblr.com/
@jonarhipov
vk.com/jonarhipov
_jonarhipov@gmail.com
Huruffus
UNITрон
 
Сообщения: 174
Зарегистрирован: 02 июл 2012, 20:53
  • Сайт

Re: Проблема с Random

Сообщение M.A.K. 16 июл 2012, 12:53

Что-то про то что скриптов 15 и каждый генерит себе случайное число я не подумал...
M.A.K.
UNец
 
Сообщения: 42
Зарегистрирован: 16 июн 2011, 12:02

Re: Проблема с Random

Сообщение Huruffus 16 июл 2012, 13:30

Решил сделать так: часть кода, которая находится в Start(), перенести в новый скрипт. Он будет подбирать случайный тег. Затем этот тег буду использовать в первом скрипте.
В новом скрипте я создал объект, в элементами которого происходят операции. На выходе остаётся член Tag (объект.член tegest.Tag).
Но дело в том, что не получается использовать его из первого скрипта.

Код нового скрипта, вычисляющего tegest.Tag:
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class RandomVal : MonoBehaviour {
        public string Tag;
        public int RandomValue;
        public int RandomObject;
       
        void Start() {
        }
}

public class RandomVal2 : MonoBehaviour {
        public RandomVal tegest = new RandomVal();

        // Use this for initialization
        void Start () {
        tegest.RandomValue = Random.Range(1, 16); //генерируем случайное число
                                                                                                //но каждый раз при нажатии ЛКМ генерируется новое. Почему?
                                                                                                //Генерирование происходит в методе Start. Тогда почему генерится новое?
                if (tegest.RandomValue == 1) tegest.Tag = "E1"; //сравниваем генерированное число с цифрой, символизирующей один из 16 тегов
                if (tegest.RandomValue == 2) tegest.Tag = "E2";
                if (tegest.RandomValue == 3) tegest.Tag = "E3";
                if (tegest.RandomValue == 4) tegest.Tag = "E4";
                if (tegest.RandomValue == 5) tegest.Tag = "E5";
                if (tegest.RandomValue == 6) tegest.Tag = "E6";
                if (tegest.RandomValue == 7) tegest.Tag = "E7";
                if (tegest.RandomValue == 8) tegest.Tag = "E8";
                if (tegest.RandomValue == 9) tegest.Tag = "E9";
                if (tegest.RandomValue == 10) tegest.Tag = "E10";
                if (tegest.RandomValue == 11) tegest.Tag = "E11";
                if (tegest.RandomValue == 12) tegest.Tag = "E12";
                if (tegest.RandomValue == 13) tegest.Tag = "E13";
                if (tegest.RandomValue == 14) tegest.Tag = "E14";
                if (tegest.RandomValue == 15) tegest.Tag = "E15";
                if (tegest.RandomValue == 16) tegest.Tag = "E16";
                //if (RandomValue == RandomObject) Tag = "E" + RandomObject;
        }
       
        // Update is called once per frame
        void Update () {

        }
}
 


Отрезок старого скрипта, где используем tegest.Tag:
Синтаксис:
Используется csharp
GameObject Empty = GameObject.FindWithTag(tegest.Tag); //объекту Empty приписывается один из 16 тегов
_ttp://rebirthgame.tumblr.com/
@jonarhipov
vk.com/jonarhipov
_jonarhipov@gmail.com
Huruffus
UNITрон
 
Сообщения: 174
Зарегистрирован: 02 июл 2012, 20:53
  • Сайт

Re: Проблема с Random

Сообщение Nicloay 16 июл 2012, 14:33

а не проще ли было в классе
public static String tag="E"+Random.Range(1, 16);

?
If you wish to make an apple pie from scratch, you must first invent the universe.(Carl Sagan, Cosmos)
| My Asset Store | coloring book | github | _wiki.unity3d.com | twitter | linkedin |
Аватара пользователя
Nicloay
Адепт
 
Сообщения: 1288
Зарегистрирован: 31 май 2012, 09:27
Откуда: Альпс
  • Сайт

Re: Проблема с Random

Сообщение Huruffus 16 июл 2012, 15:49

Nicloay уже так и сделал)

Есть 2 класса:
1. RandomVal
2. SmartChangePosition
Они находятся в двух разных файлах (но думаю это не особо важно).
В классе RandomVal есть tegest.Tag (объект.член). В этом классе ему присваиваются значения. Затем в классе SmartChangePosition нужно вызвать tegest.Tag.

У меня это получается так(в классе SmartChangePosition):
RandomVal tegest = new RandomVal();
А потом я хочу значение teggest.Tag использовать так:
GameObject Empty = GameObject.FindWithTag(tegest.Tag);

Но значение tegest.Tag я не получаю. В чём дело. Где ошибка? Debug делал - сказали ошибок нет.
_ttp://rebirthgame.tumblr.com/
@jonarhipov
vk.com/jonarhipov
_jonarhipov@gmail.com
Huruffus
UNITрон
 
Сообщения: 174
Зарегистрирован: 02 июл 2012, 20:53
  • Сайт

Re: Проблема с Random

Сообщение Woolf 16 июл 2012, 16:42

Nicloay писал(а):а не проще ли было в классе
public static String tag="E"+Random.Range(1, 16);

?


Только хотел сказать об этом ))
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: Проблема с Random

Сообщение Nicloay 16 июл 2012, 17:45

я бы еще FindWithTag убрал нафиг, не попацански это юзать функции которые могут долго работать, когда ссылки на объекте можно сохранить в какомнибудь массиве.
If you wish to make an apple pie from scratch, you must first invent the universe.(Carl Sagan, Cosmos)
| My Asset Store | coloring book | github | _wiki.unity3d.com | twitter | linkedin |
Аватара пользователя
Nicloay
Адепт
 
Сообщения: 1288
Зарегистрирован: 31 май 2012, 09:27
Откуда: Альпс
  • Сайт

След.

Вернуться в Почемучка

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

Сейчас этот форум просматривают: Yandex [Bot] и гости: 30