QA@IT

【Unity】ボタンを押した直後にスクリプトを呼び出したい

883 PV

初心者です。とあるボタンを押した直後にゲームの中の500円を減らしたいのですが再生したら何もしなくても勝手に500円が減ってしまいます。再生した直後ではなく、ボタンを押した直後にお金のスクリプトが動くようにするにはどうすればいいですか。

ボタンのソースコード

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

public class Button : MonoBehaviour
{

    public void OnClick()
    {
        if (Application.isEditor)
        {

            if (Input.GetMouseButtonUp(0))
            {
                Debug.Log("離した瞬間");


            }

        }


    }

}

お金のソースコード

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

public class Coin : MonoBehaviour
{
  #整数のテキストを外からアタッチできるようにする
    public Text coinText;

    public int coin;

    void Start()
    {
        coinText.text = coin.ToString();

        coin =coin - 500;

    }
}


回答

たとえばですが、

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

public class Button : MonoBehaviour {

    public Coin coin;

    // Use this for initialization
    void Start () {
        Debug.Log("button");
        Debug.Log("Coin:" + coin.Money);
    }

    // Update is called once per frame
    void Update () {

    }

    public void ButtonClick(BaseEventData data) {
        Debug.Log("clicked");
        coin.Pay(500);
    }
}

これでこれをアタッチしたButton用 GameObjectのInspectorにCoinがでます。

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

public class Coin : MonoBehaviour {

    public int Money = 5000;

    public bool Pay(int value){
        if(value < Money){
            Money -= value;

            Debug.Log("Money : " + Money);
            return true;
        }
        return false;
    }

    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {

    }
}

これをコイン用のオブジェクトにアタッチして、そのオブジェクトをButtonのコインにアタッチします。

スクリーンショット_2018-11-23_18.54.07.png

スクリーンショット_2018-11-23_18.54.56.png

(念のため、Buttonのスクリプトをアタッチしたオブジェクトを左のツリー(ヒエラルキーウィンドウ)で選択して、
左のツリーのコインのオブジェクトをドラッグします。)

結果はコンソールに出ます。

RayCastはMainCameraに、ColliderとEventTriggerはCubeに設定してます。
(2DでやったのでRigedBody含めて2Dです。3DのはRemoveしてます)

スクリーンショット_2018-11-23_18.58.58.png

画像だとCoinObjectにCoinスクリプト、ButtonObjectにButtonスクリプトをアタッチ。
あとはシーンにEventSystemつけてDirectional Lightおいたぐらいですかね。
Sphereも置いただけです。

GameObject(Empty Objectから作った)の名前もButtonObjectじゃなくてButtonとかでいいのですが、紛らわしいので区別がつくような名前にしています。
あと実際にはprefabを作りますが簡単のためにやっていません。

参考までに。

編集 履歴 (3)
  • 詳しく教えて下さりありがとうございました。独自の方法で解決できたように見えたものの後になってみるとめちゃくちゃだったので本当に助かりました。 -

Coinスクリプトがアタッチされたオブジェクトが表示されるととにかくCoinスクリプトが実行されるので、透明なオブジェクトを作ってそれを表示するようにしました。

ゲーム内のお金を使うまでの流れ↓

1 透明なオブジェクトを新しく作る。

2 ボタンからCoinスクリプトを外し、透明オブジェクトにCoinスクリプトをアタッチ。

3 お金のテキスト(数字)をコインスクリプトにアタッチ。

4 ボタンにSetActive関数で透明オブジェクトを表示させるコードを書く。

5 透明ボタンを非表示にする。

6 再生してボタンを押す。

無駄な工程だらけだったため回答修正させて頂きました。見て下さった方すみません。

編集 履歴 (8)
  • 解決済みのようですが、Startがそういう(オブジェクトが生成されたら動く初期化用の)イベントですので、ButtonのOnClickでCoinオブジェクトを見つけてCoinオブジェクトのpublicメソッドなどで500減らすようにします。(やり方はいろいろあります) -
  • コメントありがとうございます。参考にして頑張りたいと思います。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。