Unity无法从PlayerController读取字符串变量

时间:2018-11-22 11:52:33

标签: c# unity3d

我在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);可以正常工作。只会停止切换

1 个答案:

答案 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);
    }
}