unity3d - 如何在 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();
}
解决方案
- PlayerPrefs.Save表示您不需要在 OnApplicationQuit 中手动调用它。好的。
- 最后打电话
Application.Quit();
进来OnApplicationQuit
。否则我猜您的更改可能无法保存。 - 如果你像这样节省时间:
double sum_of_time_values = time_hour + time_minutes + time_seconds;
20 分钟看起来和 20 秒不一样吗?为什么不简单地将Time.deltaTime
in Update() 添加到变量中?时间将以秒为单位。
推荐阅读
- excel - Excel VBA - 调试调用未在选定工作表中使用的函数
- r - 使用开始日期和结束日期计算每月的保留率
- javascript - 如何在这个例子中添加“部件”/redux
- reactjs - React-Tinder-Cards 循环(没有更多卡片时的功能)
- r - 闪亮的白色空间
- unit-testing - 我如何确保我通过单元测试(Retrofit,Koin,Mockito)传递了正确的标题
- reactjs - 尝试使用 firebase 将时间戳添加到社交媒体 Web 应用的评论部分时出错
- spring-boot - Angular 10 和 Spring Boot 1.5 之间的 CORS 问题
- python - 用熊猫中的行交换列
- swift - TableView:是否可以在不重新加载 tableview 或部分的情况下删除现有行并插入新行?