如何使用C#访问Unity中两个脚本之间的更新变量?

时间:2014-12-02 03:46:29

标签: c# variables unity3d

希望这不是太详细,我不习惯提出编程问题。

我试图用Udemy上的Unity 3D课程进行3D视频游戏开发,尽管使用的是C#而不是Javascript。我刚刚完成了涉及创建太空射击游戏的教程。

其中,用户在按下按钮时会创建一个盾牌。盾牌具有多种用途&#34;在教程完成时实际上没有使用的变量。我试图添加它,并成功地设法实现它,以便每次使用时,我们减少剩余的使用次数,并且一旦该数字<= 0,就不再能够实例化屏蔽。

此变量存储在播放器中,如果我从播放器打印它,它将返回我期望的值。

但是,我使用单独的SceneManager.cs(这是教程放置生命,分数和计时器变量的地方),我将数字打印到GUI中。我的问题是当我尝试从场景管理器打印它时,我无法使用我的使用次数变量来保持当前...它会记录初始值,但之后不会更新。

这是播放器脚本

using UnityEngine;
using System.Collections;

public class player_script : MonoBehaviour {

    // Inspector Variables
    public int numberOfShields  = 2;        // The number of times the user can create a shield
    public Transform shieldMesh;                // path to the shield
    public KeyCode shieldKeyInput;              // the key to activate the shield
    public static bool shieldOff    = true;     // initialize the shield to an "off" state

    public int NumberOfShields
    {
        get{return numberOfShields;}
        set{numberOfShields = value;}
    }

    // Update is called once per frame
    void Update()
    {
        // create a shield when shieldKey has been pressed by player
        if (Input.GetKeyDown (shieldKeyInput)) {
            if(shieldOff && numberOfShields>0)
            {
                // creates an instance of the shield
                Transform clone;
                clone = Instantiate (shieldMesh, transform.position, transform.rotation) as Transform;

                // transforms the instance of the shield
                clone.transform.parent = gameObject.transform;

                // set the shield to an on position
                shieldOff = false;

                // reduce the numberOfShields left
                numberOfShields -=1;

            }
        }

        print ("NumberOfShields = " + NumberOfShields);
    }

    public void turnShieldOff()
    {
        shieldOff = true;
    }

}

当我跑&#34;打印(&#34; NumberOfShields =&#34; + NumberOfShields);&#34;我得到了我期望的价值。 (astroids在与盾牌碰撞时触发turnShieldOff()。

然后在我的场景管理器中...这就是我正在运行的代码:

using UnityEngine;
using System.Collections;

public class SceneManager_script : MonoBehaviour {

// Inspector Variables
public GameObject playerCharacter;
private player_script player_Script;
private int shields = 0;

// Use this for initialization
void Start ()
{
    player_Script = playerCharacter.GetComponent<player_script>();
}

// Update is called once per frame
void Update ()
{
    shields = player_Script.NumberOfShields;
    print(shields);
}

// GUI
void OnGUI()
{
    GUI.Label (new Rect (10, 40, 100, 20), "Shields: " + shields);
}
}

在我的player_script中的NumberOfShields更新时,知道我做错了什么能阻止我的SceneManager脚本中的盾牌更新?

1 个答案:

答案 0 :(得分:1)

我认为你可能已经将预制件分配给了playerCharacter GameObject变量而不是实际的游戏单元。在这种情况下,它将始终打印预制件的默认屏蔽值。而不是通过检查器分配该变量尝试在启动功能中找到玩家GameObject。例如,您可以为播放器对象添加标签,然后:

void Start() {
    playerCharacter = GameObject.FindGameObjectWithTag("Player");
}