Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 统一设置时间选择_C#_Unity3d - Fatal编程技术网

C# 统一设置时间选择

C# 统一设置时间选择,c#,unity3d,C#,Unity3d,我正在做一个团结项目。 我的项目中有两个场景 在第一个场景中。我设置了三个按钮,分别是“1分钟”、“2分钟”和“3分钟”。 我想在我的第二个场景(游戏场景)中有相应的游戏持续时间。 我的脚本中有倒计时功能 现在我按照本教程的步骤使用单例模式 问题是当我运行游戏时,三个文本的时间同时开始。 我在场景一中的按钮可以控制加载场景,但不能选择时间 以下是代码。在连接到PersistentManager游戏对象的PersistentManager脚本中: using System.Collections;

我正在做一个团结项目。 我的项目中有两个场景

在第一个场景中。我设置了三个按钮,分别是“1分钟”、“2分钟”和“3分钟”。 我想在我的第二个场景(游戏场景)中有相应的游戏持续时间。 我的脚本中有倒计时功能

现在我按照本教程的步骤使用单例模式

问题是当我运行游戏时,三个文本的时间同时开始。 我在场景一中的按钮可以控制加载场景,但不能选择时间

以下是代码。在连接到PersistentManager游戏对象的PersistentManager脚本中:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class PersistentManagerScript : MonoBehaviour
{public static PersistentManagerScript Instance { get; private set; }

public int Value;
// Start is called before the first frame update

private void Awake()
{
    if (Instance == null)
    {
        Instance = this;
        DontDestroyOnLoad(gameObject);
    }
    else
    {
        Destroy(gameObject);
    }
}
}

在场景管理器脚本中:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class SceneManagerScript : MonoBehaviour
{
 public GameObject CountDownIn1;
public GameObject CountDownIn2;
public GameObject CountDownIn3;
public Text ValueText;
public Text ValueText1;
public Text ValueText2;
private void Start()
{
    switch (this.gameObject.name)
    {
        case "Button1min":
            SetGameTimeEqualOne();
            break;
        case "Button2mins":
            SetGameTimeEqualTwo();
            break;
        case "Button3mins":
            SetGameTimeEqualThree();
            break;
    }
}  


public void SetGameTimeEqualOne()
{
    CountDownIn1.SetActive(true);
    ValueText.text = PersistentManagerScript.Instance.Value.ToString();
    Debug.Log("COUNTDOWN1 active");
    //DontDestroyOnLoad(this.CountDownIn1);
}
public void SetGameTimeEqualTwo()
{
    CountDownIn2.SetActive(true);
    Debug.Log("COUNTDOWN2 active");
    ValueText1.text = PersistentManagerScript.Instance.Value.ToString();
    DontDestroyOnLoad(this.gameObject);
}
public void SetGameTimeEqualThree()
{
    CountDownIn3.SetActive(true);
    Debug.Log("COUNTDOWN3 active");
    ValueText2.text = PersistentManagerScript.Instance.Value.ToString();
    DontDestroyOnLoad(this.gameObject);
}

如有任何建议,将不胜感激

在场景之间传递数据有多种方式。最常见的建议是使用由每个场景中的其他脚本使用的。然而,这可能过于复杂

有趣的是,Unity较新的ScriptableObjects也可以用于类似的策略。由于ScriptableObject的持久化范围高于场景,因此可以使用它们在场景之间保存数据,而无需使用静态和单例。我更喜欢在对象和场景之间传递数据,方法是创建一个通用的可编写脚本的对象,并在每个需要共享数据的脚本中引用该资源(无论场景如何)

下面是一个使用您的需求的示例:

GameData.cs

[CreateAssetMenu(fileName = "GameData", menuName = "Game Data")]
public class GameData: ScriptableObject
{
    float gameDuration; //This is where you will store and read your selected game duration
}
GameSelection.cs此脚本存在于场景1中

Countdown.cs此脚本存在于场景2中


现在,您可以在项目文件夹中创建GameData资源,并将其拖动到场景1中的检查器和场景2中的检查器中。如果Scene1更改计时器的值,Scene2将知道该值。此外,您可以在GameData资产上设置gameDuration的默认值,并运行/测试场景2,而无需先运行场景1

哪一部分给你带来了麻烦?将倒计时时间传递到第二个场景?倒计时计时器逻辑?除了Erik提到的,你能展示你到目前为止做了什么吗?我有三个倒计时游戏对象是我的场景1和场景2中。我想使用“设置活动”,当我单击按钮1时,1分钟内的倒计时将激活。同样,当我单击按钮2时,2分钟后的倒计时将激活。你认为这是一种正确的实施方式吗?问题是我真的不知道如何将另一个场景中的游戏对象设置为活动状态。
因为ScriptableObjects的持久化范围比场景更高
不知道。ScriptableObjects是如何创建“持久化范围比场景更高”的序列化数据对象。
扩展ScriptableObject的代码不知道,它基本上是一个静态单例,其唯一目的是序列化和反序列化数据。可能还有其他一些辅助功能,但作为内存对象,不需要。ScriptableObjects的作用域不在场景级别。它们不仅仅用于序列化数据。看看Unity的scriptableObjects架构:
scriptableObjects没有在场景级别定义范围。
<代码>它们不仅仅用于序列化数据。
那篇链接文章的第一行:“允许您独立于脚本实例存储大量共享数据。”这就是我所说的。这篇文章重点介绍了“Ryan使用可脚本对象构建的三大酷事”。很明显,您没有读过这篇文章,因为它还非常广泛地讨论了事件和系统。它使用一个可编写脚本的对象作为事件处理程序的持有者,它没有创建或启用它们,它只是提供了一个放置(序列化)处理程序的位置。另外两个“酷东西”是数据(字面意思)和他所称的系统,它们“将在场景加载之间保持状态,而无需任何特殊初始化”,这也是数据。
public class GameSelection : Monobehaviour
{
    public GameData gameData; 

    public void SetDuration(float time) //Call this method from each button with a different parameter
    {
        gameData.gameDuration = time;
    }
}
public class Countdown: Monobehaviour
{
    public GameData gameData; 
    float countdownTimer;

    public void Start()
    {
        countdownTimer = gameData.gameDuration;
    }

    //... rest of your countdown script
}