我正在与Unity做一些练习。我基本上想要做的是使用gameManager脚本中的单例设计模式。我想提示玩家击中空间,每次都会导致得分增加,每次健康降低,一旦生命值达到0并且立方体被摧毁,金钱就会增加。我想我把一些脚本分配混淆了,或者我不确定如何引用正确的游戏对象。无论出于何种原因,击中空间不会增加分数或降低健康状况。
我有三个文本:得分,健康和金钱,以及场景中间的一个立方体,分配给它的脚本DestroyBySpace。
我有一个分配给gameManager脚本的gameManager空对象
这是游戏管理器的脚本:
private int currentScore;
private int currentHealth;
private int currentMoney;
public Text scoreText;
public Text healthText;
public Text moneyText;
public static GameManager instance;
void Start()
{
currentScore = 0;
currentHealth = 20;
currentMoney = 0;
updateScore();
updateMoney();
updateHealth();
}
void Awake()
{
instance = this;
}
public void adjustScore(int newScore)
{
currentScore += newScore;
updateScore();
}
public void adjustHealthAndMoney(int newHealth, int newMoney)
{
currentHealth -= newHealth;
updateHealth();
if (currentHealth == 0)
{
currentMoney += newMoney;
updateMoney();
Destroy(gameObject);
}
}
void updateScore()
{
scoreText.text = "Score: " + currentScore;
}
void updateHealth()
{
healthText.text = "Health: " + currentHealth;
}
void updateMoney()
{
moneyText.text = "Money: " + currentMoney;
}
这是我的DestroyBySpace脚本:
public int scoreValue;
public int healthValue;
public int moneyValue;
public GameObject target;
public GameManager gameManager;
void Start()
{
GameObject gameManagerObject = GameObject.FindWithTag("GameManager");
if (gameManagerObject != null)
{
gameManager = gameManagerObject.GetComponent<GameManager>();
}
if (gameManager == null)
{
Debug.Log("Cannot find Game Manager script");
}
}
void onTriggerEnter()
{
if (Input.GetKeyDown(KeyCode.Space))
{
GameManager.instance.adjustHealthAndMoney(healthValue,moneyValue);
GameManager.instance.adjustScore(scoreValue);
}
}
如果你能帮我引导我走向正确的方向,我将不胜感激。
答案 0 :(得分:1)
我认为你已经混淆了monobehavior onTriggerEnter()
所做的事情。
onTriggerEnter()
。这不是检查键盘按下的地方。
您可能想要使用的是Update()
单行为。它运行每一帧,因此您可以保证,如果用户按下某个键,该功能将能够看到它。
您的代码看起来像这样:
void Update(){
if (Input.GetKeyDown(KeyCode.Space))
{
GameManager.instance.adjustHealthAndMoney(healthValue,moneyValue);
GameManager.instance.adjustScore(scoreValue);
}
}
另外,我认为您在gameObject
脚本中Destroy(gameObject)
时误解了gameManager
所指的内容。 gameObject
指的是附加了它所提到的脚本的gameObject。这意味着当您在Destroy(gameObject)
脚本中执行gameManager
时,您正在销毁其附加到的gameManager
脚本的对象。
要摆脱GameObject调用目标,您需要访问它。您可以通过以下几种方式实现这一目标:
1)Destroy(GameObject.Find(“target”));
这会直接搜索名为“target”的GameObject并将其销毁。这样做的缺点是它需要GameObject被称为“目标”,如果有多个GameObjects被称为“目标”,它只会破坏第一个。
2)创建一个公共变量(如public GameObject target
)并通过检查器将目标的物理实例存储在其中。然后当你想要销毁它时,只需Destroy(target)
;
这就是我最有可能做到的。