2017-02-15 31 views
2

Я создает кнопки, когда создается мое «Меню выбора героев». Эти кнопки будут получить их связанные изображения/Sprites в зависимости от «Героя», который они будут представлять.Unity3D C# Button sprite swap - прикрепить изображения во время выполнения

У меня есть следующий метод, но я не понимаю , какую переменную я должен применить спрайты к.

Button _thisButton; 
Sprite _normalSprite; 
Sprite _highlightSprite; 

protected override void DoStateTransition (SelectionState state, bool instant){ 
    switch (state) { 
    case Selectable.SelectionState.Normal: 
     _thisButton.image = _normalSprite; //.image is not correct 
     Debug.Log("statenormalasd"); 
     break; 
    case Selectable.SelectionState.Highlighted: 
     _thisButton.image = _normalSprite; //.image is not correct 
//... 
    } 

Государства, безусловно, работают, я подтвердил это через Debug.Log (...);

Опять проблема: какое значение нужно изменить, если нет .image?

Спасибо заранее, Csharpest

ответ

5

Вы пытаетесь прикрепить спрайт к компоненту кнопки. Спрайт находится в компоненте Image. Проверь это!

GameObject buttonGameObject; 
Sprite newSprite; 

void Start() { 
    buttonGameObject.GetComponent<Image>().sprite = newSprite; 
} 

Но исправить свой код, вы, вероятно, сделать что-то вроде:

Button _thisButton; 
Sprite _normalSprite; 
Sprite _highlightSprite; 

protected override void DoStateTransition (SelectionState state, bool instant){ 
    switch (state) { 
    case Selectable.SelectionState.Normal: 
     _thisButton.GetComponent<Image>().sprite = _normalSprite; 
     Debug.Log("statenormalasd"); 
     break; 
    case Selectable.SelectionState.Highlighted: 
     _thisButton.GetComponent<Image>().sprite = _normalSprite;  
    } 
+1

Действительно. Ну, это неловко: D. Большое спасибо ^^ может принять ваш ответ за 3 минуты. – Csharpest

+0

Да, я на самом деле кешу в поле «_thisButtonImage = _thisButton.GetComponent ();» in void Start(). Затем я просто назову «_thisButtonImage.sprite = _normalSprite;». Я предполагаю, что он более эффективен, чем вызов GetComponent каждый раз, когда изменяется состояние. Это правда? – Csharpest

+0

Действительно, очень верно! – Maakep

2

Если вы хотите изменить кнопку spriteswap спрайтов в сценарии вы должны использовать spriteState, вы можете сделать что-то вроде это;

Button _thisButton; 
Sprite _normalSprite; 
Sprite _highlightSprite; 

void ChangeSprites(){ 
    // _thisButton.transition = Selectable.Transition.SpriteSwap; 
    var ss = _thisButton.spriteState; 
    _thisButton.image.sprite = _normalSprite; 
    //ss.disabledSprite = _disabledSprite; 
    ss.highlightedSprite = _highlightSprite; 
    //ss.pressedSprite = _pressedSprie; 
    _thisButton.spriteState = ss; 
} 

Единство делает своп в кнопке автоматически, если вы используете обычную кнопку и выбрав SpriteSwap, если вам необходимо изменить вариант перехода, то раскомментируйте первую строку функции.

+0

О, это здорово! – Maakep

+0

Ага! Так предполагается, что spriteState будет использоваться. Большое спасибо, я использую вашу версию вместо той, которая использует переопределение на «DoStateTransition (...)». Я предполагаю, что ваш более эффективный, он придает спрайтам компонент кнопки во время выполнения, вот как мне это нравится! – Csharpest