禁用实例化和按钮单击

时间:2015-12-11 18:03:27

标签: c# unity3d

我面临着两个物体和一个按钮的问题。当我们点击按钮立方体撞击地面破坏并再次实例化时,一个是立方体第二个地面。在立方体碰撞得分减少。在层次结构中有空游戏对象,其名称是具有文本得分方法的控制器。核正常工作但我想要当得分为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;
    }

}

地面剧本:

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;

    }

}

2 个答案:

答案 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

答案 1 :(得分: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;
         }
    }
}

由于接口和事件,您的类不再依赖于另一个类,而是在一个接口上,使其更灵活和可扩展。

相关问题