如何在Unity上从一个脚本向另一个脚本发送值

问题描述

我在处理一些要发送给的值时遇到问题。

问题是我希望退出游戏后所花费的时间总价值。当玩家登录时,该值乘以金钱。因此,如果玩家在30分钟后进行连接,那么玩家将获得30分钟的价值乘以钱。使用JSON序列化,公共静态和PlayerPrefs,但没有任何作用。

PlayerPrefs和序列化似乎可以正常工作,但是它只记录存储前的存储时间。例如,如果播放器在5秒然后20秒后连接,则第二次获得5秒而不是20秒的值。

脚本A:

public SaveManager save_manager;
public DateTime new_time,old_time;
public TimeSpan gold_reward_time;
public float current_boostValue_gameplay;

private float minutes_booster_gameplay;
private float seconds_booster_gameplay;
private bool is_stopped_booster_gameplay;

private void Start()
{
    new_time = DateTime.Now;
    old_time = DateTime.Parse(PlayerPrefs.GetString("timeData"));
    gold_reward_time = new_time - old_time;
    Get_sum_of_time_reward();
}
private void OnApplicationQuit()
{
    Application.Quit();
    Sum_of_time_passed();
    PlayerPrefs.SetString("timeData",DateTime.Now.ToString());
}
public void Get_sum_of_time_reward()
{
    double time_hour    = Convert.Todouble(gold_reward_time.Hours);
    double time_minutes = Convert.Todouble(gold_reward_time.Minutes);
    double time_seconds = Convert.Todouble(gold_reward_time.Seconds);
    
    double sum_of_time_values = time_hour + time_minutes + time_seconds;
    PlayerPrefs.SetString("totalRewardTime",sum_of_time_values.ToString());
}

脚本B:

public void Calculate_time_as_gold()
{
    string load_resident_menu_data = File.ReadAllText(Application.persistentDataPath + "/resident_menu_data.json");
    resident_data = Json_helper.FromJson<Resident_menu_data>(load_resident_menu_data);

    string load_automation_menu_data = File.ReadAllText(Application.persistentDataPath + "/automation_menu_data.json");
    automation_data = Json_helper.FromJson<Automation_menu_data>(load_automation_menu_data);

    sum_of_all_per_sec = resident_data[0].resident_gold_per_sec + automation_data[0].automation_gold_per_sec;
    sum_of_time_passed = double.Parse(PlayerPrefs.GetString("totalRewardTime"));
    result_reward_after_time = sum_of_all_per_sec * sum_of_time_passed;

    Debug.Log("total value 1 = " + double.Parse(PlayerPrefs.GetString("RewardTimeValue")));
    reward_gold_text.text = Math.Truncate(result_reward_after_time).ToString();
}

解决方法

  1. PlayerPrefs.Save说,您不需要在OnApplicationQuit中手动调用它。好。
  2. 最后在Application.Quit();中呼叫OnApplicationQuit。否则,我猜您的更改可能无法保存。
  3. 如果您这样节省时间:double sum_of_time_values = time_hour + time_minutes + time_seconds;的20分钟看起来不会和20秒一样吗? 为什么不简单地将Update()中的Time.deltaTime添加到变量?时间将以秒为单位。