-1

我的游戏玩法是这样的,我希望我的场景执行这个流程:

  • 场景 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);
   }
}
4

2 回答 2

0

为自己编写一个真正的触发器,在输入时触发 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();
    }
}

这是要调用的类:

public class SceneManagement : MonoBehaviour
{
    public void LoadScene(string name) 
    {
        SceneManager.LoadScene(name);
    }
}

注意:我不保证这是没有错误的,我没有检查它是否有效,我只是根据经验写下来。但我希望你明白这个概念。

于 2017-07-07T20:47:18.687 回答
0

感谢一位朋友,我来解决这个问题。这里的问题是附加到所有触发器的所有脚本都是相似的,如果仔细观察,它们都包含相同的公共 GameObject,即 SceneExitGO。一旦 SceneExitGO 被激活,所有附加到每个触发器的脚本都会被激活以在 Update 函数中执行它们各自的操作。这种情况称为“竞争条件”,当多个组件或脚本同时运行以实现某个结果时,就会发生冲突。我只是通过将公共 GameObject 更改为私有 Bool 来解决这个问题。

于 2017-07-30T18:22:32.203 回答