目前我只是试图将精灵蜡烛从熄灭变为点亮,此时玩家已“拾起”蜡烛和火柴,蜡烛将在一定时间后“熄灭”。但是,当按下空格键时,即使调试日志应该返回true,也不会发生从unlit到lit的转换。我在这里发布以获得一些指导,因为我一整天都在网上看,并且根本不知道如何继续。 基本上我试图转换的图像是两个不同的图像,它们位于资产下的sprites文件夹中。
这是我到目前为止所做的。
//the two sprites transition
public Sprite unlitCandle;
public Sprite litCandle;
private SpriteRenderer spriteRenderer;
bool pickUpMatches = false;
bool pickUpCandle = false;
float timeRemaining =5;
bool candleLit = false;
// Use this for initialization
void Start () {
spriteRenderer = GetComponent<SpriteRenderer>();
if (spriteRenderer.sprite == null)
spriteRenderer.sprite = unlitCandle;
}
// Update is called once per frame
private void OnTriggerEnter2D(Collider2D collision)
{
if(collision.gameObject.CompareTag("Matches"))
{
collision.gameObject.SetActive(false);
pickUpMatches = true;
}
if (collision.gameObject.CompareTag("UnlitCandle"))
{
collision.gameObject.SetActive(true);
pickUpCandle = true;
}
}
public void CandleTimer()
{
if (candleLit == true)
{
timeRemaining = 5;
timeRemaining -= Time.deltaTime;
if (timeRemaining <= 0)
{
candleLit = false;
spriteRenderer.sprite = unlitCandle;
}
}
}
public void ChangeSprite()
{
if (spriteRenderer.sprite == unlitCandle)
{
spriteRenderer.sprite = litCandle;
}
}
void Update () {
if (pickUpCandle == true && pickUpMatches == true)
{
//Debug.Log(candleLit);
if (Input.GetKey(KeyCode.Space) && !candleLit)
{
CandleTimer();
ChangeSprite();
Debug.Log(timeRemaining);
candleLit = true;
//Debug.Log(candleLit);
}
}
}
}
答案 0 :(得分:0)
尝试与equals()而不是== in等方法进行比较 spriteRenderer.sprite == unlitCandle
因为现在你只是比较参考而不是对象。
至少我认为这就是问题所在。
答案 1 :(得分:0)
您的代码可能存在一些问题。首先,您在changeSprite
的顶部调用Update
,这意味着每个帧都无条件地调用它。因此,在蜡烛的单帧未点亮后,它会立即将其精灵更改为litCandle
。
我认为你每个帧调用changeSprite
的原因是为了处理定时器,如果你已经点燃蜡烛了。实际上,您应该移动代码以将计时器(if
中的第二个changeSprite
语句)处理为单独的函数,并将其命名为processCandleTimer
。在Update
的顶部调用 并保存changeSprite
方法,只在按键上调用。
最后,我怀疑给您带来最多麻烦的问题是您没有重置计时器timeRemaining
。第一次点燃蜡烛时,计时器将在5秒钟后降至0。每次changeSprite
运行后,您都会在第一个litCandle
语句中将精灵更改为if
,然后立即将其更改回unlitCandle
因为计时器在第二个时间为0。要解决此问题,您需要在按键时添加timeRemaining = 5.0f;
之类的行。