2017-02-16 3 views
0

Я пытаюсь изменить спрайт игроков в сцене. У меня есть скрипт, который управляет сценарием, когда вы переключаетесь с плеера на другой. Я хотел бы добавить функцию, которая при переключении неактивного игрока идет черным & белый зажженный спрайтом, а активный игрок - цветным спрайтом. Может ли кто-нибудь помочь, потому что не меняет спрайт на игрока первым, а второй игрок GameObject?Изменение спрайта игрока при касании кнопки Unity 2D

Вот код:

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 

public class switchCharacter : MonoBehaviour { 

    public GameObject Psyco1; 
    public GameObject Psyco2; 
    public PlayerControllerPsyco1 script1; 
    public PlayerControllerPsyco2 script2; 
    public Sprite sprite1; // Psyco1 color 
    public Sprite sprite2; // Psyco2 decolorized 
    public SpriteRenderer spriteRendererPsyco1; 
    public SpriteRenderer spriteRendererPsyco2; 

    void Start(){ 
     script1 = Psyco1.GetComponent<PlayerControllerPsyco1>(); 
     script2 = Psyco2.GetComponent<PlayerControllerPsyco2>(); 
     script1.enabled = true; 
     script2.enabled = false; 
     spriteRendererPsyco1 = GetComponent<SpriteRenderer>(); 
     spriteRendererPsyco2 = GetComponent<SpriteRenderer>(); 
     if (spriteRendererPsyco1.sprite == null) // if the sprite on spriteRenderer is null then 
      spriteRendererPsyco1.sprite = sprite1; // set the sprite to Psyco1 Color 
    } 

    void Update(){ 
     if (Input.GetButtonDown("switch1")){ 
      script1.enabled = !script1.enabled; 
      script2.enabled = !script2.enabled; 
      //spriteRendererPsyco1.sprite = sprite2; 
      DesaturizePsyco(); // call method to change Psyco sprite 
     } 
    } 

    public void changeCharacterBtn() { 
     if (script1.enabled = !script1.enabled) // if the spriteRenderer sprite = sprite1 then change to sprite2 
     { 
      GameObject.Find ("PlayerFirst").GetComponent<SpriteRenderer>().sprite = sprite2; 
     } 
     //script1.enabled = !script1.enabled; 
     if (script2.enabled = !script2.enabled;) // if the spriteRenderer sprite = sprite1 then change to sprite2 
     { 
      GameObject.Find ("PlayerSecond").GetComponent<SpriteRenderer>().sprite = sprite1; 
     } 
     //script2.enabled = !script2.enabled; 
     DesaturizePsyco(); 

    } 

    void DesaturizePsyco() 
    { 
     if (spriteRendererPsyco1.sprite == sprite1) // if the spriteRenderer sprite = sprite1 then change to sprite2 
     { 
      GameObject.Find ("PlayerFirst").GetComponent<SpriteRenderer>().sprite = sprite2; 
     } 
     else 
     { 
      spriteRendererPsyco1.sprite = sprite1; // otherwise change it back to sprite1 
     } 
    } 

} 
+0

не ваша проблема решена? Если это так, если вы решили его использовать ответ, ответьте на вопрос, как выбрать правильный ответ. – Kardux

ответ

0

Первая попытка всегда после минимального раздел сценарий: здесь метод changeCharacterBtn() не был полезным (я предложил изменить для вашего поста уже). Также была опечатка в if (script2.enabled = !script2.enabled;). Также я предполагаю, что ваш код будет вызывать ошибки при воспроизведении: вы проверили Консоль?

Что касается вашего скрипта, вот ошибки, которые я вижу:

  • spriteRendererPsyco1 = GetComponent<SpriteRenderer>(); вместо spriteRendererPsyco1 = Psyco1.GetComponent<SpriteRenderer>(); (то же самое для Psyco2)
  • script1, script2, spriteRendererPsyco1 и spriteRendererPsyco2 должен быть установлен в частном, так как вы ссылаться на них в Start() (им не нужно будет появляться на Inspector)

Так вот скорректированная версия вашего скрипта:

public class switchCharacter : MonoBehaviour 
{ 
    public GameObject Psyco1; 
    public GameObject Psyco2; 
    private PlayerControllerPsyco1 script1; 
    private PlayerControllerPsyco1 script2; 
    public Sprite sprite1; // Psyco1 color 
    public Sprite sprite2; // Psyco2 decolorized 
    private SpriteRenderer spriteRendererPsyco1; 
    private SpriteRenderer spriteRendererPsyco2; 

    void Start() 
    { 
     script1 = Psyco1.GetComponent<PlayerControllerPsyco1>(); 
     script2 = Psyco2.GetComponent<PlayerControllerPsyco1>(); 
     script1.enabled = true; 
     script2.enabled = false; 
     spriteRendererPsyco1 = Psyco1.GetComponent<SpriteRenderer>(); 
     spriteRendererPsyco2 = Psyco2.GetComponent<SpriteRenderer>(); 
     if(spriteRendererPsyco1.sprite == null) // if the sprite on spriteRenderer is null then 
      spriteRendererPsyco1.sprite = sprite1; // set the sprite to Psyco1 Color 
    } 

    void Update() 
    { 
     if(Input.GetButtonDown("switch1")) 
     { 
      script1.enabled = !script1.enabled; 
      script2.enabled = !script2.enabled; 
      //spriteRendererPsyco1.sprite = sprite2; 
      DesaturizePsyco(); // call method to change Psyco sprite 
     } 
    } 

    void DesaturizePsyco() 
    { 
     if(spriteRendererPsyco1.sprite == sprite1) // if the spriteRenderer sprite = sprite1 then change to sprite2 
     { 
      GameObject.Find("PlayerFirst").GetComponent<SpriteRenderer>().sprite = sprite2; 
     } 
     else 
     { 
      spriteRendererPsyco1.sprite = sprite1; // otherwise change it back to sprite1 
     } 
    } 
} 

В качестве примечания, вот несколько вещей, о общем программировании советуют:

  • Рассмотрят использование заглавных букв, чтобы начать имена классов (это общая конвенция в C#)
  • Использование спрайтов сравнение для определения того, какой игрок в данный момент находится, возможно, не самый надежный способ для продолжения (возможно, вместо этого используйте вместо этого переменную bool)
  • Всегда старайтесь держать свой код как cle АС возможно (не двойные пространства, сохраняя ту же именования, используя заглавные буквы или нет: Psyco1 но script1, ...)

Надеюсь, что это помогает,

+0

Это не изменило состояние скрипта, проблема осталась. –

+0

Ну, я попробовал сценарий, когда я разместил его с 2 _GameObjects_, каждый из которых содержит компонент _SpriteRenderer_ (и один из них называется _PlayerFirst_). и он работал отлично. Уверены ли все поля в Инспекторе? Есть ли ошибка в консоли? – Kardux

Смежные вопросы