2026-10-25

ユウゴローグ:剣に関連するカードの上方修正を計画中です

ユウゴローグというシンプルなローグライトをリリースしてから3週間が経過しました。既に各種サイトの新着リストからは見つけにくくなっておりますが、現在も一定数のアクセスをいただいております。ありがとうございます。

さて、2週間前のv1.0.1のアップデートで優先度の低かったカードを強化しましたが、この上方修正の恩恵を十分に受けていないカードや、返って優先度が落ちたと思われるカードが見受けられたため、次のv1.0.2で以下の変更を予定しております。

カードの効果の上方修正

  1. 剣の舞: トラッシュを上から2枚見て、剣だけ手札に加える。
    →トラッシュから剣を2枚手札に戻す。(最後に捨てた剣が優先)
  2. 剣術の極意: 手札の剣に「1枚ドロー」の効果を与える。(重複なし)。
    →手札の剣に「1枚ドロー」の効果を追加する。(重ね掛け可)

1. 剣の舞の対象制限を緩和

剣の舞は、直近のトラッシュに積まれた剣を手札に戻すカードです。より汎用性の高い「よみがえる一手」がリリース前に厳しくナーフされていたのと同様に、剣の舞は最善の効果を得ようとすると煩雑な準備が必要で、直前に2枚連続で剣を使用する必要がありました。

検討の結果、よみがえる一手の制限が緩和された点を考慮して、剣の舞は単純にトラッシュから剣を手札に戻す効果に変わります。トラッシュの一番上から順番にカードを調べて、最大2枚の剣を手札に戻します。

2. 剣術の極意の重ね掛けを解禁

よみがえる一手の対象条件を緩和したことで、槍ビルドや斧ビルドのドローカードをトラッシュから再利用することが可能になりました。このゲームにおいてドローカードの再利用は極めて強力ですが、剣術の極意は「重複不可」の制限があるため、恩恵を受けることができませんでした。

検討の結果、剣術の極意はレジェンドカードなので1枚しか所持できず、再利用するケースはv1.0.1以降のよみがえる一手だけなので、重複不可の制限を外すことにしました。

剣のカードに剣術の極意を1回使うと「1枚ドロー。」という言葉が説明文に追加され、もう1回使うと該当の言葉が「2枚ドロー。」に変わります。

挑戦の跡に履歴の数を表記

「挑戦の跡」画面を開くと挑戦の履歴が一覧表示されますが、一番下までスクロールしても「100件まで保存」と表示されるだけでした。今後は履歴の数が10件なら「10件(100件まで保存)」と表示されます。

さいごに

今回の上方修正の一番のモチベーションは、アクセスしてくださる皆様の存在が大きかったです。引き続きご愛顧よろしくお願いします。

2026-10-11

公開したゲームにアクセスいただき、ありがとうございます!

先日公開した『ユウゴローグ:勇者が5回戦うローグライト』が、想像以上に多くのプレイヤーに楽しんでいただいております。ありがとうございます。

フリーゲーム夢現様に掲載していただいた時のピークを過ぎてからも、毎日平均して10人前後の方に遊んでいただいております。

今日はGodot Playerの新着一覧の一番良い位置から離れたところで、今回の挑戦の区切りとしてちょうど良いので、リリース当初から遊んでいただいた皆様に改めて感謝を申し上げさせていただきます。

改めて、遊んでくださった皆さん、ありがとうございました!

プレイヤーと一緒に築いた偉業


2026-10-10

ユウゴローグ:一部カードの上方修正を計画中です→実施しました

ユウゴローグをリリースして一週間が経ちましたが、個人製作の趣味のゲームにかかわらず、今も一定数のアクセスをいただいております。ありがとうございます。

本ゲームはミニマムな構成のため、公開した時点の仕様で一応の完成と考えておりますが、プレイ環境の改善のために以下の変更を行う予定です。

カードの効果の上方修正

  1. 渾身の一撃: トラッシュの武器の枚数×10のダメージ。
    →トラッシュの武器の枚数×15のダメージ。
  2. よみがえる一手: トラッシュから武器1枚を選んで手札に加える。
    →(対象制限の緩和を検討中)
  3. 三角のお守り: 3ターン目なら敵から受けるダメージが0になる。
    →このターン中に武器を使わないなら、敵の攻撃を回避する。

1. 渾身の一撃のダメージを5増加

渾身の一撃は使いやすい効果を持ちますが、ダメージを伸ばすことが意外と難しいため、対策としてシンプルにダメージを増やすことにしました。

プレイヤーが渾身の一撃のダメージを伸ばすには、デッキ内の武器カードを増やす必要がありますが、これは初期手札の多くが武器になるリスクが上昇し、展開の幅が狭まります。手札に渾身の一撃が2枚あるとダメージが大幅に伸びますが、残りの3枚にドローカードが含まれていないと、結局ダメージは伸びません。また、トラッシュを再利用するカードとは相性が悪いです。これらの背景から、ダメージの増加が必要と判断しました。

