希望这不是太详细,我不习惯提出编程问题。
我试图用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脚本中的盾牌更新?
答案 0 :(得分:1)
我认为你可能已经将预制件分配给了playerCharacter GameObject变量而不是实际的游戏单元。在这种情况下,它将始终打印预制件的默认屏蔽值。而不是通过检查器分配该变量尝试在启动功能中找到玩家GameObject。例如,您可以为播放器对象添加标签,然后:
void Start() {
playerCharacter = GameObject.FindGameObjectWithTag("Player");
}