Как вызвать сопрограмму из другого скрипта? ЕДИНСТВО - PullRequest
0 голосов
/ 28 марта 2020

Это сценарий, в котором идет действие касания, основная игра на нем

  var addingGoldPerSec = new GameObject();
    var buttonInstance = addingGoldPerSec.AddComponent<ItemButton>();
    StartCoroutine(buttonInstance.addGoldLoop());

А это тот, где у меня есть сопрограмма

public double goldPerSec
{
    get
    {
        if (!PlayerPrefs.HasKey("_goldPerSec"))
        {
            return 0;
        }
        string tmpStartGoldPerSec = PlayerPrefs.GetString("_goldPerSec");
        return double.Parse(tmpStartGoldPerSec);
    }
    set
    {
        PlayerPrefs.SetString("_goldPerSec", value.ToString());
    }
}

public void updateUI()
{
        priceDisplayer.text = LargeNumber.ToString(currentCostPerSec).ToString();
        coinDisplayer.text = "PER SEC\n" + LargeNumber.ToString(goldPerSec).ToString();
        levelDisplayer.text = "LEVEL\n" + level + "/150".ToString();
}
public IEnumerator addGoldLoop()
{
    while (DataController.Instance.gold <= 1e36)
    {
        DataController.Instance.gold += goldPerSec;
        if (Gameplay.Instance.booster == 1)
        {
            yield return new WaitForSeconds(0.25f);
        }
        else if (Gameplay.Instance.booster == 0)
        {
            yield return new WaitForSeconds(1.0f);
        }
    }
}

И это Третий сценарий, в котором я управляю данными, хранящимися в PlayerPrefs

 public void loadItemButton(ItemButton itemButton)
{
    itemButton.level = PlayerPrefs.GetInt("_level",1);
    PlayerPrefs.GetString("_costPerSec", itemButton.currentCostPerSec.ToString());
    PlayerPrefs.GetString("_goldPerSec",itemButton.goldPerSec.ToString());
}
public void saveItemButton(ItemButton itemButton)
{
    PlayerPrefs.SetInt("_level", itemButton.level);
    PlayerPrefs.SetString("_costPerSec", itemButton.currentCostPerSec.ToString());
    PlayerPrefs.SetString("_goldPerSec", itemButton.goldPerSec.ToString());
}

У меня есть второй сценарий, который является сопрограммным и прикреплен к нескольким игровым объектам, где есть кнопка Upgrade, при каждом обновлении монета увеличивается на секунду, когда вы зарабатываете, Основная проблема здесь заключается в том, что сопрограмма просто останавливается после того, как я касаюсь экрана, поэтому я сделал другой код в основном скрипте, чтобы таким образом сопрограмма продолжала работать даже после касания экрана, поэтому я создал скрипт, где находится GameObject, но он просто выдает мне NullReferenceException, пробовал проверить с помощью TryCatch и выдает мне, что проблема связана с GameObject, который я создал на основном скрипте, но если это так, мне нужно присоединиться к основному объекту, где существует основной скрипт, как более 10 игровых объектов, где сопрограмма существует, я думаю, синглет Это не тот путь, он удаляет мне всю информацию, приведенную выше, путем создания экземпляра Awake, я никогда не думал о создании stati c, поэтому я сделал, как вы сказали, и мне нужно изменить почти мой код, каждый текст прикреплен к каждый объект игры, для того, чтобы не являющийся членом c член работал с нужным членом c, должен удалить Monobehaviour, но это просто заставляет игру взорваться, спасибо за помощь.

1 Ответ

1 голос
/ 28 марта 2020

Создайте два сценария и прикрепите их, например, в основной камере. Первый скрипт содержит ваш таймер со всеми переменными:

using UnityEngine; using System.Collections;

public class TimerToCall : MonoBehaviour {
 //Create your variable
 ...
 //Your function timer
 public IEnumerator Counter() {
  ...
 }
}

Во втором сценарии вы вызовете таймер:

public class callingTimer : MonoBehaviour {
 void Start() {
  //TimerToCall script linked to Main Camera, so
  StartCoroutine(Camera.main.GetComponent<TimerToCall>().Counter());
 }
}

, если вы хотите, чтобы, например, второй сценарий не был связан с любой gameObjet вы можете использовать свойство stati c:

в первом связанном сценарии:

void Start()
{
    StartCoroutine(CallingTimer.ExampleCoroutine());   
} 

во втором сценарии не связано, вы используете свойство stati c:

using System.Collections;
using UnityEngine;

public class CallingTimer
{
    public static IEnumerator ExampleCoroutine()
    {
        //Print the time of when the function is first called.
        Debug.Log("Started Coroutine at timestamp : " + Time.time);

        //yield on a new YieldInstruction that waits for 5 seconds.
        yield return new WaitForSeconds(5);

        //After we have waited 5 seconds print the time again.
        Debug.Log("Finished Coroutine at timestamp : " + Time.time);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...