2015-12-11 2 views
3

Существует проблема, с которой я сталкиваюсь с двумя объектами и одной кнопкой. Один из них - это второй куб, когда мы нажимаем кнопку куба, сталкиваемся с разрушением земли и снова создаем экземпляр. В Cube столкновение оценка уменьшается. Также в иерархии есть пустой игровой объект, имя которого является контроллером, который имеет метод текстовой оценки.Score работает нормально, но я хочу, чтобы при достижении результата 0, нажатие кнопки не работает, а куб не создается.Отключить экземпляр и нажать кнопку

Куб: enter image description here

Основание: enter image description here

Контроллер: enter image description here

CubeScript:

public class Cube : MonoBehaviour { 

    Rigidbody2D body; 

    void Start() { 
     body = GetComponent<Rigidbody2D>(); 
     body.isKinematic = true; 
    } 

} 

Ground Script:

public class Ground : MonoBehaviour { 

    private Button button; 
    private BoxCollider2D collide; 
    public GameObject object1Clone; 

    void Start() { 

     collide = GetComponent<BoxCollider2D>(); 

     collide.isTrigger = true; 

     button = GameObject.FindGameObjectWithTag ("Button").GetComponent<Button>(); 

     button.onClick.AddListener (() => Magnetic()); 

    } 

    void OnTriggerEnter2D(Collider2D target) { 

      Destroy (target.gameObject); 
      Instantiate (object1Clone, new Vector3 (0f, 4.12f, 0f), Quaternion.identity); 

    } 

    public void Magnetic(){ 

     GameObject.FindGameObjectWithTag ("Player").GetComponent<Rigidbody2D>().isKinematic = false; 

    } 


} 

ScoreScript:

public class ScoreScript : MonoBehaviour { 
    public static int Score=1; 


    void OnTriggerEnter2D(Collider2D target) { 

     if (Score <=0) { 



     } else { 
      Score--; 
      Controller.instance.SetScore(Score); 
     } 


    } 
} 

Контроллер:

public class Controller : MonoBehaviour { 
    public static Controller instance; 
    public Text scoreText; 

    void Start() { 
     scoreText.text = ""+1; 

     if(instance==null){ 

      instance=this; 
     } 

    } 

    public void SetScore(int score){ 

     scoreText.text =""+score; 

    } 

} 

ответ

1

Первое изменение слушатель регистрации этого:

button.onClick.AddListener (Magnetic); 

это будет сделать легче удалить слушателя.

Я покажу вам два способа сделать это, легкое и правильное, немного сложнее понять. Поэтому, если вы не совсем поняли это, используйте первое и узнайте о втором.

Каждый раз, когда вы уменьшаете счет, проверьте его и требуют соответствующих действий:

public class ScoreScript : MonoBehaviour { 
    public static int Score=1; 

    void OnTriggerEnter2D(Collider2D target) 
    { 
     Score--; 
     Controller.instance.SetScore(Score); 
     if(Score <= 0){ 
      GameObject.Find("ground").GetComponent<Ground>().ClearButtonListener(); 
     } 
    } 
} 

И в Земельной компонента:

public void ClearButtonListener() 
{ 
    button.onClick.RemoveListener (Magnetic); 
} 

Теперь второй более подходящим способом было бы использования и слушателя

public class ScoreScript : MonoBehaviour, IScoreHandler { 
    public static int Score=1; 
    public event Action OnScoreZero =() => {}; 
    void OnTriggerEnter2D(Collider2D target) 
    { 
     Score--; 
     Controller.instance.SetScore(Score); 
     if(Score <= 0){ 
      OnScoreZero(); 
     } 
    } 
} 
public interface IScoreHandler{ event Action OnScoreZero; } 

И слушатели слушают.

public class Ground : MonoBehaviour { 

    private Button button; 
    private BoxCollider2D collide; 
    public GameObject object1Clone; 
    private IScoreHandler scoreHandler = null; 
    void Start() { 
     scoreHandler = GameObject.Find("Score").GetComponent<IScoreHandler>(); 
     if(scoreHandler != null){ 
      scoreHandler.OnScoreZero += ClearButtonListener; 
     } 
     collide = GetComponent<BoxCollider2D>(); 

     collide.isTrigger = true; 

     button = GameObject.FindGameObjectWithTag ("Button").GetComponent<Button>(); 

     button.onClick.AddListener (Magnetic); 
    } 
    void OnDestroy(){ 
     if(scoreHandler != null){ 
       scoreHandler.OnScoreZero -= ClearButtonListener; 
     } 
    } 
} 

Благодаря чтобы интерфейс и события, ваш класс больше не полагаться на другой класс, но на интерфейсе, что делает его более гибким и масштабируемым.

+0

Ваше заземление, опечатка. Я вижу, что вы делаете легкий путь :). – Everts

+0

Фактически, поскольку компонент Ground и компонент ScoreScript находятся на одном и том же объекте, вы можете пропустить поиск объекта и использовать GetComponent – Everts

+0

, если я использую ваш первый метод, а затем зайдите на 0, а не на 0 баллов –

1

Вам необходимо установить поле interactable из UnityEngine.UI.Button объекта false см http://docs.unity3d.com/ScriptReference/UI.Button.html, т.е. использовать

void OnTriggerEnter2D(Collider2D target) { 
    if (Score <=0) { 
     /* disable the button */ 
     GameObject.FindGameObjectWithTag ("Button").GetComponent<Button>().interactable = false; 
    } 

в вашем ScoreScript.cs.

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