Дело в том, что в моём скрипте случайногенерируемая переменная генерируется в 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"; //удаляем тег активного объекта (Кнопки), чтобы мы могли назначить его другой кнопке.
//если в сцене возникнет два объекта с одинаковыми тегами, скрипт будет работать некорректно
}
}
}
}
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"; //удаляем тег активного объекта (Кнопки), чтобы мы могли назначить его другой кнопке.
//если в сцене возникнет два объекта с одинаковыми тегами, скрипт будет работать некорректно
}
}
}
}