Измененная переменная во время игры вступает в силу только в следующей игре - PullRequest
0 голосов
/ 18 сентября 2018

Сценарий

Я работаю над игрой, в которой переменная numStamps начинается с 2, эта переменная также установлена ​​как public int, и я вижу ее в моем инспекторе иэто в сценарии с именем Weather

public int numStamps;

Теперь вы можете подумать, что «где numStamps» объявляется как имеющее значение 2?в инспекторе?Но на самом деле у меня есть ссылка на gameObject в другом скрипте с именем GameMode, и я перетаскиваю «скрипт погоды» в инспектор этого скрипта GameMode.

Это позволяет мне получить доступ к переменной numStamps,Цель этого заключается в том, что у меня есть emum, в котором я изменяю эту переменную z в зависимости от выбранной сложности.См. Ниже

using DigitalRuby.WeatherMaker;
using MoreMountains.Tools;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

    public class GameMode : MonoBehaviour {
        public GameObject mainCamera;
        public GameObject fallingObjects;
        public GameObject WeatherMaker;
        public GameObject stormHerald; 
        public enum GameDifficulty
    {
        Test,
        Easy,
        Medium,
        Hard
    }
    [Information("Selece Game Mode", MoreMountains.Tools.InformationAttribute.InformationType.Info, false)]
    /// Set Variables based on selected mode


     // public motionDirections motionState = motionDirections.Vertical;
        public GameDifficulty Mode = GameDifficulty.Easy;
    // Use this for initialization
    void Start () {

        switch (Mode)
        {
            case GameDifficulty.Test:

                stormHerald.GetComponent<Weather>().numStamps = 2;

                break;
            case GameDifficulty.Easy:                 

                stormHerald.GetComponent<Weather>().numStamps = 2;

                break;
            case GameDifficulty.Medium:

                stormHerald.GetComponent<Weather>().numStamps = 2;

                break;
            case GameDifficulty.Hard:

                stormHerald.GetComponent<Weather>().numStamps = 3;

                break;
        }
    }


    public void reduceStamp()
    {

      stormHerald.GetComponent<Weather>().numStamps = stormHerald.GetComponent<Weather>().numStamps - 1;


    }
    public void extendStamp()
    {

        stormHerald.GetComponent<Weather>().numStamps = stormHerald.GetComponent<Weather>().numStamps + 1 ;


    }
    // Update is called once per frame
    void Update () {
        Debug.Log(stormHerald.GetComponent<Weather>().numStamps);
    }
}

Проблема

Проблема, с которой я экспериментирую, заключается в том, что при использовании моего метода exteStamp метод вызывается в коде, а метод обновлениятакже показывает мне, что значение numStamp увеличивается.ОДНАКО, в инспекторе, который не соответствует истине, и ситуации, которые должны возникнуть, когда эта переменная равна, например, 5, не возникает.Странно, если numStamps предполагается равным 7, это значение отображается только в инспекторе, когда я перезапускаю игру.

То же самое относится и к сложности игры, изменение сложности изменяет только значения, если я начинаюэто во второй раз.

Так что мне кажется, что я обновляю это значение неправильно, что странно, потому что я постоянно меняю значения в инспекторе в моей игре, но я просто не могу заставить этот момент работать правильно.

Буду признателен за некоторую помощь или руководство в этом

С уважением

Погода

void Update () {
    timeBetweenStorms -= Time.deltaTime;

    if ( numStamps>0 && isStormyNow == false)
    {
        if (timeBetweenStorms <= 0.0f)
        {

            // timerEnded();

            //  var chanceOfSpawningKremlin = 0.75f;
            float rValue;
            rValue = Random.value;
            Debug.Log(rValue + "% Chance of Storm");
            if (rValue < chanceEvent)
            {
                timeBetweenStorms = timeBetweenIfStorms;
                StartCoroutine(TemporarilyActivateStormWarning(ActivateFor));


            }else
            {

                timeBetweenStorms = timeBetweenIfNoStorms;
            }


        } 

    }


}

1 Ответ

0 голосов
/ 18 сентября 2018

Я думаю, что понимаю, что здесь не так.

Вероятно, происходит то, что вы устанавливаете переменную stormHerald в Unity Inspector на prefab вместо объект сцены .

  • Префабы - это объекты, которые вы создаете в папке вашего проекта, это шаблоны для создания объектов в ваших сценах, и они появляются в Вкладка «Проект» редактора Unity.
  • С другой стороны, объекты сцены появляются на вкладке «Иерархия» вашего редактора Unity.

Вы установили переменную stormHerald на ссылку на префаб вместо установки на ссылку на объект сцены .Я проиллюстрировал это на рисунке ниже: вы выбираете путь с синей стрелкой, а вы должны выбрать путь с красной стрелкой.Это означает, что всякий раз, когда вы изменяете переменную numStamps, вы устанавливаете переменную в prefab , а не в объекте сцены .Таким образом, сцена не обновляется, в то время как префаб (а изменения префаба имеют место только при следующем воспроизведении сцены).

enter image description here

Подтвердить это очень просто: запустите свою игру, выполните действие, которое нужно сделать, чтобы изменить переменную numStamps внутри игры, а затем нажмите на объект, который должен быть изменен в сцене.Инспектор покажет, что он не был изменен.Затем, продолжая игру, перейдите на вкладку Project , найдите prefab объекта stormHerald и щелкните по нему.В Инспекторе вы увидите, что значение переменной numStamps изменилось в префабе.

Решение вашей проблемы: установите переменную stormHerald так, чтобы она указала на объект сцены , а не на ваш сборный .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...