我在PlayerController中设置了一个public string startPoint
。我正在从另一个脚本PortalController访问此字符串,并且正在设置和阅读它在大多数情况下都有效。
我的问题是:
从PortalController加载第一个开始场景时,我读了Debug.Log(thePlayer.startPoint);
我可以设置startPoint
并加载第二个场景,并且可以从Unity面板中确认确实为第二个场景中的PlayerController设置了它。
但是,我无法从第二个场景中读取Debug.Log(thePlayer.startPoint);
。它显示为空白,长度为0。没有错误。
PlayerController
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour {
float speed = 2f;
Vector2 targetPos;
private Rigidbody2D myRigidbody;
private Animator myAnim;
private static bool playerExists;
public string startPoint;
private void Start()
{
startPoint = "startValue";
myRigidbody = GetComponent<Rigidbody2D>();
myAnim = GetComponent<Animator>();
if(!playerExists){
playerExists = true;
DontDestroyOnLoad(transform.gameObject);
} else {
Destroy(gameObject);
}
targetPos = transform.position;
}
PortalController
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class PortalController : MonoBehaviour {
[SerializeField]
private string sceneToLoad;
public string portalName;
public string spawnPortal;
private PlayerController thePlayer;
private CameraController theCamera;
// Use this for initialization
void Start () {
thePlayer = FindObjectOfType <PlayerController>();
//works in the first scene but not in the second
Debug.Log(thePlayer.startPoint);
if (thePlayer.startPoint == portalName)
{
thePlayer.transform.position = transform.position;
//Debug.Log(thePlayer.startPoint);
}
}
// Update is called once per frame
void Update () {
}
private void OnTriggerEnter2D(Collider2D collision)
{
if(collision.gameObject.name == "Player"){
thePlayer.startPoint = spawnPortal;
SceneManager.LoadScene(sceneToLoad);
}
}
}
在场景之间不会破坏Player对象,而是会创建新的门户游戏对象。似乎在第二个场景中创建了带有PortalController的新门户游戏对象时,它无法访问场景中的PortalController在PlayerController中的字符串startPoint
中。
如果我直接加载两个场景Debug.Log(thePlayer.startPoint);
可以正常工作。只会停止切换
答案 0 :(得分:0)
我刚刚在第一个场景中使用PlayerController和PortalController并在第二个场景中仅使用PortalController尝试了您的代码,输出就是您所期望的,没有错误,并且完美地获得了startPoint值。
但是请确保第二个场景播放器在开始时不会与portalController碰撞,否则它将调用TriggerEnter并设置第二个场景的PortalController的SpawnPortal的值,该值可以为空,这就是为什么出现此问题的原因。
您可以在triggerEnter中通过调试进行检查。
private void OnTriggerEnter2D(Collider2D collision)
{
Debug.Log("OnTriggerEnter " + collision.gameObject.name);
if (collision.gameObject.name == "Player")
{
thePlayer.startPoint = spawnPortal;
SceneManager.LoadScene(sceneToLoad);
}
}