Проблемы со скриптом C# в Unity

Как сделать это короче? Я думаю, что мог бы массив, но я не знаю, как его настроить. Вот код, и вот что он должен делать, когда вы получаете определенное количество монет: он увеличивает здоровье на 10 и сохраняет здоровье, а затем меняет текст, который показывает, сколько монет вам нужно для следующего обновления.

void HpUpgradelvl()

 {

     if (PlayerControl.coins >= 30)
     {
         healthPoints = healthPoints + 10;
         PlayerPrefs.SetFloat("HealthUP", healthPoints);
         if (PlayerControl.coins >= 60)
         {
             txt.SetActive(false);
             txt1.SetActive(true);
             txt2_0.SetActive(false);
             txt2_1.SetActive(true);
             healthPoints = healthPoints + 10;
             PlayerPrefs.SetFloat("HealthUP", healthPoints);
             if (PlayerControl.coins >= 100)
             {
                 txt1.SetActive(false);
                 txt2.SetActive(true);
                 txt2_1.SetActive(false);
                 txt2_2.SetActive(true);
                 healthPoints = healthPoints + 10;
                 PlayerPrefs.SetFloat("HealthUP", healthPoints);
                 if (PlayerControl.coins >= 150)
                 {
                     txt2.SetActive(false);
                     txt3.SetActive(true);
                     txt2_2.SetActive(false);
                     txt2_3.SetActive(true);
                     healthPoints = healthPoints + 10;
                     PlayerPrefs.SetFloat("HealthUP", healthPoints);
                     if (PlayerControl.coins >= 210)
                     {
                         txt3.SetActive(false);
                         txt4.SetActive(true);
                         txt2_3.SetActive(false);
                         txt2_4.SetActive(true);
                         healthPoints = healthPoints + 10;
                         PlayerPrefs.SetFloat("HealthUP", healthPoints);
                         if (PlayerControl.coins >= 280)
                         {
                             txt4.SetActive(false);
                             txt5.SetActive(true);
                             txt2_4.SetActive(false);
                             txt2_5.SetActive(true);
                             healthPoints = healthPoints + 10;
                             PlayerPrefs.SetFloat("HealthUP", healthPoints);
                             if (PlayerControl.coins >= 360)
                             {
                                 txt5.SetActive(false);
                                 txt6.SetActive(true);
                                 txt2_5.SetActive(false);
                                 txt2_6.SetActive(true);
                                 healthPoints = healthPoints + 10;
                                 PlayerPrefs.SetFloat("HealthUP", healthPoints);
                                 if (PlayerControl.coins >= 450)
                                 {
                                     txt6.SetActive(false);
                                     txt7.SetActive(true);
                                     txt2_6.SetActive(false);
                                     txt2_7.SetActive(true);
                                     healthPoints = healthPoints + 10;
                                     PlayerPrefs.SetFloat("HealthUP", healthPoints);
                                     if (PlayerControl.coins >= 500)
                                     {
                                         txt7.SetActive(false);
                                         txt8.SetActive(true);
                                         txt2_7.SetActive(false);
                                         txt2_8.SetActive(true);
                                         healthPoints = healthPoints + 10;
                                         PlayerPrefs.SetFloat("HealthUP", healthPoints);
                                         if (PlayerControl.coins >= 610)
                                         {
                                             txt8.SetActive(false);
                                             txt9.SetActive(true);
                                             txt2_8.SetActive(false);
                                             txt2_9.SetActive(true);
                                             healthPoints = healthPoints + 10;
                                             PlayerPrefs.SetFloat("HealthUP", healthPoints);
                                             if (PlayerControl.coins >= 730)
                                             {
                                                 txt9.SetActive(false);
                                                 txt10.SetActive(true);
                                                 txt2_9.SetActive(false);
                                                 txt2_10.SetActive(true);
                                                 healthPoints = healthPoints + 10;
                                                 PlayerPrefs.SetFloat("HealthUP", healthPoints);
                                                 if (PlayerControl.coins >= 860)
                                                 {
                                                     txt10.SetActive(false);
                                                     txt11.SetActive(true);
                                                     txt2_10.SetActive(false);
                                                     txt2_11.SetActive(true);
                                                     healthPoints = healthPoints + 10;
                                                     PlayerPrefs.SetFloat("HealthUP", healthPoints);
                                                     if (PlayerControl.coins >= 1000)
                                                     {
                                                         txt11.SetActive(false);
                                                         txtmax.SetActive(true);
                                                         imgmax.SetActive(false);
                                                         txt2_11.SetActive(false);
                                                         txtmax2.SetActive(true);
                                                         imgmax2.SetActive(false);
                                                         healthPoints = healthPoints + 10;
                                                         PlayerPrefs.SetFloat("HealthUP", healthPoints);
                                                     }
                                                 }
                                             }
                                         }
                                     }
                                 }
                             }
                         }
                     }
                 }
             }
         }
     }
     else healthPoints = 100;
 }  

