无法从 Unity 中的主场景加载多个场景?
Unable to load multiple scenes from a primary scene in Unity?
我的游戏玩法是这样的,我希望我的场景执行以下流程:
- 场景 1 -> 场景 2 -> 场景 1
- 场景 1 -> 场景 3 -> 场景 1
- 场景 1 -> 场景 4 -> 场景 1
- 场景 1 -> 场景 5 -> 场景 1
我有 4 个不同的触发器导致 4 个不同的场景。但是每次我启动 Scene1 时,在第一次接触任何触发器时实例化的场景,无论下一个触发器导致哪个场景,都会再次实例化。
我在这里做错了什么?
如何解决?
您在上图中看到的碰撞器是 4 个触发器。每个触发器的代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class enter4kWorld : MonoBehaviour {
//Orb Transform
public GameObject targetGO;
public GameObject otherTargetGO1;
public GameObject otherTargetGO2;
public GameObject otherTargetGO3;
public Animator LightBurst;
public GameObject Processor;
public GameObject SceneExitGO;
public float CountDownTimer;
// Use this for initialization
void Start () {
}
void OnTriggerEnter(Collider other)
{
if (other.tag == "GameController")
{
Debug.Log("Teleporter works");
SceneExitGO.SetActive(true);
targetGO.SetActive(true);
otherTargetGO1.SetActive(false);
otherTargetGO2.SetActive(false);
otherTargetGO3.SetActive(false);
}
}
// Update is called once per frame
void Update()
{
if (SceneExitGO.activeSelf)
{
//float step = speed * Time.deltaTime;
//transform.position = Vector3.MoveTowards(transform.position, target.position, step);
CountDownTimer -= Time.deltaTime;
if (Processor.transform.position.y <= 9f)
{
Processor.transform.Translate(Vector3.up * Time.deltaTime * 1.5f, Space.World);
}
if (CountDownTimer <= 4.5)
{
LightBurst.SetTrigger("TriggerLightBurst");
}
if (CountDownTimer <= 0)
{
ChangeScene();
CountDownTimer = 0;
}
}
}
public void ChangeScene()
{
SceneManager.LoadScene("Scene2");
//SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
}
}
自己编写一个真正的触发器,在输入时触发 UnityEvent。
有一个单独的 MonoBehaviour 来启动新场景。
在您的编辑器中,只需将上面提到的场景启动组件拖到UnityEvent 上,让该事件调用加载下一个场景的方法。像这样:
public class Trigger : MonoBehaviour
{
public UnityEvent OnEnter;
[SerializeField]
private string tag;
private void OnTriggerEnter(Collider other)
{
if(other.CompareTag(tag) && OnEnter != null)
OnEnter.Invoke();
}
}
这是要调用的 class:
public class SceneManagement : MonoBehaviour
{
public void LoadScene(string name)
{
SceneManager.LoadScene(name);
}
}
注意:我不保证这没有错误,我没有检查它是否有效,我只是根据经验写下来的。但我希望你明白这个概念。
感谢朋友让我解决了这个问题。这里的问题是附加到所有触发器的所有脚本都是相似的,如果你仔细观察,它们都包含相同的 public 游戏对象,即 SceneExitGO。一旦 SceneExitGO 激活,附加到每个触发器的所有脚本都会被激活,以在 Update 函数中执行它们各自的操作。这种情况称为 "race condition",当多个组件或脚本同时 运行 以实现一个结果时,就会发生冲突。我只是通过将 public GameObject 更改为私有 Bool.
来解决这个问题
我的游戏玩法是这样的,我希望我的场景执行以下流程:
- 场景 1 -> 场景 2 -> 场景 1
- 场景 1 -> 场景 3 -> 场景 1
- 场景 1 -> 场景 4 -> 场景 1
- 场景 1 -> 场景 5 -> 场景 1
我有 4 个不同的触发器导致 4 个不同的场景。但是每次我启动 Scene1 时,在第一次接触任何触发器时实例化的场景,无论下一个触发器导致哪个场景,都会再次实例化。
我在这里做错了什么?
如何解决?
您在上图中看到的碰撞器是 4 个触发器。每个触发器的代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class enter4kWorld : MonoBehaviour {
//Orb Transform
public GameObject targetGO;
public GameObject otherTargetGO1;
public GameObject otherTargetGO2;
public GameObject otherTargetGO3;
public Animator LightBurst;
public GameObject Processor;
public GameObject SceneExitGO;
public float CountDownTimer;
// Use this for initialization
void Start () {
}
void OnTriggerEnter(Collider other)
{
if (other.tag == "GameController")
{
Debug.Log("Teleporter works");
SceneExitGO.SetActive(true);
targetGO.SetActive(true);
otherTargetGO1.SetActive(false);
otherTargetGO2.SetActive(false);
otherTargetGO3.SetActive(false);
}
}
// Update is called once per frame
void Update()
{
if (SceneExitGO.activeSelf)
{
//float step = speed * Time.deltaTime;
//transform.position = Vector3.MoveTowards(transform.position, target.position, step);
CountDownTimer -= Time.deltaTime;
if (Processor.transform.position.y <= 9f)
{
Processor.transform.Translate(Vector3.up * Time.deltaTime * 1.5f, Space.World);
}
if (CountDownTimer <= 4.5)
{
LightBurst.SetTrigger("TriggerLightBurst");
}
if (CountDownTimer <= 0)
{
ChangeScene();
CountDownTimer = 0;
}
}
}
public void ChangeScene()
{
SceneManager.LoadScene("Scene2");
//SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
}
}
自己编写一个真正的触发器,在输入时触发 UnityEvent。
有一个单独的 MonoBehaviour 来启动新场景。
在您的编辑器中,只需将上面提到的场景启动组件拖到UnityEvent 上,让该事件调用加载下一个场景的方法。像这样:
public class Trigger : MonoBehaviour
{
public UnityEvent OnEnter;
[SerializeField]
private string tag;
private void OnTriggerEnter(Collider other)
{
if(other.CompareTag(tag) && OnEnter != null)
OnEnter.Invoke();
}
}
这是要调用的 class:
public class SceneManagement : MonoBehaviour
{
public void LoadScene(string name)
{
SceneManager.LoadScene(name);
}
}
注意:我不保证这没有错误,我没有检查它是否有效,我只是根据经验写下来的。但我希望你明白这个概念。
感谢朋友让我解决了这个问题。这里的问题是附加到所有触发器的所有脚本都是相似的,如果你仔细观察,它们都包含相同的 public 游戏对象,即 SceneExitGO。一旦 SceneExitGO 激活,附加到每个触发器的所有脚本都会被激活,以在 Update 函数中执行它们各自的操作。这种情况称为 "race condition",当多个组件或脚本同时 运行 以实现一个结果时,就会发生冲突。我只是通过将 public GameObject 更改为私有 Bool.
来解决这个问题