按下键时Sprite不会改变 - 统一2D

时间:2016-12-01 20:09:16

标签: c# unity3d 2d sprite

目前我只是试图将精灵蜡烛从熄灭变为点亮,此时玩家已“拾起”蜡烛和火柴,蜡烛将在一定时间后“熄灭”。但是,当按下空格键时,即使调试日志应该返回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);
        }
    }
}

}

2 个答案:

答案 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;之类的行。