Настройки сложности переносятся на игровые сцены с помощью playerprefs

#unity3d #scripting

Вопрос:

Что касается некоторых отличных предложений, у меня есть проблемы с кнопками изменения скорости появления для моей игры. Однако изменения не переносятся на последующие сцены. Может ли кто-нибудь заметить проблему с настройками моих Playerprefs?

Скрипт кнопок сложности

кнопка приватной кнопки;

 public RandomSpawn randomSpawn;

public int difficulty;


void Start()
{
    button = GetComponent<Button>(); 
    randomSpawn = GameObject.Find("Random Spawn").GetComponent<RandomSpawn>();
    button.onClick.AddListener(delegate{randomSpawn.UpdateSpawnRate(difficulty);});
}

void SetDifficulty()
{
    Debug.Log(gameObject.name   "was clicked");
}

 void Update()
{
    PlayerPrefs.SetInt("Player Difficulty", difficulty);
}
 

}

Сценарий создания

 public GameObject prefab1, prefab2, prefab3, prefab4;

public float maxSpawnRate = 2f;

private float nextSpawn = 0f;

private int whatToSpawn;

private float spawnRate = 2f;

public static int difficulty = 0;

private void Start()
{
    difficulty = PlayerPrefs.GetInt("Player Difficulty");
}

void Update()
{
    
    if (Time.time > nextSpawn) { //if time has come
        whatToSpawn = Random.Range(1, 6); // define random value between 1 and 4 (5 is exclusive)
        Debug.Log(whatToSpawn); //display its value in console
   
   
        switch (whatToSpawn) {
            case 1:
                Instantiate(prefab1, transform.position, Quaternion.identity);
                break;
            case 2:
                Instantiate(prefab2, transform.position, Quaternion.identity);
                break;
            case 3:
                Instantiate(prefab3, transform.position, Quaternion.identity);
                break;
            case 4:
                Instantiate(prefab4, transform.position, Quaternion.identity);
                break;
       
        }
 
        nextSpawn = Time.time   spawnRate;
    }
}

public void UpdateSpawnRate(int difficulty)
{
    spawnRate = maxSpawnRate / difficulty;
}
 

}

SetDifficulty не отображается в качестве опции для OnClick инспектора введите описание изображения здесь

Комментарии:

1. Обратные вызовы, добавленные во время выполнения, никогда не появятся в инспекторе для onClick

Ответ №1:

Я считаю, что проблема заключается в использовании метода SetInt in Update() , так как у вас есть несколько объектов, использующих RandomSpawn скрипт. Он будет продолжать перезаписывать это значение с учетом сложности каждого объекта.

 private Button button;

public int difficulty;


void Start()
{
    button = GetComponent<Button>();

    // can also add the onclick to your button here
    button.onClick.AddListener(delegate{SetDifficulty();});
}

// make this your buttons onClick in the hierarchy
public void SetDifficulty()
{
    PlayerPrefs.SetInt("Player Difficulty", difficulty);
    Debug.Log(gameObject.name   "was clicked");
}
}
 

Является ли сложность набора одним нажатием кнопок? Если это так, то кнопка вам не нужна.Один клик.addListener больше нет, если вы назначаете onClick в инспекторе. Я бы переместил ссылки на игроков.Установите значение везде, где происходит onClick для вашей кнопки, чтобы вы могли задать сложность только в этом случае, а не в каждом кадре в Update().

Сейчас я редактирую сценарий появления, чтобы изменить скорость появления в зависимости от сложности и максимального количества;

 public GameObject prefab1, prefab2, prefab3, prefab4;

public float maxSpawnRate = 2f;

private float nextSpawn = 0f;

private int whatToSpawn;

private float spawnRate = 2f;

public static int difficulty = 0;

private void Start()
{
    difficulty = PlayerPrefs.GetInt("Player Difficulty");
    spawnRate = maxSpawnRate / difficulty;
}

void Update()
{
    
    if (Time.time > nextSpawn) { //if time has come
        whatToSpawn = Random.Range(1, 6); // define random value between 1 and 4 (5 is exclusive)
        Debug.Log(whatToSpawn); //display its value in console
   
   
        switch (whatToSpawn) {
            case 1:
                Instantiate(prefab1, transform.position, Quaternion.identity);
                break;
            case 2:
                Instantiate(prefab2, transform.position, Quaternion.identity);
                break;
            case 3:
                Instantiate(prefab3, transform.position, Quaternion.identity);
                break;
            case 4:
                Instantiate(prefab4, transform.position, Quaternion.identity);
                break;
       
        }
 
        nextSpawn = Time.time   spawnRate;
    }
}
 

Комментарии:

1. Спасибо за быстрое реагирование. Я удалил строку button.onclick и вставил в вышеперечисленные моды, но по-прежнему не перенес настройки на последующие сцены. Я заметил, что изменение maxspawnrate в поле, сгенерированном randomspawn в инспекторе последующих сцен, также не влияет на создателя. Кажется, мы так близки, но что-то все еще не так. Журнал отладки чист, но, как ни странно, ничего не показывает для «был нажат» — до того, как он подтвердит, когда нажал Easy и т. Д.

2. @xaltx Вы опубликовали весь сценарий обоих? Я замечаю, что в сценарии Spawner больше нет кода, который влияет на скорость появления. Я обновил код, чтобы он работал.

3. похоже, теперь все работает!!! помогли настройки maxspawn в инспекторе. Сейчас выполняю более тщательную проверку уровня за уровнем-сообщу, когда закончу.

4. @xaltx Рад слышать! Надеюсь, теперь все это сработает.

5. Подтвердил, что все работает! @TEEBQNE Thx большое спасибо за вашу доброту, время и терпение.