如何重置 DontDestroyonLoad 下的游戏对象?

我在一个单独的场景中使用以下脚本来保持我的对象“玩家”(它是一辆汽车)并加载另一个场景。

DontDestroyOnLoad(transform.gameObject);
SceneManager.LoadSceneAsync(1);

但是在我的游戏中,汽车的状态会像它的速度、指示器、被击中的等级一样改变。

当我单击“重新启动游戏”按钮时,我想将这辆车的状态重置为原始状态。

除了摧毁汽车并切换回原始场景再次执行 DontDestroyOnLoad 之外,我还有什么办法可以重置汽车?

stack overflow How Can I Reset a Gameobject which was under DontDestroyLoad?
原文答案

答案:

作者头像

如果我理解正确的话,您将公共变量设置为用户定义的值,并且您希望这些是用户在重新加载初始场景时分配的初始值。有两种解决方案:

(a) 销毁 DontDestroyOnLoad 游戏对象,这样当您重新加载初始场景时,将创建一个新实例,因此您的用户定义值将被保留。所以当你想从结束场景重新加载到初始场景时,创建一个脚本并添加这些:

Destroy (GameObject.Find("NameOfTheGameObject"));
SceneManager.LoadSceneAsync(1);

(b) 保留汽车及其脚本,而是创建另一个脚本并将初始值复制到第二个脚本。例如,将以下代码附加到新脚本并将该脚本附加到您的汽车游戏对象:

脚本 1 - DontDestroyOnLoad

public int Acceleration_Of_Car = 20;
public int Car_Force = 100;

public static ClassNameHere instance;

 void Awake()
 {
      if(instance == null)
      {
           instance = this;
           DontDestroyOnLoad(gameObject);
      }else if(instance != this)
      {
           Destroy(gameObject);
      }
 }

现在在 End Scene 甚至 Initial Scene 中创建第二个脚本。创建与第一个脚本相同的变量,以免混淆。将第一个脚本的值复制到第二个脚本,然后将第二个脚本的值应用到第一个脚本。

脚本 2 - 复制并应用

public int Acceleration_Of_Car;
public int Car_Force;

private Script1 script1; //Reference your first script here
public void Start()
{
   script1 = (Script1) GameObject.FindObjectOfType(typeof(Script1)); //Call the first script
}

public void CopyValues()
{
  Acceleration_Of_Car = script1.Acceleration_Of_Car;
  Car_Force = script1.Car_Force;
}

public void ApplyValues()
{
 script1.Acceleration_Of_Car = Acceleration_Of_Car;
 script1.Car_Force = Car_Force;
}

我会说即使对于第二个脚本也最好使用 DontDestroyOnLoad() 这样就不会运行其他实例:)

作者头像
    Destroy(GameObject.Find("GameObjectName"));
    SceneManager.LoadSceneAsync(SceneIndex);