2. よみがえる一手の対象制限を緩和(検討中)

よみがえる一手はドローカードと組み合わせた時に、簡単にデッキの大半のカードを引き切ってしまい、難易度を大幅に変える恐れがあるため、リリース前に対象を武器カードに制限していました。

現在の効果でも、武器のバフ効果を持つカードを後からドローした時に、トラッシュから武器を拾って再利用する、という使い方はありますが、他のレジェンドカードよりも明らかに優先度が下がっていました。

対策として、このカードの対象を「剣/槍/斧と書かれたカード」に変える案を検討しています。限定的とはいえドローカードと組み合わせることが可能になるので、引き続き動作を検証中です。

3. 三角のお守りの条件と役割を変更

三角のお守りは敵から受けるダメージを0にする強力な効果を持つため、リリース当初から厳しい条件を付けていました。その結果、確実に勝ちたい1周目に回復を捨てて入れるほどでもなく、運要素の多い2周目にわざわざ入れる余裕もなく、ノーマルカードの中でも優先度が低くなりがちでした。

対策として、このカードの役割を変更し、単なる回避カードではなくターンを消費して初期手札を引き直すカードと位置付けることにしました。

このカードがプレイヤーに回避状態を付与しようとするのは同じですが、ターン中に武器を使っていた場合は付与されません。また、回避状態が付与された後に武器を使った場合、回避状態が解除されます。

想定している使い方としては、初期手札が悪かった時に引き直す目的で使用します。武器カードさえ使わなければ良いので、ドローカードを使って手札を増やしたり、回復カードを使ってHPを増やしても問題ありません。ただし、本ゲームは10ターン以内に敵を倒さないと、敗北になります。

一部の画面にゲームのバージョン番号を表記

今回の更新でカードの効果が変わるため、以下の画面にバージョンを表記します。

  • 設定画面: 現在のバージョンを表記
  • 挑戦の跡のデッキ画面: 当時のバージョンを表記(ただしリリース直後のデータは空欄)

今回の更新のバージョンは「1.0.1」で、挑戦の跡のデッキ画面にも表記されます。
一方、リリース直後のバージョン(内部的には1.0.0)は、以前からの表示内容を維持するため、挑戦の跡のデッキ画面に表示しません。

つまり、今回の更新が実施されると、古い挑戦のデッキ画面は今まで通りバージョンの表記なし、新しい挑戦のデッキ画面は1.0.1が表記されます。

追記:本日15時にアップデートします

動作テストの結果が良好だったので、本日の15:00からアップデートを実施します。ゲームのファイルサイズが小さいので、アップデート自体は一瞬で終わります。

追記:予定通りアップデートを実施しました

バージョン1.0.1になりました。

2026-10-09

ゲーム制作時のテキストの折り返し位置が悩ましい

今回はカードを使うゲームを作ったので、折り返しの必要なテキストが沢山ありました。

加え/る、トラッシ/ュ

Godotの技術的な話に絞ると、Labelクラスで使える折り返しモードは一長一短あります。
基本的にはARBITRARYから使い始めますが、日本語のテキストをそのまま表示するので2ケタの数字の真ん中で折り返す恐れがあり、WORD_SMARTは割といい感じですが、句読点が右端に掛かりそうな時に中途半端な位置で折り返されます。WORDは日本語だとそこまで恩恵を感じませんでした。

幸い、ゲーム内のカードの種類は21枚だけなので、カードを1枚1枚チェックして手作業で改行コードを入れて対応しました。とはいえ「改行しすぎて縦に長くなったり、右側がスカスカになるのも不自然」「単語の位置が微妙で改行を入れるべきか判断が難しいケースがある」「手作業が基本になると、テキストに変更が入った時に改行がやり直しになる」といった問題があり、もっと大きなゲームでも同じように対応するか? というと悩ましいところです。

2026-10-08

Godotでダイアログを毎回作成する代わりに表示切替にしたら、スクロールバーの位置が戻らない

最近作ったローグライトは、表示専用のダイアログがいくつかあります。デッキをクリックしたらデッキのカード一覧を表示するダイアログが表示され、トラッシュも同様です。もしカードの効果でトラッシュから1枚選ぶことになったら、トラッシュを参照する選択ダイアログが表示されます。

デッキの内容を表示するダイアログ

このようなシンプルなダイアログは、インスタンスを毎回作成するよりも、必要な時に表示だけ切り替えた方が無駄が少ないように思えました。

そこで、Godotのエディターに表示されているノードツリーの最後にダイアログを追加して、初期状態は非表示にしました。一見すると上手く動いているように見えましたが、スクロールの位置が一番上に戻っていないことに気づきました。

スクロールバーを一番上や一番下に移動する方法は、検索すれば過去のフォーラムのやりとりなどから見つかります。

How to get scrollbar to automatically scroll to bottom? - Help - Godot Forum
https://forum.godotengine.org/t/how-to-get-scrollbar-to-automatically-scroll-to-bottom/74013

