как вариант можно сделать canvas, а на нем 2 панели, одна с достижениями, вторая чо там иначе. И прописать, что если условие выполняется, то активна панель 1, а вторая не активна, ну и наоборот соответственно. весь код не буду писать) ибо там целый скрипт писать с нуля, а не править твое.
Суть вот в чем. есть панель aptekaZdanie, к ней креплю префаб apt2, теперь требуется сменить привязку к левому верхнему углу, и переместить на 200 единиц вправо и 100 вниз (условно), никак не могу разобраться с этими UI примочками) вот скрипт Vector3 tempVector=new Vector3(0,0,0); Quaternion qua=new Quaternion(0,0,0,0); Apt2 = Instantiate(aptPrefab, tempVector, qua); Apt2.transform.SetParent(aptekaZdanie.transform); Apt2.transform.position = aptekaZdanie.transform.position; RectTransform tempRect = Apt2.GetComponent<RectTransform>();
Ситуация следующая - есть объект UI с имунем Lec1, на нем подвешены еще элементы текста и кнопка. Скрипт определяет номер (1), по нему обращается к скрипту в котором созданы экземпляры другого класса и уложены в список. В первом объекте все отлично, а если создать дубликат объекта, то первый объект все нормально меняет в полях, а второй выдает ощибку ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index скрипт с базой экземпляров:
using System.Collections; using System.Collections.Generic; using UnityEngine;
public class LecCont : MonoBehaviour//Создание базы лекарств { // Start is called before the first frame update public List<Lecarstvo> listLecarstvos = new List<Lecarstvo>(); public Lecarstvo Lek1; public Lecarstvo Lek2; public Lecarstvo Lek3; // Start is called before the first frame update void Awake() { Lek(); } void Lek()//Создание экземпляров лекарств и занесение их в список { Lek1 = new Lecarstvo("Лекарство от голода", 15f, 1, 1, 15, 1, 1); listLecarstvos.Add(Lek1); Lek2 = new Lecarstvo("Лекарство от совести", 500f, 0, 0, 35, 1, 1); listLecarstvos.Add(Lek2); Lek3 = new Lecarstvo("Лекарство от глаза", 5000f, 0, 0, 35, 1, 1); listLecarstvos.Add(Lek3);
} }
public class Lecarstvo {
public string name; //название public float startCost; //стартовая стоимость public int currentNumber; //число на складе public int numberOfWorkers; //количество работников на заводе public int costForSell; //стоимость продажи в аптеке стартовая public float prodUpgrade; //кэффициент производства public float costUpgrade; //коэффициент к цене в аптеке
public Lecarstvo(string name, float startCost, int currentNumber, int numberOfWorkers, int costForSell, float prodUpgrade, float costUpgrade) //класс для лекарств { this.name = name; this.startCost = startCost; this.currentNumber = currentNumber; this.numberOfWorkers = numberOfWorkers; this.costForSell = costForSell; this.prodUpgrade = prodUpgrade; this.costUpgrade = costUpgrade; }
}
Скрипт с вызовом этих экземпляров и заполнением полей
using System; using System.Collections; using System.Collections.Generic; using TMPro; using UnityEngine; using UnityEngine.UI;
public class RightPanelSorter : MonoBehaviour { #region LocalPeremennie public string lecarstvoName;//название лекарства public int lecarsvaSklad;//лекарств на складе public float lecarstvoCostUp;//Стоимость покупки рабочего public int lecarstvoWorkers;//Количество рабочих [HideInInspector] public int numberOfLecarstva;//порядковый номер лекарства private GameObject GM; private LecCont Lc; #endregion
#region PublicGO public TextMeshProUGUI aname;//поле с именем public Text asklad;//поле с количеством на складе public Text acost;//поле со стоимостью апгрейда public Text aworkers;//поле с рабочими public Button aupButton;//доступ к кнопке #endregion
private void Awake() { GM=GameObject.Find("GameManager"); Lc = GM.GetComponent<LecCont>();//Доступ к базе лекаств zapolnenie();
Добавлено (05 Января 2024, 19:10) --------------------------------------------- от второго объекта приходит отклик, что он определил номер кнопки, вычел единицу и знает номер обращения к списку - 1, но дальше происходит лажа, как я понимаю, скрипт со второго объекта уже не может обратиться к базе, даже если все параметры поставить 0, чтобы выдавал те же данные что и первый объект. Возможно есть боле простой способ хранения данных стороннего класса с укладывание в базу??
Сообщение отредактировал Seleborn - Пятница, 05 Января 2024, 19:11
NullReferenceException: Object reference not set to an instance of an object GameManager.Update () (at Assets/Scripts/GameManager.cs:209) выдает такую ошибку при попытке обратиться к любой переменной экземпляра класса. создаю игрульку по типу ТД, создал класс towerStat, в котором все параметры башен, планирую создать несколько экземпляров класса для каждого уровня башни, и просто менять текущий при апгрейде, но возникает такая проблема при попытке обратиться к junourChef.cost
if (language == "RU") tempName = ruDictionary.juniorChef; else if (language == "EN") tempName = enDictionary.juniorChef;
for (int i = 0; i < spritesOfGame.Length; i++) { if (spritesOfGame[i].name=="chef 01 lvl-01") { tempSprite = spritesOfGame[i]; return; } }
public class TowerStat { public int towerLevel = 1; public Sprite sprite; public string name; public int minDamage; public int maxDamage; public float distance; // дальность башни public int cost; //стоимость башни public float critChance = 0; //шанс крита public bool splash = false; //возможность сплэш урона public float splashRadius = 0; // радиус сплэш урона (о - если нет) public float speed; //время между выстрелами в сек public bool stunChance = false; //возможность стана public float stunTime = 0; //время стана (0 если стана нет)
public float StunTime { get => stunTime; set { if (stunChance) stunTime = value; else stunTime = 0; } }
public float armorPenetration; // в процентах 55,5 например
public float ArmorPenetration { get => armorPenetration; set { if (ArmorPenetration < 100) armorPenetration = value; else armorPenetration = 100; }
Добавлено (06 Мая 2021, 10:05) --------------------------------------------- 209 строка пытается обратиться к juniourChef.cost
Добавлено (06 Мая 2021, 10:09) --------------------------------------------- сам джетрайдер никаких проблем с кодом не показывает
Добавлено (06 Мая 2021, 10:18) --------------------------------------------- towerStat класс вне monobehaviour, создание экземпляра в скрипте под monobehaviour
цель скрипта: при соприкосновении колайдера объекта square с предметом с тегом Pomeha, должна выводиться координата по ч, но не выводится( Хочу в будущем сделать проверку для А*, чтоб при соприкосновении объектов заполнялся двухмерный массив, но что-то застрял на начале)
using System.Collections; using System.Collections.Generic; using UnityEngine;
public class Setka : MonoBehaviour { float x ; float y ; public GameObject square; private GameObject sq; Vector2 sqVec; // Use this for initialization void Start () {
setka(); }
// Update is called once per frame void Update () {
} void setka() { for (x = -5; x < 5.5f; x=x+0.5f) { for (y = -5; y < 5.5f; y = y + 0.5f) { sqVec = new Vector2(x, y); sq=Instantiate(square, sqVec, transform.rotation); Destroy(sq); } } }
Делаю программку для детей, по типу обучения печати. Суть в том, что на экране написаны буквы, и при нажатии на правильную кнопку буква становится с красным фоном, следующая буква становится как бы текущей, принимая желтый фон, а буквы которые не срабатывают с синим фоном. И вот если в слове есть две одинаковые буквы, то первое нажатие проходит корректно, а второе нажатие считается уже типа выполненным. например слово майка, первые 4 буквы все норм. Но стоит нажать в свою очередь к, происходит автоматическое срабатывание А, то есть она меняет фон на красный и считается нажатой. Подскажиьте где косяк?
using System.Collections; using System.Collections.Generic; using UnityEngine;
public class Shirtsc : MonoBehaviour { public GameObject letter1wait;//1 буква желтая public GameObject letter1done;//1 буква красная public GameObject letter2sleep;//2 буква синяя public GameObject letter2wait;//2 буква желтая public GameObject letter2done;//2 буква красная public GameObject letter3sleep;//3 буква синяя public GameObject letter3wait;//3 буква желтая public GameObject letter3done;//3 буква красная public GameObject letter4sleep;//4 буква синяя public GameObject letter4wait;//4 буква желтая public GameObject letter4done;//4 буква красная public GameObject letter5sleep;//5 буква синяя public GameObject letter5wait;//5 буква желтая public GameObject letter5done;//5 буква красная public AudioClip letter1, letter2, letter3, letter4, letter5, SoundWhole;//звуки каждой буквы и общее слово float x;//координата букв для изменения public float y = -3.52f;//координата полосы по у bool L1 = false;//проверка нажатия 1 буквы bool L2 = false;//проверка нажатия 2й буквы bool L3 = false;//проверка нажатия 3 буквы bool L4 = false; // проверка нажатия 4 буквы bool L5 = false; int time = 0;//время для срабатывания подъема букв int time1 = 0;// будет равен 1 после срабатывания подъема буквы 1 int time2 = 0;// будет равен 1 после срабатывания подъема буквы 2 int time3 = 0;// будет равен 1 после срабатывания подъема буквы 3 int time4 = 0;// будет равен 1 после подъема буквы 4 int para = 0; //для первой парной кнопки int t = 1;//время ожидания int rand;//рандомная сцена // Use this for initialization
// Update is called once per frame
void Start() { }
// Update is called once per frame void Update() { if (t == 2 && time == 1 &¶==0) { rand = 43; Application.LoadLevel(rand); } if (Input.GetKeyDown(KeyCode.V))//нажатие 1 кнопки { AudioSource.PlayClipAtPoint(letter1, letter1wait.transform.position); Destroy(letter1wait.gameObject);
x = -4; letter1done.gameObject.transform.position = new Vector3(x, y, 0); Destroy(letter2sleep); x = -2; letter2wait.gameObject.transform.position = new Vector3(x, y, 0); L1 = true; para = 1; } if (L1 == true &&L2==false && L5==false) { if (Input.GetKeyDown(KeyCode.F))//нажатие 2 кнопки { if (L1 == true) { x = -2; AudioSource.PlayClipAtPoint(letter2, letter2done.transform.position); Destroy(letter2wait.gameObject); letter2done.gameObject.transform.position = new Vector3(x, y, 0); x = 0; Destroy(letter3sleep); letter3wait.gameObject.transform.position = new Vector3(x, y, 0); L2 = true; L1 = false; L5 = true; } } } if (L2 == true)//нажатие 3 кнопки {
if (Input.GetKeyDown(KeyCode.Q)) { x = 0; AudioSource.PlayClipAtPoint(letter3, letter3wait.transform.position); Destroy(letter3wait.gameObject); letter3done.gameObject.transform.position = new Vector3(x, y, 0); x = 2; Destroy(letter4sleep); letter4wait.gameObject.transform.position = new Vector3(x, y, 0); L3 = true; } } if (L3 == true )//нажатие 4 кнопки {
if (Input.GetKeyDown(KeyCode.R)) { x = 2; AudioSource.PlayClipAtPoint(letter4, letter4wait.transform.position); Destroy(letter4wait.gameObject); letter4done.gameObject.transform.position = new Vector3(x, y, 0); x = 4; Destroy(letter5sleep); letter5wait.gameObject.transform.position = new Vector3(x, y, 0); L4 = true; } } if (L4 == true && L1==true && L5==true)//нажатие 5 кнопки {
if (Input.GetKeyDown(KeyCode.F)) {
x = 4; AudioSource.PlayClipAtPoint(letter5, letter5wait.transform.position); Destroy(letter5wait.gameObject); letter5done.gameObject.transform.position = new Vector3(x, y, 0); StartCoroutine(wait1());//первое появление time=1///
} }
if (time == 1 && time1 == 0 && time2 == 0 && time3 == 0) //подъем 1 буквы { x = -4; y = -3; letter1done.gameObject.transform.position = new Vector3(x, y, 0); time = 0; time1 = 1; AudioSource.PlayClipAtPoint(letter1, letter1done.transform.position); StartCoroutine(wait1()); } if (time == 1 && time1 == 1 && time2 == 0 && time3 == 0)//подъем второй буквы { x = -2; letter2done.gameObject.transform.position = new Vector3(x, y, 0); time = 0; time2 = 1; time1 = 0; AudioSource.PlayClipAtPoint(letter2, letter1done.transform.position); Debug.Log("321"); StartCoroutine(wait1());
} if (time == 1 && time2 == 1 && time3 == 0)//подъем третьей буквы { x = 0; letter3done.gameObject.transform.position = new Vector3(x, y, 0); AudioSource.PlayClipAtPoint(letter3, letter1done.transform.position); time = 0; time1 = 1; time2 = 2; StartCoroutine(wait1());
} if (time == 1 && time2 == 2 && time3 == 0)//подъем 4 буквы { x = 2; letter4done.gameObject.transform.position = new Vector3(x, y, 0); AudioSource.PlayClipAtPoint(letter4, letter1done.transform.position); time = 0; time1 = 3; time2 = 3; time3 = 3; time4 = 1; StartCoroutine(wait1()); } if (time == 1 && time1 == 3 && time2 == 3 && time3 == 3 && time4 == 1)//подъем 5 буквы { x = 4; letter5done.gameObject.transform.position = new Vector3(x, y, 0); AudioSource.PlayClipAtPoint(letter5, letter1done.transform.position); time = 0; time1 = 1; time2 = 1; time3 = 3; StartCoroutine(wait1()); } if (time == 1 && time1 == 1 && time2 == 1 && time3 == 3) { AudioSource.PlayClipAtPoint(SoundWhole, letter1done.transform.position); time2 = 0; time = 0; t = 2; StartCoroutine(wait1()); }
} IEnumerator wait1()//задержка на секунду { //пауза этой функции, возврат через заданное время yield return new WaitForSeconds(t); time = 1; StopCoroutine(wait1()); } }
угадал почти. игра на обучение печати. вводятся буквы по порядку на экране, есть картинка и буквы, которые надо ввести.. я вот тоже хочу сначала одну сцену написать, а потом уже думать буду, как унифицировать, чтобы выводить все в внешних условиях.
Сообщение отредактировал Seleborn - Четверг, 25 Апреля 2019, 20:09
http://prntscr.com/nese8q это не то условие?? http://prntscr.com/nesf1h, так выглядит с дебагами. ТО есть после нажатия кнопки К нажатие В уже не проверяется( но все что под этим иф выполняется
Сообщение отредактировал Seleborn - Воскресенье, 21 Апреля 2019, 09:16
да собственно основная задача здесь такая, есть на экране 3 картинки, общее слово КИТ, вот при нажатии R(К) происходит замена цвета, то есть буква к становится как бы нажатой, и переходит по условию к выполнению нажатия кнопки B(И). так что в принципе по описанию все понятно) а вот почему не выходит к условию, это не понятно, хотя код с нажатием В прописывается в if, собственно он и не должен выполняться, пока кнопка не будет нажата
[code] using System.Collections; using System.Collections.Generic; using UnityEngine;
public class letter1 : MonoBehaviour {
public GameObject letter1wait; public GameObject letter1done; public GameObject letter2sleep; public GameObject letter2wait; public GameObject letter2done; float x,x1; public float y; bool K = false;
// Use this for initialization
// Update is called once per frame void Start() { }
// Update is called once per frame void Update() {
if (Input.GetKey(KeyCode.B)) { if (K == true) { Destroy(letter2wait.gameObject); letter2done.gameObject.transform.position = new Vector3(x1, y, 0); } }
if (Input.GetKey(KeyCode.R)) { Destroy(letter1wait.gameObject); x = -2; letter1done.gameObject.transform.position = new Vector3(x, y, 0); Destroy(letter2sleep); x1 = 0; letter2wait.gameObject.transform.position = new Vector3(x1, y, 0); K = true; }
} }
Вот такой скрипт, по задумке после нажатия R должен первый объект поменять цвет (вставиться другой объект), после чего переменная К станет правдивой и переведет действие на следующий этап, нажатие B, но по факту после нажатия R выполняется вся часть апдейта, то есть меняетс не только первый объект, но и второй, вне зависимости от нажатия B/ Помогите(
Сообщение отредактировал Seleborn - Воскресенье, 21 Апреля 2019, 08:09