person shotofop    schedule 15.12.2015    source источник
comment
Итак, в основном вам нужно сопоставить значение PlayControl.coins со значением для установки healthPoints?   -  person Matt Burland    schedule 15.12.2015


Ответы (2)


Есть несколько разных способов справиться с этим, но, возможно, самым простым было бы начать с массива с вашими пороговыми значениями (убедитесь, что он отсортирован от меньшего к большему):

var thresholds = new int[] { 30,60,100,150,210,...};

И затем вместо этого ужасно вложенного набора if вы можете просто прокрутить свой массив:

int i = 0;
while (PlayerControl.coins < thresholds[i++])
{
    healthpoints += 10;
}
person Matt Burland    schedule 15.12.2015
comment
Из вашего вопроса немного сложно понять логику того, что вы пытаетесь с ними сделать, но вы, безусловно, тоже можете поместить их в массив и активировать их по мере необходимости. - person Matt Burland; 16.12.2015

Я понял, что требования к уровню, которые вы устанавливаете (по крайней мере, до 450), следуют определенной схеме. Требование к уровню всегда увеличивается на 10. Я думаю, что это простой, но эффективный способ управления требованиями к опыту.
Одним из преимуществ этого шаблона является то, что его можно выразить квадратичной функцией. Поэтому я написал метод, который генерирует и решает такую ​​квадратичную функцию.
Вы передаете ему основные параметры функции (база, рост) и текущие очки (в данном случае золото), и он возвращает уровень, которого достиг игрок. .

Чтобы дать вам пример, значения, которые я установил в константах ниже, почти соответствуют требованиям, которые вы сначала перечислили. Они есть:

  1. 30
  2. 70
  3. 130
  4. 200
  5. 280...

Я также использовал свойство для синхронизации HP с PlayerPrefs. Вы можете добавить сюда вспомогательную переменную, чтобы не считывать все время PlayerPrefs.

public class HpManager : MonoBehaviour
{
    public int HealthPoints 
    { 
        get 
        { 
            PlayerPrefs.GetFloat("HealthUP")
        }
        set 
        { 
            PlayerPrefs.SetFloat("HealthUP", value); 
        } 
    }   

    private const uint BASE_HEALTH_POINTS = 100;            // Your HP for level 0
    private const uint HEALTH_POINTS_PER_LEVEL = 10;        // The amount the HP increase with each level

    private const uint BASE_LEVEL_REQUIREMENT = 30;     // The gold required to reach level 1
    private const uint PER_LEVEL_INCREASE = 10;         // The amount the level up requirement increases with every level
    private const uint MAX_LEVEL = 99;


    private void Start()
    {
        HealthPoints = BASE_HEALTH_POINTS;              // Set a base value for your HP
    }

    void HpUpgradelvl()
    {
        int level = GetLevel((uint)PlayerControl.coins, BASE_LEVEL_REQUIREMENT, PER_LEVEL_INCREASE);
        level = Mathf.Clamp(0, MAX_LEVEL);

        HealthPoints = BASE_HEALTH_POINTS + level * HEALTH_POINTS_PER_LEVEL;
    }   

    private int GetLevel(uint points, uint baseRequirement, uint increaseRequirement)
    {
        float a = 0.5f * increaseRequirement;
        float b = baseRequirement - a;

        // Convert quadratic equation "l = ax² + bx" into normalized form "0 = x² + px + q"
        float p = b / a;                                                
        float q = -points / a;                                          // Bring across and normalize
        float level = -p / 2f + Mathf.Sqrt((p * p) / 4f - q);               // Solve for positive value       

        return Mathf.FloorToInt(level);                                     // Return reached level
    }
}

Мне нужно больше информации, чтобы помочь вам с текстами.
Как бы то ни было, это кажется чересчур сложным. Я не могу представить, что вам действительно понадобятся все эти отдельные текстовые объекты.
Что именно вы пытаетесь здесь сделать?

person DerClef    schedule 07.04.2017