2025夏休み開発日記(1)

2024春休み開発日記(1)俺は休みではないが」から時は流れに流れ、2025年の夏である。

この間何もしていなかったわけではない。日記を書いていなかっただけで、開発はしていた。2024年の夏休みは「大乱闘タイピング大戦争(通称DTD)」の開発に着手したようだ。最後のコミットは2024年9月25日。夏休みの終わりと共に開発もストップしたようだ。

7月18日(金)

1年ぶりの開発再開ということで、何を作っていたのかも忘れてしまっている。PG部の記事にはしていなかったがNotionにメモが残っているので、手がかりに思い出すことにしよう…。

7月19日(土)

クレーの大冒険でAIによる画像生成をしていたことが気になって、同じようにできるか試してみた。できなかった\(^o^)/オワタ

今回の開発とは別だが困るので、寄り道することにした。まずは、昔の謎のメモを解読する。

使用パッケージ

Stable Diffusion WebUI

StableDiffusion checkpoint

kaywaii_v90.safetensors

SD VAE

vae-ft-mse-840000-ema-pruned.safetensors

Prompt

(masterpiece), best quality, perfect face, 1girl, jeanfavonian, close up, <lora:genshinfull1-000006:1>

Negative prompt

EasyNegative

その他パラメータ

Steps: 20
Sampler: DPM++ 2M SDE Karras
CFG scale: 7
Seed: 2177484048
Size: 512×512
Model hash: d73a21ce20
Model: kaywaii_v90
VAE hash: e9ed949371
VAE: vae-ft-mse-840000-ema-pruned.safetensors
Denoising strength: 0.5
Clip skip: 2
ADetailer model: face_yolov8n.pt
ADetailer prompt: angry
ADetailer confidence: 0.3
ADetailer dilate erode: 4
ADetailer mask blur: 4
ADetailer denoising strength: 0.5
ADetailer inpaint only masked: True
ADetailer inpaint padding: 32
ADetailer version: 24.3.0
Lora hashes: “genshinfull1: dc0354eebf41”
Eta: 0.667
Mask blur: 4
Inpaint area: Only masked
Masked area padding: 32
TI hashes: “easynegative: c74b4e810b03”
Version: v1.8.0

ジン-原神

なんとか、それっぽくできた。

7月20日(日)

選挙の日でした。推していた「チームみらい」が比例代表で1名当選した!

開発になかなか着手できず、先日はStableDiffusionによるAIによる画像生成に囚われてしまったのだが…

今日は今日で、ノートアプリのことが気になってそちらを優先してしまった☺️

今まで、

  1. Evernote
  2. Appleのメモ
  3. Notion

とメモアプリを渡り歩いていたが、最近話題のObsidianに手を出してみることにした。

Notionなどはとても便利で洗練されているが、あくまでもWebアプリであって、データがWeb上に人質として取られてしまう。そして、高機能が故にデータフォーマットも複雑でシンプルなMDではなかったりする。そんな中Obsidianは

  • 無料のローカルアプリ
  • シンプルなMDによる記述
  • Cursorなどの生成AIとの親和性が高い

ということで、魅力がいっぱいである。

しかし、問題もあって、Mac、Windows、iPhoneでデータを同期取りたい場合は少々面倒で、次の3つの方法が用意されている。

  1. Notion等と同じように有料&人質プランに加入する
  2. 気軽だがイマイチなiCloud同期
  3. 自前でサーバーを立ち上げる(自前サーバーもっていれば無料ただし高難易度)

当然、3番目の無料かつ高機能だが高難易度に挑戦するわけである😀

非常に苦戦したが、なんとかセットアップが完了して使えるようになった。詳細はまた別の記事にまとめようと思う。

7月21日(月)

昨日の日記でObsidianのセットアップが完了したと書いたが、実質、今日の午後までかかっていたのでした。頑張ったおかげで無駄に契約していたXServerVPSも無駄にせず、Dockerのおさらいや英語のマニュアルを読む訓練もでき、スキルアップが出来たので良しとしよう!

スクロース-原神

StableDiffusionの思い出しも並行して続けていこう!今日の一枚は原神のスクロース。スケールアップによる高精細な出力の方法を思い出したので試してみた。

7月22日(火)

紆余曲折あったが、本題の開発をスタートすることができた。まずは、思い出し作業。どんなクラスがあったのかまとめ直し、システムの概要を思い出す。

