繁体   English   中英

在 Unity 中创建游戏时间系统 C#

[英]Creating a game time system in Unity C#

我正在尝试在 Unity 中为我的游戏制作一个游戏系统。这是一个使用湖泊图像的 2D 钓鱼游戏。您单击某处以投掷鱼竿并开始钓鱼。我想在游戏中加入时间系统,主要是因为我想代表鱼的“每小时活动”行为。 我想在清晨鱼更活跃并且你得到更多鱼饵的地方,或者如果是夜间 - 特定类型的鱼更活跃的地方。 另外,我想在时钟敲响时实现它,例如 20:00,慢慢开始降低 SpriteRenderer RGB 颜色值。 这会使画面“变暗”,并提供越来越暗的沉浸感。 到 23:00 时,画面几乎完全黑了。

这里所说的是我在我的脚本中试图做的。 我有一个名为 TimeSystem 的脚本。 在那里我有 2 个属性“Hour”和“Minute”以及 2 个名为“timer”和 minuteToRealTime 的浮点字段以表示游戏分钟。

然后,在 Update 方法中设置 timer -= Time.deltaTime; 然后我开始检查:

     if (timer <= 0)
     {
        Minute++;

        OnMinuteChanged?.Invoke();
        if (Minute >= 60)
        {
            Hour++;
            Minute = 0;

            if (Hour >= 24)
            {
                Hour = 0;
                
            }
            OnHourChanged?.Invoke();

        }

然后设置 timer = minuteToRealTime;

如果它达到 60,我会进行这些检查以将我的分钟设置回 0,或者如果它达到 24,则将小时设置回 0。

另外,我正在尝试使用 Action delegate 在特定的时间或分钟触发事件。 (根本不知道这是否是正确的方法)

所以这是我的问题。

之后我检查一下现在是几点,然后我尝试执行以下操作:

if (Hour >= 20 || Hour <= 4) // if the hour is between 20:00 and 04:00 i do the darkening process
            {
                float oldRValue = _gameObject.GetComponent<SpriteRenderer>().color.r;
                float oldGValue = _gameObject.GetComponent<SpriteRenderer>().color.g;
                float oldBValue = _gameObject.GetComponent<SpriteRenderer>().color.b;

                _gameObject.GetComponent<SpriteRenderer>().color = new Color(oldRValue - 0.004f, oldGValue - 0.004f, oldBValue - 0.004f,255);
            }
            else 
            {
               //same thing here but increasing color values so the picture brighens up again until 255,255,255,255 RGB and alpha values
            }
            timer = minuteToRealTime

基本上将旧的 RGB 值存储在局部变量中,并且每帧按指定的数量减少或增加它们(我在示例中使用 -0.004f 但这只是一个示例。如果一切正常,很容易通过尝试不同的数字来平衡这些数字,所以图片变暗更平滑)。

所以我从假设 12:00 时钟上升到 20:00 开始我的游戏,然后它在第一个检查时间 >= 20:00 的地方开始,所以它开始使图片变暗。 哪个工作得很好。 然后在早上 5:00 时,图片开始慢慢变亮。 昨天尝试并测试了它,它看起来和感觉都很好,一切都在相应地工作……直到我检查第二个周期会发生什么。 因此,在凌晨 5:00 之后,画面变得更亮,一切都很酷,但是当比赛第二次打到 20:00 时,什么也没有发生。 我的代码仅在前 24 小时内执行,当我将小时数重置为 0 时,它停止工作。我还附加了一个文本网格,它在 UI 中显示时钟,并且时间的文本表示是正确的。 文本正在正常工作,它将分钟计算为 60,然后将它们重置为 0,并将 +1 加到小时。当小时数达到 24 时,它们将重置为 0,并且相同的过程在 indef.netly 重复。 所以我希望“改变图片的 colors”能够按小时工作,但不知何故它只在第一次工作......它只工作一次,就是这样......当时钟再次敲响 20: 00 第二天图片 colors 果然没有变暗。

我想指出,我对编程和所有方面都还很陌生,我主要制作控制台应用程序,例如 TicTacToe 和 PingPong 或类似的游戏。 但我想更进一步,开始学习使用 Unity。 所以是的,现在我有一个简单的背景场景,带有 1 个按钮的 ui 面板,当您单击它时显示 map 和时钟的文本网格(它工作得很好,至少看起来)。 现在我正在处理我想在我的游戏中制作的时间,但我卡住了并且无法找到解决方案。 我在网上读到可以使用 .NET 中内置的 DateTime 和 Timespan 结构,然后更新每一帧的时间。但我不知道该怎么做。 如果有更简单的方法来制作游戏日期和时间系统,请告诉我。 我也希望有几秒钟和几年......也许几个月也不错,或者在我的游戏中内置一个完整的日历系统。 但是..我不知道如何构建它所以我选择先尝试使用分钟和小时..

无论如何,如果有人真正阅读它,因为它的长 AF,那是一长串文本 IDK,但我希望得到一些帮助。如果您需要有关我的代码的更多信息,请告诉我,但我认为我涵盖了最重要的内容。

在一个理想的场景中,我希望我的游戏时钟将时间表示为小时:分钟,并且旁边可能有一个文本说星期一,星期二,星期三..这样我有一天可以在游戏活动中制作,例如现在你的时间是星期一 14:00,我可以介绍一个可能在星期五 14:00 开始的“锦标赛”。 因此,当游戏中变成星期五 14:00 时,您可以 go 到比赛地点并开始钓鱼比赛。 但是,是的,那只是我现在的梦想:D

无论如何,谢谢你的时间,祝你有美好的一天::)

我让它与 DateTime 一起工作。 事实证明,只需将 AddMinutes(1) 添加到我的当前时间并相应地更新它就很容易了:我在一个 50 行的脚本中得到了我想要的一切!我为自己感到自豪,再次感谢 Jay 为我指明了正确的方向:丁

我必须注意一件重要的事情,关于 SpriteRenderer.Color R GB 属性,它们默认从 1 开始。 我以为它们从 255 开始,我试图降低该值,但这弄乱了我的代码。 相反,您想要的是减去/添加(取决于您的需要)浮动数字,例如 0 和 1 之间的 0.004f,以便使图像变亮或变暗:)

只是说供将来遇到该问题的任何人参考,他们可能会发现这很有用:) 所以这个话题已经解决了!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM