Unity 3D проблемы с кодом

133
27 мая 2019, 11:00

У меня есть программа обучалка для детей. Суть такова: генерируется случайный пример из чисел a и b и генерируется случайный знак. Все работает отлично, только вот не могу сделать счетчик правильных ответов(переменная prav). Скрипт присвоил кнопкам(otvet1,otvet2,otvet3) и примеру(zadacha), но у меня получается какая то ерунда. ПРОШОУ ПОМОГИТЕ УЖЕ ГОЛОВА ГОРИТ 2 ДЕНЬ СИЖУ НЕ ВЫХОДИТ

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
public class GameControl : MonoBehaviour
{
    public int a, znak, b, c, count, otvet, randomtext, tochnosykablyat;
    static int prav=0;
    public Text otvet1;
    public Text otvet2;
    public Text otvet3;
    public Text zadacha;
    public Text Count;
    void Start()
    { 
        Yravnenie(); 
    }
    void Yravnenie()
    {
        count++;
        //if(count<21)
        //{ Application.Quit(); Count.text = count+"/20"; }
        a = Random.Range(1, 21);
        b = Random.RandomRange(1, 21);
        znak = Random.RandomRange(1, 3);
        if (znak == 1) 
        { 
            zadacha.text = a + " + " + b + " = ?"; 
            otvet = a + b; 
        }
        if (znak == 2 && a >= b) 
        { 
            zadacha.text = a + " - " + b + " = ?"; 
            otvet = a - b; 
        }
        if (znak == 2 && a < b) 
        { 
            zadacha.text = a + " + " + b + " = ?"; 
            otvet = a + b; 
        }
        randomtext = Random.RandomRange(1, 4);
        tochnosykablyat = randomtext;
        if (randomtext == 1) 
            otvet1.text = otvet.ToString();
        if (randomtext == 2) 
            otvet2.text = otvet.ToString();
        if (randomtext == 3) 
            otvet3.text = otvet.ToString();
        a = Random.Range(2, 16);
        if (a == otvet) 
            a--;
        if (randomtext == 1) 
            otvet3.text = a.ToString();
        if (randomtext == 2) 
            otvet1.text = a.ToString();
        if (randomtext == 3) 
            otvet2.text = a.ToString();
        b = Random.RandomRange(17, 31); 
        if (b == otvet) 
            b--;
        if (randomtext == 1) 
            otvet2.text = b.ToString();
        if (randomtext == 2) 
            otvet3.text = b.ToString();
        if (randomtext == 3) 
            otvet1.text = b.ToString();
    }
    void OnMouseUpAsButton()
    {    
        if (gameObject.name == "otvet1" && tochnosykablyat == 1) 
        { 
            prav = prav + 1;
            Yravnenie(); 
        }
        if (gameObject.name == "otvet2" && tochnosykablyat == 2) 
        {
            prav = prav + 1;
            Yravnenie(); 
        }
        if (gameObject.name == "otvet3" && tochnosykablyat == 3) 
        {
            prav = prav + 1;
            Yravnenie(); 
        }
        Count.text = prav.ToString();  
    }    
}
Answer 1

Если я правильно все понял, то у Вас три кнопки. И три экземпляра класса "GameControl". При этом переменная с модификатором static только одна - счетчик побед. Проблема в том, что переменная "tochnosykablyat" в каждом экземпляре своя. А это значит, что после визуального обновления информации в кнопках в других кнопках значение правильного ответа осталось прежним.

Попробуйте "tochnosykablyat" также сделать статичной переменной

public static int tochnosykablyat;

Оффтопное послесловие. Пожалуйста, старайтесь избегать такого странного именования переменных как "tochnosykablyat"...

Answer 2

Создай пустой обьект на сцене и повесь этот скрипт:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Sample : MonoBehaviour {
    private int _a, _b;
    private string _text;
    private Znak CurrZnak; 
    public int UserWinCounter;
    public int PCWinCounter;
    public int ExpectedRezult = 0;
    public int[] Otvets = new int[3];
    // Use this for initialization
    void Awake () {
        NewEquation();
    }
    public void NewEquation()
    {
        _a = Random.Range(7, 31);
        _b = Random.Range(4, _a);
        CurrZnak = (Znak) Random.Range(0, 2);
        switch (CurrZnak)
        {
            case (Znak.Plus):
                _text = _a + " + " + _b + " = ?";
                ExpectedRezult = _a + _b;
                break;
            case (Znak.Minus):
                _text = _a + " - " + _b + " = ?";
                ExpectedRezult = _a - _b;
                break;
        }
        Otvets[0] = ExpectedRezult;
        Otvets[1] = ExpectedRezult + Random.Range(1, 3);
        Otvets[2] = ExpectedRezult - Random.Range(1, 3);
        Shuffle(Otvets);
    }
    public enum Znak
    {
        Plus = 0,
        Minus = 1
    }
    private void Shuffle<T>(T[] array)
    {
        int n = array.Length;
        while (n > 1)
        {
            n--;
            int k = Random.Range(0, n + 1);
            T value = array[k];
            array[k] = array[n];
            array[n] = value;
        }
    }
    void OnGUI()
    {
        GUI.Label(new Rect(10, 10, 100, 20), _text);
        if (GUI.Button(new Rect(10, 50, 50, 50), Otvets[0].ToString()))
            CheckWinnerWithNumber(Otvets[0]);
        if (GUI.Button(new Rect(70, 50, 50, 50), Otvets[1].ToString()))
            CheckWinnerWithNumber(Otvets[1]);
        if (GUI.Button(new Rect(130, 50, 50, 50), Otvets[2].ToString()))
            CheckWinnerWithNumber(Otvets[2]);
        GUI.Label(new Rect(10, 100, 400, 20), "PC Win:" + PCWinCounter + "; User Win: " + UserWinCounter);
    }
    private void CheckWinnerWithNumber(int otvet)
    {
        if (otvet == ExpectedRezult)
        {
            UserWinCounter++;
            NewEquation();
        }
        else
        {
            PCWinCounter++;
            NewEquation();
        }
    }
}

Не забудь отметить самый полезный из ответов как верный.

READ ALSO
Метод ForEach и IEnumerable

Метод ForEach и IEnumerable

Подскажите, а в чем мотивация того, что этот метод работает только с List<T>? Ведь IEnumerable тоже имеет все необходимое

147
Настройки звука

Настройки звука

Всем привет, у меня возникла проблема с настройкой звукаДобавил в настройки Slider который регулирует громкость звука (по крайне мере должен...

150
Convert WPF ArcSegment to DXF Arc

Convert WPF ArcSegment to DXF Arc

конвертация DXF Arc в WPF ArcSegment представлена в следующем коде,

126
Может ли Docx библеотека для c# создавать формулы?

Может ли Docx библеотека для c# создавать формулы?

Роюсь , роюсь у https://githubcom/xceedsoftware/DocX и http://cathalscorner

148