要点だけ抜き出すと、以下のようなスクリプトでScrollContainerのスクロールバーの位置を一番上に戻します。(deferredが付くメソッドやawaitを使ってタイミングの調整が必要かもしれません)

scroll_container.scroll_vertical = int(scroll_container.get_v_scroll_bar().min_value)

今回は、どのダイアログもスクロールバーが1個だけなので、上記の処理を組み込むことで解決しました。

仮にスクロールバーが沢山あるダイアログがあった場合、上記の処理をstaticメソッドとして共通化したり、ScrollContainerを継承するクラスに実装して自動的に呼ばれるようにするなどの対処法が考えられます。しかし、そこまでの手間を掛けるよりも、自分の中で基準を決めて、複雑なダイアログは無理にノードツリーに保持しない方がよさそうです。

2026-10-07

Godot でデバッグ中に This control can't grab focus という警告ログが出る

一般的な原因と対処法

警告ログの例

Godotで特定のコントロールにフォーカスを設定したい時はgrab_focusメソッドを使いますが、コントロールの無効化と併用している場合に"This control can't grab focus"という警告ログが出ることがあります。

対処法としては、grab_focusメソッドを使用しているスクリプトを探して、対象のコントロールがフォーカスできる状態かチェックしてからgrab_focusメソッドを呼び出すようにします。

自分に起きたこと

カードを使うゲームをGodotで作ってデバッグしていると、手札やデッキや捨て札をクリックするわけですが、たまにGodotのエディターに"This control can't grab focus"という警告ログが出ることがありました。

全てが解決した今なら、警告の内容が「Controlがフォーカスできない状態なのでgrab_focusが失敗しました。set_focus_modeを使ってフォーカスの取得を可能にしてください」と言われていることが分かるのですが、当時は「カードの操作には何の問題もないのに、なぜset_focus_modeの話が?」と疑問が深まるだけでした。

警告に「grab focus」とあるので、プロジェクトフォルダを検索してみると、カードUIのスクリプトがヒットしました。カードにマウスカーソルを近づけるとカードを手前に表示する処理で、カードゲームとしては良くある挙動です。

func _on_mouse_entered() -> void:
    ...
    if focus_mode != Control.FOCUS_NONE:
        grab_focus()

問題のスクリプトは、mouse_enteredイベントでgrab_focusを呼び出してフォーカスを取得するように実装されていました。事前に「if focus_mode != Control.FOCUS_NONE」でフォーカス可能かチェックしているので、通常はこの対応で問題ないように見えます。

しかし、カードUIの実装を調べてみるとfocus_behavior_recursiveというプロパティも使ってフォーカスの可否を制御していたため、チェックの際はget_focus_mode_with_override というメソッドを使う必要がありました。公式ドキュメントにも、focus_behavior_recursive が影響することもあるのでget_focus_mode_with_override を使うように書いてあります。

Control.focus_mode  — Godot Engine (stable) documentation in English
https://docs.godotengine.org/en/stable/classes/class_control.html#class-control-property-focus-mode

以上の調査結果から、以下のようにチェック処理を変更することで解決しました。

func _on_mouse_entered() -> void:
    ...
    if get_focus_mode_with_override() != Control.FOCUS_NONE:
        grab_focus()

2026-10-06

Godotのオーディオバスの設定が便利。手っ取り早くミュートと音量調整の関数を実現できる

BGMとSEのオーディオバスを追加したところ

オーディオバス — Godot Engine (4.x)の日本語のドキュメント
https://docs.godotengine.org/ja/4.x/tutorials/audio/audio_buses.html

公式ドキュメントにもちゃんと書いてある設定なのですが、Godotのエディターの一番下に表示されている「オーディオ」タブを選択すると、ゲーム内の音声の出力方法を制御できます。

といってもカジュアルなゲームでやりたいことは「ミュートを切り替える」「BGMとSEでボリュームを分ける」の2点です。

「バスを追加」ボタンを押すとMasterバスの隣に新しいバスが追加されるので、1番目の名前を「BGM」、2番目の名前を「SE」にします。他の設定はいじりません。

GDScriptからオーディオバスを使って音声を調整する際は、まず、オーディオバスのインデックスを取得しておく必要があります。

var master_bus_index := AudioServer.get_bus_index("Master")
var bgm_bus_index := AudioServer.get_bus_index("BGM")
var se_bus_index := AudioServer.get_bus_index("SE")

ミュートの切り替えやボリュームの調整は、以下のような関数を作って他のスクリプトから利用できるようにすると便利です。

func is_audio_enabled() -> bool:
    return not AudioServer.is_bus_mute(master_bus_index)


func set_audio_enabled(enabled: bool) -> void:
    AudioServer.set_bus_mute(master_bus_index, not enabled)


func set_bgm_volume(volume: float) -> void:
    AudioServer.set_bus_volume_db(bgm_bus_index, linear_to_db(volume / 100.0))


func set_se_volume(volume: float) -> void:
    AudioServer.set_bus_volume_db(se_bus_index, linear_to_db(volume / 100.0))