--- 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: 惑星に雪や雨を降らせることに成功 ## 思想から解説 まず、私がどういった考えを持ち、開発しているのか説明します。 以前、広い世界から狭い世界へ。狭い世界から広い世界への移行、演出が重要だと言いました。これはすぐに広い世界をアイを操作して飛び回れるようなゲームではないんだ。小さくても、しっかりとした世界、ゲームを作ることが重要なんだ。そのような主張だったと思います。 これについて、なんでそんな事を言うのだろうと疑問を持った人もいるかもしれません。したがって、この点について解説していきたいと思います。 ### アイを使ってゲームをプレイするのはつまらない アイを操作してゲームをプレイするのは、恐ろしいほど、つまらないです。 私は普段、アイを使ってゲームを操作し、この世界を飛び回り、そして、敵を撃破します。 なぜなら、そのほうが開発に便利なので、または、アイというキャラクターの設定上、あるいは、私が単にゲーム開発でやってみたかったことを実現するため、そうしています。 例えば、アイというキャラクターが現実にいたら一体どんな感じになるのだろう。それを体感してみたいので、unreal engineを触り始めたという経緯があります。これはゲームエンジンで、今もそれを使って開発しています。 しかし、先程も述べたように、そのようなゲームは恐ろしくつまらない、ということです。 とすれば、小さくても、しっかりしたゲームを作ること。それが重要になります。上のようなゲームを作ってはいけないのです。 ですから、人気のある多くのゲームは、小さくても、しっかりしたゲームばかり。 その数は増え続けています。なぜなら、それが正解だから。 ### 一人の開発者でもできること さて、ここで、私のような一人で開発している人はどうすればいいのでしょう。 その答えの一つが「小さく、しっかりしたゲームを作ること」です。 しかし、先程も述べたように、そういうゲームは山のようにあって、それは素晴らしいものですが、年々、大手が出すゲームが大量かつすごいものばかりで、プレイヤーの要求水準が上がり、大変なことになっています。しっかりした大規模なゲームでも厳しい。そのような状況だと思います。 そこで私が考えたのは、シーンとゲームを分けること。 私が作っているゲームは恐ろしくつまらない。でも、それはプレイするまでの話で、一見するとやってみたくなるかもしれない。そのようなものなのです。 これが、広い世界から狭い世界へ。その言葉の意味であり、広い世界を作ったあとに、狭くて小さくしっかりしたゲームを作る、という方針の意味です。 そして、全くの背景やシーン、そして、宣伝にしか利用できなかった広い世界も、小さくもしっかりしたゲームシステムを構築でき、面白いゲームにできたあとは、やがて意味を持ち始めるでしょう。 私の考えや構想としては以上です。 全体的なゲームシステム、世界の構築ができれば、次は、小さくもしっかりした面白いゲームを考え、作っていきたいと思います。それを組み合わせることで、たった一人でも「しっかりした大規模、に見えるゲーム」を作ることができるのではないかと考えています。 すでにあるものより、ないものを。誰かがやったことより、やっていないことを。 それが、たった一人の開発者でもできること。そして、本質なのだと思います。 ## 戦闘シーンの作成 1キャラクターにつき、1スキル、1バースト、1ユニークというのは決まっていました。これは`yui system`の領域。 アイの属性はアイ属性なので、テーマカラーは黄色です。属性自体は`ai system`の領域ですが、現在、関連反応のシステムまでは実装していません。 今回はバーストの作成、ダメージ表記、enemy(敵)の撃破までを実装しました。これは昔も実装していたものなので、簡単、と思いきや、最初から構造自体を作り変えたので、大変でした。 ## 音楽システムの実装 これは`world system`の領域で、開発中は`PlayerStart`で各位置に瞬間移動して確認しています。これもアイでなければ設定上無理でした。 原作の設定は、ゲーム開発中も適用されます。アイを動かして空を飛んでいますが、あれはアイだからできているのであって、他のキャラクターにはできません。宇宙空間の移動とかもそうですね。 ここで、少しだけ原作の設定を紹介しておきます。 ### 原作の設定: アイはなぜ空を飛べるのか アイはものすごい質量を持ちます。空を飛んでいるというより、地球を持ち上げて、空を飛んでいるように見せている、という感じで飛行しています。 いやいや、それじゃあ、地球はアイに落ちるだけで、空どころか地面に落ちるだろう、と言われそうですが、地球というのは、宇宙では人間が想像を絶するほど高速に回転、移動しています。 そして、宇宙で物がぶつかるときというのは、特に質量の大きいもの同士がぶつかるときというのは、決して、直接的にドカーンと衝突するわけではないのです。 お互いに距離を取りながらぐるぐる回って、やがてぶつかる、そんなイメージ。 質量と質量の間があるわけですね。 アイが瞬間的に自身の質量の一部を現すと、間ができ、アイの体は一瞬地球から離れます。その後、対象の星の質量を計算しながら、それを持ち上げて動かすような感じで、移動しています。 ### 原作の設定: アイはなぜ宇宙空間でも平気なの それはアイの体の周りには極小の大気の膜があるためだとされています。超重力で圧縮された大気の膜があるため、宇宙空間、その他一切の外的影響をあまり受けません。 アイは常に、自分の星の中にいるのと同じ状態、といえばいいのでしょうか。そんな感じです。 ## データ構造の変更 次に、`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" } ] } ``` これをログインシステムに連動させました。 ## 惑星に雨や雪を降らせる これはなかなか苦労していたのですが、実装できました。 まず、有効にすると宇宙空間でも雨が降ってしまいます。止めると惑星内で雨が降りません。 これを解消するには、player locationと0原点のdistanceから条件をつけ、雲の下、雲の上と定義します。調整が必要。 そして、udsのweather、特に`Apply Weather Changes Above Cloud Layer`が重要で、`Apply Cloud`の値を調整します。 ## 実体ある太陽のatmosphere問題 まず、私が使っている実体ある太陽にはatmosphereがついています。 これはフレアなどを設定しています。 しかし、これを地球から見た場合、その大気圏を通すと、非常に見栄えが悪い変なカクカクした光が映り込みます。 この解消も非常に苦労しました。例えば、これを`BP_Sun`としましょうか。これは起動時にすべての値を設定します。ゲームプレイ中に値の調整をすることは考えられていません。当然と言えるでしょう。 しかし、私のシステムでは、太陽のatmosphereを調整する必要があります。非常に複雑な設定は、リセットでしか解消できないということになりました。そして、udsに入れている小アクタコンポーネントの太陽は、リセットも容易ではありません。 色々な処理を作り、先程作った地表からの現在地の割り出しを条件に、これをリセットする処理をねじ込みました。