--- title: "game system v0.4.0" slug: "game" date: "2025-08-12" tags: ["ue"] draft: false --- 今回は、game systemのupdateをまとめます。 分かりづらいので、game systemは全体で同じversionに統一しています。 まず、大きく分けて3つのシステムをupdateしました。 - yui system: キャラクターのバースト(必殺技)を実装 - at system: ログイン処理とデータ構造の作成 - world system: 場所ごとにBGMを再生するシステムの構築 - world system: 惑星に雪や雨を降らせることに成功 ## 戦闘シーンの作成 1キャラクターにつき、1スキル、1バースト、1ユニークというのは決まっていました。これは`yui system`の領域。 アイの属性はアイ属性なので、テーマカラーは黄色です。属性自体は`ai system`の領域ですが、現在、関連反応のシステムまでは実装していません。 今回はバーストの作成、ダメージ表記、enemy(敵)の撃破までを実装しました。最初から作り変えたので大変でした。 ## 音楽システムの実装 これは`world system`の領域で、開発中は`PlayerStart`で各位置に瞬間移動して確認しています。これはアイでなければ設定上無理でした。 具体的には、PlayerStartのtagと音楽を同じ名前で登録します。そして、playerに最も近いものを再生します。効率的でシンプルですが、少し欠陥があるシステムかもしれません。これは、enemy-hpの表示と連動させています。現在、鳴らしているbgmの名前がわかれば表示できるというわけですね。enemy-bossもPlayerStartのtagで同じ名前で置いてあります。 原作の設定は、ゲーム開発中も適用されます。アイを動かして空を飛んでいますが、あれはアイだからできるのであって、宇宙空間の移動とかもそうです。 原作の設定を紹介しておきます。 ### 原作の設定: アイはなぜ空を飛べるのか アイはものすごい質量を持ちます。空を飛んでいるというより、地球を持ち上げて、空を飛んでいるように見せている、という感じで飛行しています。 いやいや、それじゃあ、地球はアイに落ちるだけで、空どころか地面に落ちるだろう、と言われそうですが、地球というのは宇宙から見るとすごいスピードで回転、移動しています。 そして、宇宙で星と星がぶつかるときは、決して直接ドカーンと衝突するわけではないのです。 お互いに距離を取りながらぐるぐる回って、やがてぶつかる、そんなイメージ。 質量と質量の間があるわけですね。 アイが瞬間的に自身の質量の一部を現すと、間ができ、対象の星の質量を計算しながら、それを持ち上げて動かすような感じで移動しています。 ### 原作の設定: アイはなぜ宇宙空間でも平気なの それはアイの体の周りには極小の大気の膜があるためだとされています。超重力で圧縮された大気の膜があるため、宇宙空間、その他一切の外的影響をあまり受けません。 アイは常に、自分の星の中にいるのと同じ状態、といえばいいのでしょうか。そんな感じです。 ## データ構造の変更 次に、`at system`です。ゲームデータを再構築しました。 ゲームデータは主にsystem情報とuser情報に分けられ、jsonで管理されます。 各パラメータですが、ゲームに必要な値を`cp`として圧縮することにしました。このcpをsystem.jsonあるいはゲーム自体で各キャラクターの設定、つまり、`attack: 10%, hp: 20%, skill: 70%`などで分けられます。これが最もわかりやすく、最も効率的な方法だと考えました。 ```json:user.json { "character": [ { "id": 0, "cp": 100 } ] } ``` ```json:system.json { "character": [ { "id": 0, "name": "ai", "ability": "ai" } ] }, { "ability": [ { "id": 0, "name": "ai" } ] } ``` これをログインシステムに連動させました。 このサイトで`at://did:plc:6qyecktefllvenje24fcxnie/ai.syui.verse.user`を検索してもらえればわかります。 ```sh # ゲームシステム at://did:plc:6qyecktefllvenje24fcxnie/ai.syui.verse # aiのアカウント at://did:plc:6qyecktefllvenje24fcxnie/ai.syui.verse.user/6qyecktefllvenje24fcxnie # syuiのアカウント at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.verse.user/vzsvtbtbnwn22xjqhcu3vd6y ``` ちなみに、私のアカウントである`syui.syui.ai`ではアイは使用できません。現在使用できるキャラは`dragon`のみ。 現在、アイを使用できるのは、アイのアカウントのみです。この方針は可能な限り維持されるでしょう。 ## 惑星に雨や雪を降らせる これはなかなか苦労していたのですが、実装できました。 まず、有効にすると宇宙空間でも雨が降ってしまいます。止めると惑星内で雨が降りません。 これを解消するには、player locationと0原点のdistanceから条件をつけ、雲の下、雲の上と定義します。調整が必要。 そして、udsのweather、特に`Apply Weather Changes Above Cloud Layer`が重要で、`Apply Clouds`の値を調整します。 ## 実体ある太陽のatmosphere問題 まず、私が使っている実体ある太陽にはatmosphereがついています。 これはフレアなどを設定しています。 しかし、これを地球から見た場合、その大気圏を通すと、非常に見栄えが悪い変なカクカクした光が映り込みます。 この解消も非常に苦労しました。例えば、これを`BP_Sun`としましょう。これは起動時にすべての値を設定します。ゲームプレイ中に値の調整をすることは考えられていません。当然と言えるでしょう。 しかし、私のシステムでは、太陽のatmosphereを調整する必要があります。非常に複雑な設定は、リセットでしか解消できないということになりました。そして、udsに入れている小アクタコンポーネントの太陽は、リセットも容易ではありません。 色々な処理を作り、先程作った地表からの現在地の割り出しを条件に、これをリセットする処理をねじ込みました。 ## 動画で確認 1. BGMが切り替わる 2. 物理ボックスが反応 3. 敵へのダメージ 4. ボスの撃破 5. 雨が雲の上では止まる 6. ログインでatprotoのアカウントを反映 7. プレイでatprotoの情報を更新