12

Unity フォーラムや Q&A サイトのいくつかの回答を見ると、ボタンに関連付けられている画像を削除すると機能しないため、非表示のボタンを作成する方法の回答が機能しません。

ボタンを実際に機能させながら、これを回避して非表示のプロパティを保持するにはどうすればよいでしょうか?

4

4 に答える 4

23

これは、Unity の奇妙な点の 1 つです...

実際のプロジェクトでは 100% これが必要ですが、Unity はそれを忘れていました。

短縮版:

すべての Unity プロジェクトでTouchable.csが必要です。

// file Touchable.cs
// Correctly backfills the missing Touchable concept in Unity.UI's OO chain.

using UnityEngine;
using UnityEngine.UI;
#if UNITY_EDITOR
using UnityEditor;
[CustomEditor(typeof(Touchable))]
public class Touchable_Editor : Editor
     { public override void OnInspectorGUI(){} }
#endif
public class Touchable:Text
     { protected override void Awake() { base.Awake();} }
  1. Unityの通常の「Create Button」エディター機能を使用する

  2. ご存知のように、エディター機能により、2 つのコンポーネントが自動的に追加されます。1つはaTextで、もう1つはImage...

  3. 両方削除するだけ

  4. 上記のスクリプトをボタンにドロップしますTouchable.cs

これで完了です。それだけです。

Unity のアップグレードで「減衰」することはありません。

上にドロップすることで、実際に何でも「ボタン化」できます。.UITouchable

ボタンを作成するために「透明な画像を追加」する必要はもうありません。


Unity は、OO チェーンで「タッチ可能」の概念を抽象化するのを忘れていました。

そのため、私たち開発者は、Unity のクラス「から」独自の Touchable クラスを作成する必要があります。

これは OO の古典的な「埋め戻し」の問題です。

「バックフィル」するときの唯一の問題は、完全に自動維持する必要があるということです。Touchable.cs という優れたソリューションは 1 つしかなく、誰もが使用しています。


したがって、現実世界のすべての Unity プロジェクトでは、ボタンは次のようになります。

ここに画像の説明を入力

ONEあなたは Unity を持っていますButton.cs

2つ追加する必要がありますTouchable.cs

いくつかのチームは、Button.cs + Touchable.cs で、ゲームオブジェクトを単純に作成するエディター機能「Create Better Button」を作成しています。

重要なヒント...

非常に複雑な UIパネルがあるとします。そのため、サイズが変更されたり、アニメーションが表示されたりします。

実際、「Button + Touchable」そのようなものにドロップするだけで機能します。

親を埋めるために展開するように Button+Touchable を設定するだけです。それだけです。

ここに画像の説明を入力

この例の画像では、「再開」と「終了」は何でもかまいません。(アニメーション、多くのパーツを含む複雑なパネル、テキスト、スプライト、目に見えないもの、スタックなど、何でも。)

いずれの場合も、下にButton+Touchable をドロップするだけで、完璧なボタンができあがります。

実際、このアプローチは非常に単純なので、おそらく単純なケースでも使用するでしょう。

あなたのボタンが些細な画像だとしましょう。画像を用意して、その上に Button+Touchable をドロップする方がはるかに簡単です。(エディターで紛らわしく問題のある「ボタン」機能を使用するのではなく。)

状況を理解して...

1) Unity のButton.csクラスは素晴らしいです。

2)しかし、エディタ機能「ボタンを作る」はゴミです...

3) 「逆さま」ボタンを作成し、

4) つまり、テキスト/画像をButton.csの下に置きます。

5) 「ボタンらしさ」は何にでも追加できるものです。これはまさに、Button+Touchable での動作です。

6) だから - ごく簡単に -

1. 欲しいものは何でも持ってください。テキスト、画像、パネル、非表示、アニメーションなど、何でも構いません。

2. Button+Touchable をその上にドロップします。これで完了です。

それが、Unity のすべてのボタンのやり方です。


歴史的功績: Unity フォーラムのユーザー「signalZak」が、何年も前にこれを最初に考え出したと思います。

于 2016-04-27T14:27:52.083 に答える
-1

私の最初の解決策は、enable以下disableのようなコンポーネントでした。

void showButton(Button buttonToShow, bool show)
{
    Image bImage = buttonToShow.GetComponent<Image>();
    Text bText = buttonToShow.GetComponentInChildren<Text>(); //Text is a child of the Button

    if (bImage != null)
    {
        bImage.enabled = show;
    }

    if (bText != null)
    {
        bText.enabled = show;
    }
}

しかし、それはうまくいきませんでした。ボタンのimagetextコンポーネントが両方とも disabledの場合、ボタン クリック イベントは発生しません。そのうちの 1 つは、クリック イベントを送信できるようにする必要があります。enabled

image解決策は、コンポーネントとコンポーネントの両方のアルファtextを 0 に設定して非表示にし、1 に設定して再び表示することです。それらは非表示になりますが、無効にはならず、クリックeventsは機能します。

public Button button;

void Start()
{
    //Show Button
    showButton(button, true);

    //Hide Button
    //showButton(button, false);
}

void showButton(Button buttonToShow, bool show)
{
    Image bImage = buttonToShow.GetComponent<Image>();
    Text bText = buttonToShow.GetComponentInChildren<Text>(); //Text is a child of the Button

    if (bImage != null)
    {
        Color tempColor = bImage.color;

        if (show)
        {
            tempColor.a = 1f; //Show 
            bImage.color = tempColor;
        }
        else
        {
            tempColor.a = 0f; //Hide 
            bImage.color = tempColor;

        }
    }

    if (bText != null)
    {
        Color tempColor = bText.color;

        if (show)
        {
            tempColor.a = 1f; //Show 
            bText.color = tempColor;
        }
        else
        {
            tempColor.a = 0f; //Hide 
            bText.color = tempColor;

        }
    }
}
于 2016-04-27T12:17:25.160 に答える