今回からVSCodeではなくCursorで開発を行う。クラスの結合を確認しようとメソッドを右クリックして「参照へ移動」をクリックするが、うんともすんとも言わない。ネットで調べたところ次の方法で解決できた。

  1. 設定画面を開く(Ctrl + Shift + P→settingsと入力してEnter)
  2. 検索欄でUseOmnisharpを検索
  3. Dotnet > Server: Use OmnisharpのチェックをONにする
  4. Cursorの再起動

https://zenn.dev/tmb/articles/1b44f02034b4bd

感謝!

8月3日(日)

日記が滞ってしまったが、開発はしていた😎

何をしていたかというと…

プロジェクトの全体像の把握。

プロジェクトが大きいのでCSファイルを確認するだけでも大変!確認するついでに、ソースコードの整理もできたので、充実感はあったけど…開発はいつ始まるのか!!?

作業しながら思ったのだけど、ダークモードって見づらいよね🫢
流行りに乗って使ってみたけど、目に負担がかかっているような気がするし、夜であればまだしも、昼間だと視認性も低いような気がする。

ということで、Unity開発のプロジェクトもライトモードに変更しました☀️
テーマ:GitHub Light Colorblind (Beta)
フォント:’Mplus1Code-Regular’, ‘M PLUS 1 Code Regular’

8月4日(月)

DTDではないが、キッズタイピング by Unity用のドット絵を描いた。といってもChatGPTにドット絵風で描いてもらったものを「ちゃんとしたドット絵」に修正しただけなんだけどね。

夏だね〜

こんな風に手書きできると良いなぁ〜

Cursorで開発をしようと思ったらUnity拡張機能が動かず、定義を参照などの便利な機能が使えないことに気づいた。約3時間の格闘の末、無事動くようになった。

👇️👇️👇️詳細はこちら👇️👇️👇️
MacでCursorを使ってUnity開発をしたい!

8月5日(火)

8月6日(水)

プロジェクトの概要を掴みつつ、フォルダ構成を変更した。特にプレハブを入れるためのPrefabsフォルダ。動的にプレハブを作る必要があるため、Resources/Prefabsに移動した。しかし、このResourcesフォルダは特殊なフォルダで、基本的にはResource.Loadなどで動的に使用するファイルを格納するところであり、静的なファイルは置かない約束だ。丸ごと移動したので、静的使用のプレハブも一緒にきてしまっていた。ということで、静的なプレハブはResourcesから外すことにした。

しかし、Prefabsというフォルダが階層が異なれど、2つ存在する。手慣れた人であれば違いは明白なのだが、初心者の自分としては後々なんで2つ存在するのか理解するのに時間がかかりそうだ。

Assets/
├── Prefabs/                    (静的配置用)
│   ├── LoadingAnim.prefab
│   ├── SoundManager.prefab
│   └── DebugButton.prefab
└── Resources/
    └── Prefabs/                (動的生成用)

ということで、一般的ではないが、フォルダ名を次のようにした。

Assets/
├── StaticPrefabs/              (静的配置用)
│   ├── LoadingAnim.prefab
│   ├── SoundManager.prefab
│   └── DebugButton.prefab
└── Resources/
    └── Prefabs/                (動的生成用)

8月7日(木)

DTDのプロジェクトで警告が出ていて気になっていたものがある。

[Worker1] Internal: There are remaining Allocations on the JobTempAlloc. This is a leak, and will impact performance

[Worker1] To Debug, run app with -diag-job-temp-memory-leak-validation cmd line argument. This will output the callstacks of the leaked allocations.

どうやらDOTween絡みのようだ。
自分のプロジェクトの場合は、ローディング中のアニメーションをSetLoops(-1, LoopType.Yoyo)のように無限ループさせており、対象のゲームオブジェクトが消えてしまってもDOTweenは操作し続けようとする。Unityの機構によりアプリはクラッシュしないが、警告を発するということのようだ。対策としては、DOTweenのTween対象が途中で破棄される可能性がある場合、.SetLink(gameObject) を使ってTweenをGameObjectにリンクさせることで、GameObjectの破棄と同時にTweenも自動的にKillされるようにできる。これで警告も防げる💪

8月9日(土)

ボタンのシステムを改変した。今までは、赤本(ジュエリーハンター・ダンジョンシューター)などの手法通り、UIボタンを配置し、処理用のスクリプトをアタッチして、Buttonコンポーネントの OnClick に処理メソッドを登録する方法を採用していた。この方法は単純で分かりやすいが、ボタンの種類が増えると、それぞれに対応するスクリプトも増えてしまう。

