首页 > 解决方案 > 如何在 Unity 上将值从一个脚本发送到另一个脚本

问题描述

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

问题是我想要退出游戏后的时间总价值。当玩家登录时,该值乘以金钱。所以如果玩家在 30 分钟后连接,玩家将获得 30 分钟乘以金钱的价值。使用 JSON 序列化、公共静态和 PlayerPrefs 但没有。

PlayerPrefs 和 Serialization 似乎工作,但它只记录存储前存储的时间。例如,如果播放器在 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();
}

标签: unity3d

解决方案


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

推荐阅读