こんにちは,レオです.
なんだかんだTGSのIndie枠への申し込みが間に合ってほっとしています.
結果発表は来月らしいです.どうかな...初申込みだけど通ったりしないかな・・・笑

(追記:使用バージョンはUnity2019.3.3f1)
さて今日はUnityのGUI Buttonについて書こうと思います.
何を書こうかと昨晩思いながら久しぶりに星海の眼の開発に手を付け始めたところ
とある問題に直面しました.
いや,前から実は起こっていてUnityのバグだとは思うのですが
ButtonのInspector表示がおかしい.
Unityのバージョンを変えてみたり,別プロジェクトを作ってみたりしてもダメ,
星海の眼だけなぜかこの状態は直りませんでした...七不思議!

OnClickを設定する場所がない・・・ボタンとして使い物にならないじゃん!
ということで,スクリプトでButtonの挙動を制御しましょう.
実はこのバグが起こる前から私はちょくちょく書いていた書き方です.
慣れるとそれなりにこれも使い勝手がいいように感じています.
system UnityEngine.UI;
public class ButtonTest:MonoBehavior
{
[SerializeField, Header("今回ボタンになるGameObject")]
private GameObject button;
void Awake()
{
//ボタン初期化
InitButton();
}
void InitButton()
{
var b = button.AddComponent<Button>();
//↓ボタンのクリックイベントを全部消したいときは呼び出しましょう
//b.onClick.RemoveAllListeners();
//クリックイベント追加!
b.onClick.AddListener(()=>{
Debug.Log("おした!");
});
}
}

HierarcyでImageを一つ作って

さっきのスクリプトでこれをアタッチして(もちろん取得方法はなんでもいいです)
実行,シーン上にあるさっき作った□の画像を押すとLogがでる!
ちゃんとボタンとして機能した!

またラムダ式(()=>{})を使っていますが,UnityActionを宣言して代わりに入れても動きます.
まぁラムダのほうが宣言なく書けるから個人的には好きですが使い分けましょう.

応用として?このButtonの設定方法を知っておくと
ゲーム中でボタンの挙動を変えたくなったときif(){}とかで分岐しないで
書き換えたり,挙動を追加したりできます.
まぁ特にやる必要はない気がしますけどね,ScriptableObjectにあるoverride呼び出して
変えてやるほうがスマートだとは思います.
まぁこの辺は好みですね,この辺はコードに間違いがあるわけじゃないので
好きなやり方でつかってみてください(´▽`)
それでは今日はこのへんで.
あー時間がない,Calvatoleまで手がまわるかな・・・?💦
Comments