そこで、Cursorが提案してくれた方法を採用した。
ボタンの見た目の動作と、押された後の処理を分離し、処理部分は複数のスクリプトではなく、1つの基底クラスを持つScriptableObject で管理する方式に変更。
ScriptableObjectを継承した「アクション用クラス」から動作アセットを生成し、それをInspectorのフィールドに割り当てて動作を切り替えられるようにした。

ファイル構成

Assets/Scripts/Menu/Button/
├── ButtonAction.cs              # 基底クラス
├── UniversalButton.cs           # 汎用ボタンコンポーネント
├── ButtonActionFactory.cs       # ファクトリークラス
├── Actions/                     # 個別のアクションクラス
│   ├── SceneTransitionAction.cs
│   ├── DeckSaveAndTransitionAction.cs
│   ├── GachaAction.cs
│   ├── LoginAction.cs
│   └── LogoutAction.cs
└── Examples/
    └── ButtonSetupExample.cs    # 使用例

使用手順

  1. アクションアセットの作成
    1. Projectウィンドウで右クリック
    2. Create → Menu → Button Actions
    3. 目的のアクションを選択(例:Scene Transition)
    4. アセットが作成される
    5. インスペクターでパラメーターを設定(例:移動先のシーン名)
  2. ボタン作成
    • 通常通りUnityエディタでButtonを配置・調整
    • UniversalButton.csコンポーネントを追加
  3. 動作設定
    • インスペクターでButton Action作成したアクションアセットを割り当てる
      (1で作成したアクションアセットをドラッグ)

※新しいアクションの追加
ActionsフォルダにButtonActionを継承した新しいクラスを作成
– [CreateAssetMenu]属性を追加すると、インスペクターの作成メニューに自動で追加される

8月10日(日)

今日は休日とする!

開発はしなかったが、やる気を出す良い方法を見つけた💡

  • 目をつぶって片足で立ち、30秒間を声に出す(加藤俊徳氏)
    • 面倒くさいと思うとき、人間にはまだ余裕があり言い訳をして行動をしなくなってしまうとのこと。
    • 片足立ち、バランスを取る、数を数える、発生する、を同時にさせることにより言い訳をする余裕を断ち切る
    • 脳を一気に活性化させグダグダ感を排除する
  • 10秒でできることをする(大平信孝氏)
    • 脳は大きな変化は受け入れずに元に戻そうとするが、小さな変化は受け入れるという性質がある。
    • 「勉強していない状態→勉強に熱中している状態」は変化が大きすぎる
    • 「参考書を棚から出して持ってみよう」など10秒でできそうなことから行おうとすると良い
    • 側坐核が刺激され、ドーパミンが分泌されて行動に移れる
  • あえて「勉強したい」と言い換える(鶴田豊和氏)
    • 面倒くさいときは義務から逃れるための材料をなんとか集めようと、いろいろと考えてしまう
    • 「勉強しなければならない」→「勉強したい。だって資格試験に合格して、いまよりいい給料がもらえる会社に転職したいから」

8月11日(月)

ガチャを本格実装するに当たって、ユニット(ガチャで引けるキャラクター)にレア度が設定されていないことに気づいた!

ということで、ユニットデータにレアリティの項目を追加する。1項目追加するといえば簡単だが、データ構造、ユニット情報の表示項目など、関連箇所は多岐に及ぶため、大変!なのだが、今はAIの補助があるので、関連箇所のピックアップ&修正はかなり楽になった😄

8月12日(火)

仮実装されていたガチャの仕組みを整えた。

ファイル構成

TypingProject/Assets/
├── Scripts/
│   ├── Gacha/
│   │   └── Card.cs                    # ガチャカードのデータ構造
│   ├── Service/
│   │   ├── GachaManager.cs            # ガチャのビジネスロジック管理
│   │   ├── GachaService.cs            # PlayFab通信サービス
│   │   └── GachaUsageExample.cs       # 使用例サンプル
│   └── Menu/Button/
│       ├── Actions/
│       │   └── GachaAction.cs         # ガチャボタンのアクション
│       └── OldSystem/
│           ├── GachaButton.cs          # 旧システムのガチャボタン
│           └── GachaButton2.cs         # 新アーキテクチャ版ガチャボタン
├── Scenes/
│   └── GachaScene.unity               # ガチャ画面のシーン
└── Images/
    └── gacha_card.ase                 # ガチャカードの画像ファイル

コメントする