<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>UI on Godot 4 レシピ</title><link>https://kamera25.github.io/godot_recipes/4.x/ja/ui/index.html</link><description>Recent content in UI on Godot 4 レシピ</description><generator>Hugo -- gohugo.io</generator><language>ja</language><atom:link href="https://kamera25.github.io/godot_recipes/4.x/ja/ui/index.xml" rel="self" type="application/rss+xml"/><item><title>ラベル</title><link>https://kamera25.github.io/godot_recipes/4.x/ja/ui/labels/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kamera25.github.io/godot_recipes/4.x/ja/ui/labels/index.html</guid><description>&lt;div class="box notices cstyle tips"&gt;
&lt;div class="box-label"&gt;ℹ️ 留意事項&lt;/div&gt;
&lt;div class="box-content"&gt;
&lt;p&gt;この記事は Godot 3から Godot 4 へ内容の書き換え中です。
Godot4では存在しない変数、関数が含まれている場合があります。もしその場合はリポジトリの&lt;a href="https://github.com/kamera25/godot_recipes/issues" target="_blank"&gt;Issues&lt;/a&gt;までご報告ください。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="課題"&gt;課題&lt;/h2&gt;
&lt;p&gt;画面にテキストを表示したい。&lt;/p&gt;
&lt;h2 id="解決策"&gt;解決策&lt;/h2&gt;
&lt;p&gt;スクリーンにテキストを表示する機会が増えるでしょう。例えば、タイトル表示やカウントダウンタイマー、スコアカウンターなどがその一例です。これらのほとんどは、Godotの &lt;i class="gd-Label"&gt;&lt;/i&gt;&lt;code&gt;Label&lt;/code&gt; ノードを使えば簡単に実装できます。&lt;/p&gt;
&lt;h3 id="フォント操作について"&gt;フォント操作について&lt;/h3&gt;
&lt;p&gt;はじめに、フォントファイルが必要になります。Godotのフォントサポートについては別のレシピで詳しく解説しますが、ここではTTFまたはOTF形式のフォントファイルを前提とします。ビットマップフォントを使用する場合は、関連するレシピを参照してください。&lt;/p&gt;
&lt;div class="box notices cstyle note"&gt;
&lt;div class="box-label"&gt;&lt;i class="fa-fw fas fa-exclamation-circle"&gt;&lt;/i&gt; メモ&lt;/div&gt;
&lt;div class="box-content"&gt;
&lt;p&gt;この例では、人気のある無料フォント「Roboto」を使用します。このフォントは&lt;a href="https://fonts.google.com/specimen/Roboto" target="_blank"&gt;Google Fonts&lt;/a&gt;で入手できます。こちらからもダウンロードできます。 &lt;a href="https://kamera25.github.io/godot_recipes/4.x/ja/files/Roboto_font.zip"&gt;Roboto_font.zip&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="ラベルの追加方法"&gt;ラベルの追加方法&lt;/h3&gt;
&lt;p&gt;シーンに新しい &lt;i class="gd-Label"&gt;&lt;/i&gt;&lt;code&gt;Label&lt;/code&gt;ノードを追加してください。インスペクターでは、ほとんどのプロパティが自明な内容になっています（マウスカーソルを合わせると説明が表示されます）：&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-f0c318691fdeb6127d8851f91d2999da" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/ui_label_properties.png" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-f0c318691fdeb6127d8851f91d2999da"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/ui_label_properties.png" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;「テキスト」フィールドに任意の文字を入力して、表示スタイルを試してみます。デフォルトフォントが設定されていますが、かなりシンプルな（しかも小さい）デザインになっています。&lt;/p&gt;
&lt;h4 id="dynamicfontの追加方法"&gt;&lt;code&gt;DynamicFont&lt;/code&gt;の追加方法&lt;/h4&gt;
&lt;p&gt;フォントを追加するには。インスペクターで「カスタムフォント」セクションまでスクロールダウンし、展開してください。空の「フォント」プロパティで『新規ダイナミックフォント』を選択し、新しく表示された&lt;code&gt;DynamicFont&lt;/code&gt;をクリックしてさらに展開します。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-cafe30494019eb2309b19ae62d292a5d" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/ui_label_font_properties.png" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-cafe30494019eb2309b19ae62d292a5d"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/ui_label_font_properties.png" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;フォントファイル（この例では&lt;code&gt;Roboto-Medium.ttf&lt;/code&gt;を使用しています）を&lt;em&gt;フォントデータ&lt;/em&gt;プロパティにドラッグするか、「読み込み」を選択して直接ファイルを指定します。調整すべきプロパティは複数ありますが、まずは&lt;em&gt;サイズ&lt;/em&gt;を少し大きくしてみます。&lt;/p&gt;
&lt;p&gt;テキストの表示に与える影響を自由に調整してみてください。例えば、以下の画像では、2番目のラベルに&lt;em&gt;フィルター&lt;/em&gt;プロパティが有効になっています。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-97d982e24632f54b2546fd19695cdc92" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/ui_label_font_filter.png" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-97d982e24632f54b2546fd19695cdc92"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/ui_label_font_filter.png" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;h4 id="色の調整"&gt;色の調整&lt;/h4&gt;
&lt;p&gt;ラベルのフォントカラーは「カスタムカラー」セクションで調整できます。ここでは「フォントカラー」を変更できるほか、影の色を追加することもできます。影のプロパティは「カスタム定数」セクションで設定します。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-0c48bfc13c2e9fb0859b1efa71b831d6" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/ui_label_font_colors.png" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-0c48bfc13c2e9fb0859b1efa71b831d6"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/ui_label_font_colors.png" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="動的に変化するテキスト表示"&gt;動的に変化するテキスト表示&lt;/h3&gt;
&lt;p&gt;シーンに静的テキストのみが必要な場合、ここで完了です。ただし、ラベルを動的に更新する必要がある場合は、コード内で&lt;code&gt;text&lt;/code&gt;プロパティを使用して実装できます。&lt;/p&gt;
&lt;p&gt;&lt;i class="gd-Timer"&gt;&lt;/i&gt;&lt;code&gt;Timer&lt;/code&gt;ノードがシーンに含まれている場合、以下のように操作できます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript" data-lang="gdscript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;extends&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;Control&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; counter &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;_ready&lt;/span&gt;&lt;span style="color:#eceff4"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $Label&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;text &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;str&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;counter&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;_on_Timer_timeout&lt;/span&gt;&lt;span style="color:#eceff4"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; counter &lt;span style="color:#81a1c1"&gt;+=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $Label&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;text &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;str&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;counter&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ラベルの使用例やUIノードとの連携方法については、&lt;a href="#%e9%96%a2%e9%80%a3%e3%83%ac%e3%82%b7%e3%83%94"&gt;関連レシピ&lt;/a&gt;セクションをご覧ください。&lt;/p&gt;
&lt;!--
&lt;div class="box notices cstyle note"&gt;
&lt;div class="box-label"&gt;&lt;i class="fa-fw fas fa-exclamation-circle"&gt;&lt;/i&gt; メモ&lt;/div&gt;
&lt;div class="box-content"&gt;
&lt;p&gt;プロジェクトファイルをこちらからダウンロードしてください: &lt;a href="https://kamera25.github.io/godot_recipes/4.x/ja/files/screen_shake.zip"&gt;screen_shake.zip&lt;/a&gt;&lt;/p&gt;</description></item><item><title>コンテナ</title><link>https://kamera25.github.io/godot_recipes/4.x/ja/ui/containers/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kamera25.github.io/godot_recipes/4.x/ja/ui/containers/index.html</guid><description>&lt;div class="box notices cstyle tips"&gt;
&lt;div class="box-label"&gt;ℹ️ 留意事項&lt;/div&gt;
&lt;div class="box-content"&gt;
&lt;p&gt;この記事は Godot 3から Godot 4 へ内容の書き換え中です。
Godot4では存在しない変数、関数が含まれている場合があります。もしその場合はリポジトリの&lt;a href="https://github.com/kamera25/godot_recipes/issues" target="_blank"&gt;Issues&lt;/a&gt;までご報告ください。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="課題"&gt;課題&lt;/h2&gt;
&lt;p&gt;ユーザーインターフェースに問題があります。複雑になりすぎている、サイズ変更がうまく機能しない、コンポーネントの配置が把握しづらい、といった点が考えられます。&lt;/p&gt;
&lt;h2 id="解決策"&gt;解決策&lt;/h2&gt;
&lt;p&gt;多くの開発者にとって、UI開発は最も苦手な作業です。複雑なUIは制御不能に陥りやすく、修正や変更が極めて困難な状況に陥ることがあります。Godotには優れたUI構築ツールが揃っていますが、これらを適切に使いこなすための時間を投資すれば、そうした苦労を大幅に軽減できることに気付くでしょう。&lt;/p&gt;
&lt;p&gt;解決策は &lt;i class="gd-Container"&gt;&lt;/i&gt;&lt;code&gt;Container&lt;/code&gt; コンポーネントです。コンテナを活用することで、UIのレイアウト構築が大幅に効率化できます。&lt;/p&gt;
&lt;p&gt;&lt;i class="gd-Control"&gt;&lt;/i&gt;&lt;code&gt;Control&lt;/code&gt; を&lt;code&gt;Container&lt;/code&gt;に追加すると、コンテナが当該コントロールの位置指定情報をすべて継承します。これにより、子要素のサイズや位置、その他のレイアウトプロパティを個別に設定することはできなくなります。&lt;/p&gt;
&lt;p&gt;コンテナに関する最も重要なポイントは以下の通りです。&lt;/p&gt;
&lt;div class="box notices cstyle warning"&gt;
&lt;div class="box-label"&gt;&lt;i class="fa-fw fas fa-exclamation-triangle"&gt;&lt;/i&gt; 警告&lt;/div&gt;
&lt;div class="box-content"&gt;
&lt;p&gt;&lt;code&gt;コンテナ&lt;/code&gt; ノードは &lt;i class="gd-Container"&gt;&lt;/i&gt; 子要素を&lt;em&gt;自動的に&lt;/em&gt;配置します。直接的に特定の子UIノードの位置を制御することはできません。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;以下によく使われる代表的なコンテナをご紹介します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;i class="gd-CenterContainer"&gt;&lt;/i&gt;&lt;code&gt;CenterContainer&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;このコンテナは子要素を中央に配置します。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;i class="gd-MarginContainer"&gt;&lt;/i&gt;&lt;code&gt;MarginContainer&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;このコンテナはマージンを保持しており、子要素がコンテナの端に近づきすぎるのを防ぎます。マージン値はプロパティの「カスタム定数」セクションで設定できます。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;i class="gd-VBoxContainer"&gt;&lt;/i&gt;&lt;code&gt;VBoxContainer&lt;/code&gt;/ &lt;i class="gd-HBoxContainer"&gt;&lt;/i&gt;&lt;code&gt;HBoxContainer&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;これらのコンテナは、内容物を垂直または水平方向に整列させます。「カスタム定数」セクションでは、要素間の間隔を広げるための&lt;em&gt;分離&lt;/em&gt;プロパティも設定できます。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;i class="gd-GridContainer"&gt;&lt;/i&gt;&lt;code&gt;GridContainer&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;このコンテナは子要素をグリッド状に配置します。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="サイズ指定フラグ"&gt;サイズ指定フラグ&lt;/h3&gt;
&lt;p&gt;コンテナが子要素をどのように扱うかは、主に「サイズフラグ」プロパティによって制御されます。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-99a0d54e2e2682c6e53b2c5704e2ec94" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/ui_size_flags.png" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-99a0d54e2e2682c6e53b2c5704e2ec94"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/ui_size_flags.png" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Fill&lt;/p&gt;
&lt;p&gt;このオプションをチェックすると、コントロールはコンテナ内で指定された位置に適切に配置されます。デフォルトではこの機能が有効になっています。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Expand&lt;/p&gt;
&lt;p&gt;このオプションが有効になっている場合、コントロールはできるだけ多くのスペースを使用しようとします。「展開」機能が選択されていないノードは、それが有効になっているノードによって押し出されます。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Shrink Center&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Fill&lt;/em&gt; が無効で &lt;em&gt;Expand&lt;/em&gt; が有効になっている場合、コントロールはエリアの先頭ではなく、中央に配置されたままになります。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Shrink End&lt;/p&gt;
&lt;p&gt;上記と同様ですが、制御は開始位置ではなく終了位置に設定されます。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Stretch Ratio&lt;/p&gt;
&lt;p&gt;この比率設定により、拡張コントロールの相対的な占有量が決定されます。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これらの設定を試すには、以下のようなテストシーンを設定する方法が有効です。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-f870d4ceb179370394a2eefcb97a44f3" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/ui_flags_example01.png" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-f870d4ceb179370394a2eefcb97a44f3"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/ui_flags_example01.png" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;異なるボタンの「サイズフラグ」プロパティを調整してみて、それが &lt;code&gt;HBoxContainer&lt;/code&gt; 内での配置にどのように影響するか確認してください。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-77e939867fb587a9d40096bbe4b7bd80" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/ui_flags_example02.gif" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-77e939867fb587a9d40096bbe4b7bd80"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/ui_flags_example02.gif" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="ネストされたコンテナ"&gt;ネストされたコンテナ&lt;/h3&gt;
&lt;p&gt;より複雑なUI構成の場合は、他のコンテナを保持するコンテナを使用が必要です。例えば&lt;i class="gd-GridContainer"&gt;&lt;/i&gt;&lt;code&gt;GridContainer&lt;/code&gt;内の各アイテム自体が&lt;i class="gd-VBoxContainer"&gt;&lt;/i&gt;&lt;code&gt;VBoxContainer&lt;/code&gt;であり、その全てが&lt;i class="gd-MarginContainer"&gt;&lt;/i&gt;&lt;code&gt;MarginContainer&lt;/code&gt;内に配置されている、といった構造になります。&lt;/p&gt;</description></item><item><title>ハートの器 と 3つの方法</title><link>https://kamera25.github.io/godot_recipes/4.x/ja/ui/heart_containers_3/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kamera25.github.io/godot_recipes/4.x/ja/ui/heart_containers_3/index.html</guid><description>&lt;div class="box notices cstyle tips"&gt;
&lt;div class="box-label"&gt;ℹ️ 留意事項&lt;/div&gt;
&lt;div class="box-content"&gt;
&lt;p&gt;この記事は Godot 3から Godot 4 へ内容の書き換え中です。
Godot4では存在しない変数、関数が含まれている場合があります。もしその場合はリポジトリの&lt;a href="https://github.com/kamera25/godot_recipes/issues" target="_blank"&gt;Issues&lt;/a&gt;までご報告ください。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="課題"&gt;課題&lt;/h2&gt;
&lt;p&gt;ハートの器のようなバー（または他のアイコンを基調としたバー）を表示したい。&lt;/p&gt;
&lt;h2 id="解決策"&gt;解決策&lt;/h2&gt;
&lt;p&gt;プレイヤーのHPを表示する一般的な方法として、一連のアイコン（通常はハートマーク）を使用する手法があります。プレイヤーがダメージを受けると、これらが徐々に消失していきます。&lt;/p&gt;
&lt;p&gt;本レシピでは、以下の3つの方法でこの情報を表示する方法をご紹介します。「シンプル」「空き」、そして「部分」です。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-c53f7099a148432d66a05fbc5f8a3df9" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/heart_bar_02.png" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-c53f7099a148432d66a05fbc5f8a3df9"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/heart_bar_02.png" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;この画像はプレイヤーが&lt;code&gt;3&lt;/code&gt;のHPを持っている時、バーに表示される内容を表しています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;シンプル&lt;/strong&gt;：ハートのみを表示。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;空き&lt;/strong&gt;：空き容量があるハートを表示。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;部分&lt;/strong&gt;：部分的に満たされたハートを表示。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="バーの設定手順"&gt;バーの設定手順&lt;/h3&gt;
&lt;p&gt;使用しているハートのアイコン のサイズは53×45ピクセルです。以下から入手できます。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://kenney.nl/assets/platformer-art-deluxe" target="_blank"&gt;Kenney.nl: Platformer Art Deluxe&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;理想的には、ハートバーは全体のHUD/UIに簡単に組み込めるものであるべきです。したがって、これを別個のシーンとして作成するのが合理的です。まず&lt;i class="gd-HBoxContainer"&gt;&lt;/i&gt;&lt;code&gt;HBoxContainer&lt;/code&gt;から始めてください。これにより要素が適切に整列されます。テーマオーバーライド/定数/分離幅を&lt;code&gt;5&lt;/code&gt;に設定してください。&lt;/p&gt;
&lt;p&gt;&lt;i class="gd-TextureRect"&gt;&lt;/i&gt;&lt;code&gt;TextureRect&lt;/code&gt; 子要素を追加してください。ハートテクスチャを &lt;strong&gt;テクスチャ&lt;/strong&gt; プロパティにドラッグし、&lt;strong&gt;[伸縮モード]&lt;/strong&gt; を「固定」に設定してください。ノード名を「1」に指定したら、&amp;ldquo;Ctrl+D&amp;quot;を押して必要な数（この例では5つ）のハート用に同じノードを複製します。最終的なノード構成は以下のようになります。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-26c58331c55a95f805db7d710f850e37" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/heart_bar_03.png" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-26c58331c55a95f805db7d710f850e37"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/heart_bar_03.png" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="スクリプトの追加方法"&gt;スクリプトの追加方法&lt;/h3&gt;
&lt;p&gt;以下のスクリプトは3種類すべてのバー構成に対応できるよう設計されています。ゲームで実際に使用するモードは1つで済むはずなので、他のモードに関連するコードは削除しても構いません。&lt;/p&gt;
&lt;p&gt;まず、必要なテクスチャを読み込み、3つのバーモードを定義します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript" data-lang="gdscript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;extends&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;HBoxContainer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;enum&lt;/span&gt; modes &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;SIMPLE&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; EMPTY&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; PARTIAL&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; heart_full &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;preload&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;res://assets/hud_heartFull.png&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; heart_empty &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;preload&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;res://assets/hud_heartEmpty.png&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; heart_half &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;preload&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;res://assets/hud_heartHalf.png&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d08770"&gt;@export&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; mode &lt;span style="color:#eceff4"&gt;:&lt;/span&gt; modes
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;update_health&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;value&lt;span style="color:#eceff4"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;match&lt;/span&gt; mode&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; MODES&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;simple&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#88c0d0"&gt;update_simple&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;value&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; MODES&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;empty&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#88c0d0"&gt;update_empty&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;value&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; MODES&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;partial&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#88c0d0"&gt;update_partial&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;value&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;バーに対して &lt;code&gt;update_health()&lt;/code&gt; を呼び出すと、選択されたモードに基づいて渡された値が表示されます。&lt;/p&gt;</description></item><item><title>クールタイムボタン</title><link>https://kamera25.github.io/godot_recipes/4.x/ja/ui/cooldown_button/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kamera25.github.io/godot_recipes/4.x/ja/ui/cooldown_button/index.html</guid><description>&lt;div class="box notices cstyle tips"&gt;
&lt;div class="box-label"&gt;ℹ️ 留意事項&lt;/div&gt;
&lt;div class="box-content"&gt;
&lt;p&gt;この記事は Godot 3から Godot 4 へ内容の書き換え中です。
Godot4では存在しない変数、関数が含まれている場合があります。もしその場合はリポジトリの&lt;a href="https://github.com/kamera25/godot_recipes/issues" target="_blank"&gt;Issues&lt;/a&gt;までご報告ください。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="課題"&gt;課題&lt;/h2&gt;
&lt;p&gt;RPG風のスキルボタンを作成したい。クールタイム効果も組み込みたい。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-05bfc135239d8b737daa6fb06a3b521d" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/cooldown_01.gif" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-05bfc135239d8b737daa6fb06a3b521d"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/cooldown_01.gif" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="解決策"&gt;解決策&lt;/h2&gt;
&lt;p&gt;ボタン用のアイコンが必要な場合、&lt;a href="https://game-icons.net/" target="_blank"&gt;Game-icons.net&lt;/a&gt;では多種多様なデザイン性の高いボタン素材を提供しています。このレシピでもその一部を使用しています。&lt;/p&gt;
&lt;h3 id="ノード設定"&gt;ノード設定&lt;/h3&gt;
&lt;p&gt;能力ボタン用のシーンには以下のノードが必要となります。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;AbilityButton: &lt;i class="gd-TextureButton"&gt;&lt;/i&gt; TextureButton
Sweep: &lt;i class="gd-TextureProgressBar"&gt;&lt;/i&gt; TextureProgress
&lt;i class="gd-Timer"&gt;&lt;/i&gt; Timer
Counter: &lt;i class="gd-MarginContainer"&gt;&lt;/i&gt; MarginContainer
Value: &lt;i class="gd-Label"&gt;&lt;/i&gt; Label
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;選択したアイコンを &lt;code&gt;AbilityButton&lt;/code&gt; の &lt;strong&gt;Textures/Normal&lt;/strong&gt; プロパティにドロップしてください。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Sweep&lt;/code&gt;ノードでは、&lt;strong&gt;Presets&lt;/strong&gt;メニューから 「Full Rect」 を選択します。**Fill Mode(塗りつぶしモード)**を「Counter Clockwise(反時計回り)」に設定してください。&lt;/p&gt;
&lt;p&gt;また、クールタイム時の「時計ワイプ」でボタンを暗く表示させたいため、&lt;strong&gt;[変調]&lt;/strong&gt; プロパティに透明度のある濃いグレーを設定してください。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-0fb1b59d5b48cdf100b09e7442351675" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/cooldown_02.png" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-0fb1b59d5b48cdf100b09e7442351675"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/cooldown_02.png" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;i class="gd-Timer"&gt;&lt;/i&gt;&lt;code&gt;Timer&lt;/code&gt;ノードの設定は「One Shot」に設定してください。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Counter&lt;/code&gt;はテキストを保持・配置するためのコンテナです。レイアウトを&amp;quot;Bottom Wide&amp;quot;に設定し、&lt;strong&gt;Theme Overrides/Constants&lt;/strong&gt; セクションでは両方の &lt;strong&gt;Margin Right&lt;/strong&gt; と &lt;strong&gt;Margin Left&lt;/strong&gt; を &lt;code&gt;5&lt;/code&gt; に指定してください。&lt;/p&gt;
&lt;p&gt;最後に、&lt;code&gt;Value&lt;/code&gt;ラベルで［水平整列］を「右揃え」に設定し、［テキストクリッピング］を「有効」にしてください。&lt;strong&gt;テーマオーバーライド／フォント&lt;/strong&gt;にフォントを追加してください。動作確認のため、&lt;strong&gt;テキスト&lt;/strong&gt;欄には &lt;code&gt;0.0&lt;/code&gt; のような値を入力してください。アイコンが白黒の場合は、&lt;strong&gt;テーマオーバーライド／定数／アウトラインサイズ&lt;/strong&gt;として &lt;code&gt;1&lt;/code&gt; を設定すると効果的です。&lt;/p&gt;
&lt;h3 id="スクリプト"&gt;スクリプト&lt;/h3&gt;
&lt;p&gt;以下のスクリプトを &lt;code&gt;AbilityButton&lt;/code&gt; に追加してください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Timer&lt;/code&gt; の &lt;code&gt;timeout&lt;/code&gt; シグナルと &lt;code&gt;AbilityButton&lt;/code&gt; の &lt;code&gt;pressed&lt;/code&gt; シグナルを接続します。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript" data-lang="gdscript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;extends&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;TextureButton&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;class_name&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;AbilityButton&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d08770"&gt;@onready&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; time_label &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; $Counter/Value
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d08770"&gt;@export&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; cooldown &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;1.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;_ready&lt;/span&gt;&lt;span style="color:#eceff4"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; time_label&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;hide&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $Sweep&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;value &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $Sweep&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;texture_progress &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; texture_normal
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $Timer&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;wait_time &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; cooldown
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#88c0d0"&gt;set_process&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;false&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;まず、能力のクールタイム時間を格納する&lt;code&gt;cooldown&lt;/code&gt;変数をエクスポートします。次に、&lt;code&gt;_ready()&lt;/code&gt;メソッド内でこの値を使用して&lt;code&gt;Timer&lt;/code&gt;を設定できます。最後に、カウントダウン中のみ表示させたいため、ラベルは非表示にしておきます。&lt;/p&gt;</description></item><item><title>ダメージのポップアップ表示</title><link>https://kamera25.github.io/godot_recipes/4.x/ja/ui/floating_text/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kamera25.github.io/godot_recipes/4.x/ja/ui/floating_text/index.html</guid><description>&lt;div class="box notices cstyle tips"&gt;
&lt;div class="box-label"&gt;ℹ️ 留意事項&lt;/div&gt;
&lt;div class="box-content"&gt;
&lt;p&gt;この記事は Godot 3から Godot 4 へ内容の書き換え中です。
Godot4では存在しない変数、関数が含まれている場合があります。もしその場合はリポジトリの&lt;a href="https://github.com/kamera25/godot_recipes/issues" target="_blank"&gt;Issues&lt;/a&gt;までご報告ください。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="課題"&gt;課題&lt;/h2&gt;
&lt;p&gt;ダメージを受けたとき、数字を浮かせながら表示(Floating Combat Text)させたい。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-0d07e254652cb8c11f845800d511b059" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/fct_demo.gif" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-0d07e254652cb8c11f845800d511b059"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/fct_demo.gif" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="解決策"&gt;解決策&lt;/h2&gt;
&lt;p&gt;この問題に取り組む方法は様々です。例えば、ビットマップフォントを使用し、各数字をその構成桁から画像として生成した上で、&lt;i class="gd-Sprite2D"&gt;&lt;/i&gt;&lt;code&gt;Sprite2D&lt;/code&gt;ノードを使って表示・移動させるといった手法が考えられます。&lt;/p&gt;
&lt;p&gt;ただし、このレシピでは &lt;i class="gd-Label"&gt;&lt;/i&gt;&lt;code&gt;Label&lt;/code&gt; ノード（名前は「FCT」）を使用します。この方法であれば、フォントの変更が柔軟に行えるだけでなく、数字を文字列として表示するのも簡単になります。さらには状況に応じて「miss」などの他のメッセージを表示することもできます。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;LabelSettings&lt;/code&gt; を追加し、お好みのフォントを使用します。&amp;ldquo;Xolonium.ttf&amp;rdquo; フォントを使用し、文字サイズを &lt;code&gt;28&lt;/code&gt; ポイントに、アウトラインの色を黒、幅を &lt;code&gt;4&lt;/code&gt; ピクセルに設定しています。&lt;/p&gt;
&lt;p&gt;ラベルにスクリプトを追加してください。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript" data-lang="gdscript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;extends&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;Label&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;show_value&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;value&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; travel&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; duration&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; spread&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; crit&lt;span style="color:#81a1c1"&gt;=&lt;/span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;false&lt;/span&gt;&lt;span style="color:#eceff4"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;浮動テキストを出現させる際に、この関数を呼び出してパラメーターを設定します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;value&lt;/code&gt; - 表示する数値（または文字列）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;travel&lt;/code&gt; - 移動方向を表す &lt;code&gt;Vector2&lt;/code&gt; オブジェクト&lt;/li&gt;
&lt;li&gt;&lt;code&gt;duration&lt;/code&gt; - テキストが表示される時間の長さ&lt;/li&gt;
&lt;li&gt;&lt;code&gt;spread&lt;/code&gt; - この角度範囲内でランダムに動きが拡散される&lt;/li&gt;
&lt;li&gt;&lt;code&gt;crit&lt;/code&gt; - &lt;code&gt;true&lt;/code&gt; の場合、ダメージが「クリティカルヒット」であることを意味するフラグ&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以下にこの関数の機能を説明します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript" data-lang="gdscript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; text &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; value
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; movement &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; travel&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;rotated&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;rand_range&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;-&lt;/span&gt;spread&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;&lt;span style="color:#b48ead"&gt;2&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; spread&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;&lt;span style="color:#b48ead"&gt;2&lt;/span&gt;&lt;span style="color:#eceff4"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rect_pivot_offset &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; rect_size &lt;span style="color:#81a1c1"&gt;/&lt;/span&gt; &lt;span style="color:#b48ead"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;まず、指定された値を設定し、与えられたスプレッド範囲（例：±90度）に基づいて移動をランダム化します。スケーリングもアニメーション化する可能性があるため、制御点の中心からスケールが開始されるよう &lt;code&gt;rect_pivot_offset&lt;/code&gt; を中央に設定します。&lt;/p&gt;</description></item><item><title>ミニマップ／レーダー</title><link>https://kamera25.github.io/godot_recipes/4.x/ja/ui/minimap/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kamera25.github.io/godot_recipes/4.x/ja/ui/minimap/index.html</guid><description>&lt;h2 id="課題"&gt;課題&lt;/h2&gt;
&lt;p&gt;プレイヤーの視界外にあるオブジェクトの位置を表示するためのミニマップまたはレーダー風UI要素が欲しい。&lt;/p&gt;
&lt;h2 id="解決策"&gt;解決策&lt;/h2&gt;
&lt;p&gt;以下に、目指している実装例をご紹介します。
&lt;video controls src="https://kamera25.github.io/godot_recipes/4.x/img/minimap_01.webm"&gt;&lt;/video&gt;&lt;/p&gt;
&lt;h3 id="プロジェクト設定"&gt;プロジェクト設定&lt;/h3&gt;
&lt;p&gt;この機能を説明するため、まずは&lt;a href="https://kamera25.github.io/godot_recipes/4.x/ja/2d/autotile_intro/"&gt;自動タイルのレシピ&lt;/a&gt;を使用した簡素な見下ろし型ゲームと&lt;a href="https://kamera25.github.io/godot_recipes/4.x/ja/2d/topdown_movement/"&gt;見下ろしキャラクター操作レシピ&lt;/a&gt;に基づくプレイヤーから始めてください。各コンポーネントの動作詳細については、リンク先のレシピを参照してください。&lt;/p&gt;
&lt;div class="box notices cstyle note"&gt;
&lt;div class="box-label"&gt;&lt;i class="fa-fw fas fa-exclamation-circle"&gt;&lt;/i&gt; メモ&lt;/div&gt;
&lt;div class="box-content"&gt;
&lt;p&gt;本プロジェクトのアートワークは&lt;a href="https://kenney.nl" target="_blank"&gt;kenney.nl&lt;/a&gt;提供のものを使用しています。以下からダウンロードできます。&lt;a href="https://kamera25.github.io/godot_recipes/4.x/files/minimap_assets.zip"&gt;Minimap アセット&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;メインシーン設定は以下のように構成されています。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-3c6e7ae63dcceef0c57a0e27bbe884c2" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/minimap_01.png" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-3c6e7ae63dcceef0c57a0e27bbe884c2"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/minimap_01.png" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;CanvasLayer&lt;/code&gt; ノードは、ミニマップ／レーダーなどのUIコンポーネントを保持するために使います。このレシピで作成するこれらの要素を収容するためのものです。&lt;/p&gt;
&lt;h3 id="ユーザーインターフェース配置"&gt;ユーザーインターフェース配置&lt;/h3&gt;
&lt;p&gt;まず最初に、ミニマップのレイアウトを作成してください。ゲーム内に存在する他のUI要素と連携させるためには、スムーズなリサイズが可能で、コンテナベースのレイアウトに適切に統合できるものでなければなりません。&lt;/p&gt;
&lt;p&gt;まず、&lt;i class="gd-MarginContainer"&gt;&lt;/i&gt;&lt;code&gt;MarginContainer&lt;/code&gt;を追加してください。次に、その［テーマ設定/定数］をすべて&lt;code&gt;5&lt;/code&gt;に設定します。このコントロールは残りのノードを保持し、他の要素に影響を与えないようにする役割を果たします。名前は「ミニマップ」とし、シーンを保存してください。&lt;/p&gt;
&lt;p&gt;次に、このプロジェクトに &lt;i class="gd-NinePatchRect"&gt;&lt;/i&gt;&lt;code&gt;NinePatchRect&lt;/code&gt;ノードを追加してください。このノードは &lt;code&gt;TextureRect&lt;/code&gt;と似ていますが、角や端を引き伸ばさずにリサイズする点が異なります。アセットフォルダから &lt;strong&gt;[テクスチャ]&lt;/strong&gt; プロパティに &lt;code&gt;panel_woodDetail_blank.png&lt;/code&gt; 画像をドラッグ＆ドロップしてください。この画像は &lt;code&gt;128x128&lt;/code&gt;ピクセルのもので、ルート &lt;i class="gd-MarginContainer"&gt;&lt;/i&gt;&lt;code&gt;MarginContainer&lt;/code&gt;ノードを拡大すると、画像が伸びすぎて見栄えが悪くなります。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-bc10febb9ff90c56377b1404469f90ed" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/minimap_02.gif" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-bc10febb9ff90c56377b1404469f90ed"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/minimap_02.gif" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;i class="gd-NinePatchRect"&gt;&lt;/i&gt;&lt;code&gt;NinePatchRects&lt;/code&gt;のプロパティを使用することで、引き伸ばした場合もフレームサイズが一定に保たれます。これらのプロパティは「テクスチャ領域」パネルでグラフィカルに定義できますが、直接数値を入力する方が簡単な場合もあります。&lt;strong&gt;パッチ余白&lt;/strong&gt; セクションにある4つのプロパティをすべて &lt;code&gt;64&lt;/code&gt; に設定し、ノード名を &amp;ldquo;Frame&amp;rdquo; に変更してください。&lt;/p&gt;
&lt;p&gt;サイズを変更するとどうなるか、次に見てみてください。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-06a39291b56c62a52e4427b38ce6b6d3" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/minimap_03.gif" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-06a39291b56c62a52e4427b38ce6b6d3"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/minimap_03.gif" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;次に、フレームの内側部分をグリッドパターン &lt;code&gt;pattern_blueprintPaper.png&lt;/code&gt; で埋めたいと思います。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-5468bf29fabadd6178ed20e2c5cf7e1d" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/pattern_blueprintPaper.png" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-5468bf29fabadd6178ed20e2c5cf7e1d"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/pattern_blueprintPaper.png" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ただし、フレームのサイズがどうあれ自動でタイル表示されるようにする必要があります。また、グリッドエリアはミニマップマーカーが表示される場所なので、枠線を超えて拡張しないようにしなければなりません。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;MiniMap&lt;/code&gt;の子要素（かつ&lt;code&gt;Frame&lt;/code&gt;の兄弟要素）として、新たに &lt;i class="gd-MarginContainer"&gt;&lt;/i&gt;&lt;code&gt;MarginContainer&lt;/code&gt; を追加してください。&lt;strong&gt;テーマオーバーライド/定数&lt;/strong&gt; で4つのマージンプロパティをすべて &lt;code&gt;20&lt;/code&gt; に設定します。このノードの子要素として &lt;i class="gd-TextureRect"&gt;&lt;/i&gt;&lt;code&gt;TextureRect&lt;/code&gt; を追加し、&lt;strong&gt;Texture&lt;/strong&gt; を上記の画像に割り当てます。&lt;strong&gt;Stretch Mode&lt;/strong&gt; は「Tile」に設定してください。このノードには「Grid」という名前を付けます。&lt;/p&gt;
&lt;p&gt;ルートノードのサイズを変更して効果を確認してください。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-acb7f916073ce401fe601eb17a3a442f" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/minimap_04.gif" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-acb7f916073ce401fe601eb17a3a442f"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/minimap_04.gif" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;まずはミニマップのサイズを &lt;code&gt;(200, 200)&lt;/code&gt; のままにしておきます。ルートノードの &lt;strong&gt;[Size]&lt;/strong&gt; プロパティは [レイアウト] セクションで確認できます。&lt;/p&gt;</description></item><item><title>レベル選択メニュー</title><link>https://kamera25.github.io/godot_recipes/4.x/ja/ui/level_select/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kamera25.github.io/godot_recipes/4.x/ja/ui/level_select/index.html</guid><description>&lt;div class="box notices cstyle tips"&gt;
&lt;div class="box-label"&gt;ℹ️ 留意事項&lt;/div&gt;
&lt;div class="box-content"&gt;
&lt;p&gt;この記事は Godot 3から Godot 4 へ内容の書き換え中です。
Godot4では存在しない変数、関数が含まれている場合があります。もしその場合はリポジトリの&lt;a href="https://github.com/kamera25/godot_recipes/issues" target="_blank"&gt;Issues&lt;/a&gt;までご報告ください。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="課題"&gt;課題&lt;/h2&gt;
&lt;p&gt;ゲームには「レベル選択」メニューが必要となります。ユーザーがグリッド形式のオプションから選べるようにしてください。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-6db3b4880836f927502d09876416221f" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/level_select_03.gif" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-6db3b4880836f927502d09876416221f"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/level_select_03.gif" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="解決策"&gt;解決策&lt;/h2&gt;
&lt;p&gt;上記の例で示したように、プレイヤーが自由に選択できるレベル「ボックス」で構成されたスクロールグリッドを作成します。まず個々のレベルボックスから始めてください。&lt;/p&gt;
&lt;h3 id="1-レベルボックス"&gt;1: レベルボックス&lt;/h3&gt;
&lt;p&gt;以下にノードの設定を示します。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;LevelBox: &lt;i class="gd-PanelContainer"&gt;&lt;/i&gt; PanelContainer
&lt;i class="gd-Label"&gt;&lt;/i&gt; Label
&lt;i class="gd-MarginContainer"&gt;&lt;/i&gt; MarginContainer
&lt;i class="gd-TextureRect"&gt;&lt;/i&gt; TextureRect
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;i class="gd-TextureRect"&gt;&lt;/i&gt; TextureRect はロックアイコンの表示用、&lt;i class="gd-Label"&gt;&lt;/i&gt; Label はレベル番号の表示用に使います。一方が表示されている間は、もう一方は非表示になります。&lt;/p&gt;
&lt;p&gt;ご自由にスタイルを設定できます。例としては。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-b43fccff25c4024d2869c8d5b1810140" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/level_select_01.gif" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-b43fccff25c4024d2869c8d5b1810140"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/level_select_01.gif" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;インスペクターで &lt;code&gt;LevelBox&lt;/code&gt; の&lt;strong&gt;カスタム最小サイズ&lt;/strong&gt;を必ず設定してください。ここでは例として &lt;code&gt;(110, 110)&lt;/code&gt; を使用していますが、実際のレイアウト要件に応じて調整が必要となります。&lt;/p&gt;
&lt;p&gt;次に、スクリプトを追加し、&lt;code&gt;gui_input&lt;/code&gt;シグナルに接続してください。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript" data-lang="gdscript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d08770"&gt;@tool&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;extends&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;PanelContainer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;signal&lt;/span&gt; level_selected
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d08770"&gt;@export&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; locked &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;true&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; set &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; set_locked
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d08770"&gt;@export&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; level_num &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;1&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; set &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; set_level
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d08770"&gt;@onready&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; lock &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; $MarginContainer/Lock
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d08770"&gt;@onready&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; label &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; $Label
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;set_locked&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;value&lt;span style="color:#eceff4"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; locked &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; value
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;not&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;is_inside_tree&lt;/span&gt;&lt;span style="color:#eceff4"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;await&lt;/span&gt; ready
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; lock&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;visible &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; value
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; label&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;visible &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;not&lt;/span&gt; value
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;set_level&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;value&lt;span style="color:#eceff4"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; level_num &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; value
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;not&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;is_inside_tree&lt;/span&gt;&lt;span style="color:#eceff4"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;await&lt;/span&gt; ready
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; label&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;text &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;str&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;level_num&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;_on_gui_input&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;event&lt;span style="color:#eceff4"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; locked&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; event &lt;span style="color:#81a1c1;font-weight:bold"&gt;is&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;InputEventMouseButton&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;and&lt;/span&gt; event&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;pressed&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; level_selected&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;emit&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;level_num&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1"&gt;print&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Clicked level &amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; level_num&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ここで &lt;code&gt;@tool&lt;/code&gt; を使用しているのは、インスペクターでプロパティを変更した場合、その変更が即座に反映されるようにするためです。シーンを実行しなくても変化を確認できます。ぜひお試しください。&lt;strong&gt;［ロック］&lt;/strong&gt; プロパティをクリックして、ロック表示が出たり消えたりするのを確認してください。&lt;/p&gt;</description></item><item><title>リングコマンド</title><link>https://kamera25.github.io/godot_recipes/4.x/ja/ui/radial_menu/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kamera25.github.io/godot_recipes/4.x/ja/ui/radial_menu/index.html</guid><description>&lt;h2 id="課題"&gt;課題&lt;/h2&gt;
&lt;p&gt;オプションを選択するため、「リングコマンド」を実装したい。&lt;/p&gt;
&lt;h2 id="解決策"&gt;解決策&lt;/h2&gt;
&lt;p&gt;リングコマンドは様々なゲームで使用されており、複数のボタンを選択するためのインターフェースとして機能します。例えば、ゲーム内のNPCをクリックすると、会話・調査・攻撃など、取るべき行動を選択できるようになります。&lt;/p&gt;
&lt;p&gt;メニューの具体的なデザインは、ゲーム全体の美的感覚と調和させる必要があります。このデモでは、主にメニュー機能の実装に焦点を当て、スタイリングについてはユーザー側で自由に選択できるようにしてください。&lt;/p&gt;
&lt;p&gt;以下にノードの設定を示します。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-e460d190ae0de6a13e90562f042d4ddf" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/ui_radial_menu_01_4.png" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-e460d190ae0de6a13e90562f042d4ddf"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/ui_radial_menu_01_4.png" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ルートノードとして &lt;i class="gd-TextureButton"&gt;&lt;/i&gt;&lt;code&gt;TextureButton&lt;/code&gt; を使用しています。これがメニューの開閉に使用するボタンです。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Buttons&lt;/code&gt; &lt;i class="gd-Control"&gt;&lt;/i&gt;&lt;code&gt;Control&lt;/code&gt;ノードは、必要に応じて任意の数のアイテムを配置できるコンテナとして機能します。このコントロールの&lt;strong&gt;マウス/フィルター&lt;/strong&gt;プロパティを &amp;ldquo;Ignore&amp;rdquo; に設定することを忘れないでください。これによりマウスクリックが誤って捕捉されるのを防ぎます。&lt;/p&gt;
&lt;p&gt;本例では、&lt;a href="https://kamera25.github.io/godot_recipes/4.x/ja/ui/cooldown_button/"&gt;クールタイムボタンレシピ&lt;/a&gt; から9つのボタンを使用しています。&lt;/p&gt;
&lt;p&gt;それでは、ボタンのスクリプトを見てみてください。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript" data-lang="gdscript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;extends&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;TextureButton&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;class_name&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;RadialMenuButton&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d08770"&gt;@export&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; radius &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;120&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d08770"&gt;@export&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; speed &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0.25&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; num
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; active &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以下が変数の定義です。&lt;code&gt;radius&lt;/code&gt;はメニューの「大きさ」を表します、つまり円の半径です。&lt;code&gt;speed&lt;/code&gt;はアニメーション用で、数値が小さいほど動作が速くなります。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;num&lt;/code&gt; はボタンの総数を追跡し、&lt;code&gt;active&lt;/code&gt; はメニューが開いているか閉じているかを示すフラグとして機能します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript" data-lang="gdscript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;_ready&lt;/span&gt;&lt;span style="color:#eceff4"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $Buttons&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;hide&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; num &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; $Buttons&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;get_child_count&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;for&lt;/span&gt; b &lt;span style="color:#81a1c1;font-weight:bold"&gt;in&lt;/span&gt; $Buttons&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;get_children&lt;/span&gt;&lt;span style="color:#eceff4"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; b&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;position &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; position
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;_ready()&lt;/code&gt;では、メニューボタンをデフォルトで非表示にし、その位置をメインボタンに設定することから始めます。&lt;/p&gt;
&lt;p&gt;メインボタンの&lt;code&gt;pressed&lt;/code&gt;シグナルを接続します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript" data-lang="gdscript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;_on_pressed&lt;/span&gt;&lt;span style="color:#eceff4"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; disabled &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; active&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#88c0d0"&gt;hide_menu&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;else&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#88c0d0"&gt;show_menu&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このボタンをクリックするとメニューの表示／非表示が切り替わります。また、このボタンを一時的に無効化してください。そうしないと、Tween実行中にもう一度クリックすると、Tweenが最初から再生され直してしまいます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript" data-lang="gdscript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;_on_tween_finished&lt;/span&gt;&lt;span style="color:#eceff4"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; disabled &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;not&lt;/span&gt; active&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $Buttons&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;hide&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Tweenアニメーションが完了したら、アクティブ状態を切り替え、ボタンを再有効化します。&lt;/p&gt;
&lt;p&gt;以下の&lt;code&gt;show_menu()&lt;/code&gt;関数を見てみてください。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript" data-lang="gdscript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;show_menu&lt;/span&gt;&lt;span style="color:#eceff4"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $Buttons&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;show&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; spacing &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;TAU&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;/&lt;/span&gt; num
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; active &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; tw &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;create_tween&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;set_parallel&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tw&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;finished&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;connect&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;_on_tween_finished&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;for&lt;/span&gt; b &lt;span style="color:#81a1c1;font-weight:bold"&gt;in&lt;/span&gt; $Buttons&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;get_children&lt;/span&gt;&lt;span style="color:#eceff4"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;# Subtract PI/2 to align the first button to the top&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; a &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; spacing &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt; b&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;get_position_in_parent&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;-&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;PI&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;/&lt;/span&gt; &lt;span style="color:#b48ead"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; dest &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;Vector2&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;radius&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;rotated&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;a&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tw&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;tween_property&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;b&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;position&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; dest&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; speed&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;from&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#8fbcbb"&gt;Vector2&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;ZERO&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;set_trans&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#8fbcbb"&gt;Tween&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;TRANS_BACK&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;set_ease&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#8fbcbb"&gt;Tween&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;EASE_OUT&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tw&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;tween_property&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;b&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;scale&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;Vector2&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;ONE&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; speed&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;from&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#8fbcbb"&gt;Vector2&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#b48ead"&gt;0.5&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0.5&lt;/span&gt;&lt;span style="color:#eceff4"&gt;))&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;set_trans&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#8fbcbb"&gt;Tween&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;TRANS_LINEAR&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この関数では、各アイテム間に必要な角度（&lt;code&gt;spacing&lt;/code&gt;）を計算します。その後、ボタンごとにループし、この角度と選択した&lt;code&gt;radius&lt;/code&gt;に基づいて目的地座標（&lt;code&gt;dest&lt;/code&gt;）を求めます。それぞれのボタンに対して、2つのプロパティである&lt;code&gt;position&lt;/code&gt;と&lt;code&gt;scale&lt;/code&gt;をTween処理することで、希望する効果を実現します。&lt;/p&gt;</description></item></channel></rss>