Per the video, it would appear that you link portals by matching the scene number and destination, but it does not seem to work that way consistently. Here is an representation of three scenes from my project, which I am trying to connect with portals:
For some reason, when I try to load scene 3, the portal in scene 2 fades out, produces a Missing Reference Exception, and reloads scene 2 (not 3).
Occasionally the error is something different, such as “null reference” or “can not instantiate”, but I dont have screens for those because I could not consistently repeat those fact patterns.
Some other notes:
- I am using the same player prefab in all scenes, as part of the Core prefab
- My persistent object loader does not delete the “Scene 3 Destination A” portal from the hierarchy and instead creates clones of itself (because the error occurs on the line with “newPlayerController.enabled = true”)
Here is my portal code:
public class Portal : MonoBehaviour
{
enum DestinationIdentifier
{
A, B, C, D, E
}
[SerializeField] int sceneToLoad = -1;
[SerializeField] Transform spawnPoint;
[SerializeField] DestinationIdentifier destination;
[SerializeField] float fadeOutTime = 1f;
[SerializeField] float fadeInTime = 2f;
[SerializeField] float fadeWaitTime = 0.5f;
private void OnTriggerEnter(Collider other)
{
if (other.tag == "Player")
{
StartCoroutine(Transition());
}
}
private IEnumerator Transition()
{
if (sceneToLoad < 0)
{
Debug.LogError("Scene to load not set.");
yield break;
}
DontDestroyOnLoad(gameObject);
Fader fader = FindObjectOfType<Fader>();
SavingWrapper savingWrapper = FindObjectOfType<SavingWrapper>();
PlayerController playerController = GameObject.FindWithTag("Player").GetComponent<PlayerController>();
//Remove control
playerController.enabled = false;
yield return fader.FadeOut(fadeOutTime);
savingWrapper.Save();
yield return SceneManager.LoadSceneAsync(sceneToLoad);
PlayerController newPlayerController = GameObject.FindWithTag("Player").GetComponent<PlayerController>();
//Remove control
newPlayerController.enabled = false;
savingWrapper.Load();
Portal otherPortal = GetOtherPortal();
UpdatePlayer(otherPortal);
savingWrapper.Save();
yield return new WaitForSeconds(fadeWaitTime);
fader.FadeIn(fadeInTime);
//Restore control
newPlayerController.enabled = true;
Destroy(gameObject);
}
private void UpdatePlayer(Portal otherPortal)
{
GameObject player = GameObject.FindWithTag("Player");
player.GetComponent<NavMeshAgent>().enabled = false;
player.transform.position = otherPortal.spawnPoint.position;
player.transform.rotation = otherPortal.spawnPoint.rotation;
player.GetComponent<NavMeshAgent>().enabled = true;
}
private Portal GetOtherPortal()
{
foreach (Portal portal in FindObjectsOfType<Portal>())
{
if (portal == this) continue;
if (portal.destination != destination) continue;
return portal;
}
return null;
}
}
Has anyone else had this issue come up? I’m mostly not sure why its an issue with some scenes but not with others.