2016-12-01 16 views
0

В настоящее время я просто пытаюсь сменить свечи спрайтов от неосвещенных до освещенных, когда игрок «взял» свечу и спички, и свеча «выйдет», после определенного количества времени. Однако при нажатии пробела происходит переход от не горит к освещенному, хотя журнал отладки возвращается true, когда это необходимо. Я размещаю здесь, чтобы получить некоторые рекомендации, поскольку большую часть дня я проводил в Интернете и буквально понятия не имею, как действовать дальше. В основном изображения, с которыми я пытаюсь перейти между двумя изображениями, находятся в папке спрайтов по активам.Sprite не меняется при нажатии клавиши - единство 2D

Это то, что у меня есть до сих пор.

//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

Это не решит что-нибудь, я думаю, но я думаю, вы можете использовать GetKeyDown вместо GetKey. GetKeyDown будет происходить только один раз, а GetKey - каждый кадр, который удерживается нажатой. – Maakep

+0

Также. Таймер свечи никогда не запустится. Сначала вы проверяете, является ли подсвечник ложным. Затем вы переходите к методу CandleLit, где вы проверяете, верно ли это. Это никогда не будет правдой, поскольку оно будет работать только в том случае, если оно ложно. – Maakep

ответ

0

Попробуйте по сравнению с методом, как равных() вместо == в spriteRenderer.sprite == unlitCandle

Потому что сейчас вы просто сравнивающие ссылки, а не объекты.

По крайней мере, я думаю, что проблема.

+0

OP имеет явную ссылку на те спрайты, которые он задает 'spriteRenderer.sprite', и поэтому может сравниться с ними позже. – Brien

0

Существует несколько возможных проблем с кодом. Сначала вы вызываете changeSprite в верхней части Update, что означает, что он безоговорочно вызывается каждый кадр. Поэтому, после того, как один кадр свечи не горит, он немедленно изменит свой спрайт на litCandle.

Я предполагаю, что причина, по которой вы звоните changeSprite, каждый кадр предназначен для обработки таймера, если у вас уже есть свеча. Действительно, вам нужно переместить код для обработки таймера (весь ваш второй оператор if в changeSprite) в отдельную функцию и назвать его чем-то вроде processCandleTimer. Позвоните , что в верхней части Update и сохраните метод changeSprite, который вызывается только при нажатии клавиши.

Наконец, проблема, которая, как я подозреваю, дает вам наибольшую проблему, заключается в том, что вы не сбрасываете свой таймер, timeRemaining. В первый раз, когда вы зажигаете свечу, таймер будет опускаться до 0 после прохождения 5 секунд. Каждый раз, когда changeSprite запускается после этого, вы смените спрайт на litCandle в первом if, а затем немедленно измените его на unlitCandle, потому что таймер равен 0 во втором. Чтобы исправить это, вам нужно добавить строку, как timeRemaining = 5.0f;, когда нажата клавиша.

+0

Привет, Брин, я считаю, что попробовал то, что ты предложил. Однако, когда я запустил время в консоли, я заметил, что он застрял через 5 секунд. Большое спасибо за ваш ответ, мы очень благодарны. – Anonymous5642

+0

Попробуйте изменить оператор if на 'if (Input.GetKey (KeyCode.Space) &&! CandleLit)', чтобы он не возвращался, если горит свеча. Когда время истечет, вам также придется изменить 'candleLit' обратно на false. – Brien

+0

Благодарим за предложение еще раз, но таймер при нажатии на пробел пока остается только 5 секунд.он не обновляется, в консоли он отображает 5 секунд один раз. Я надеюсь, что в этом есть смысл. Я думал, что метод candleTimer уменьшит таймер. Спасибо за вашу помощь. – Anonymous5642