投稿記事

コーディングの記事 (86)

竹林ソフト 2023/06/30 20:00

NPC をコーディングして領地経営するゲーム開発(PV 案を考える)

PV 案を考えます。正直に言って、作った作品を宣伝した方がいいのは理解できるのですが、あまり興味がないのでこういう作業は苦痛です。
苦痛ですが、ストアでゲームを売るときに PV を要求されるので理詰めで方針を書き出して作っていきます。

PV の概要

どういう PV にしたいか列挙します。

・1分くらいの長さ。
 ・最初の 10 秒でゲームの内容を伝えたい。

・ゲーム内容を誤解がないように伝える。
 ・ゲームプレイの流れをなぞる。
 ・ステージが表示されるが、NPC は停止していて何も起きない。
 ・ゲーム内でドキュメントを見る。
 ・ゲーム内でコーディングする。
 ・リスタートして NPC が動き始める。

・各ステージ、各要素の様子を短時間だけ映しながら切り替える。
 ・NPC が建築しているのを映す。
 ・NPC が動いてワークしているのを映す。
 ・NPC が食事して就寝しているのを映す。
 ・NPC がダンジョン探索しているのを映す。
  ・直前に、装備を変更する様子を表示してもいいかも。
 ・敵の進軍を NPC が城塞で防衛しているのを映す。
 ・チャートを映す。(映したいが未実装)

動いている様子と実行しているコードを並べて表示するとよさそう。編集で並べなくても、character:say("text") を利用して、実行しているコードを発言させるのでもよさそうです。

PV 詳細

よく、PV の最初にゲームの最も面白い内容を映した方がいいというのは聞きます。ただ「コーディングした結果に基づいて動くのが楽しいのを1行で説明できるか?」と自問自答してみて答えられなかったので あきらめます。
代わりに「このゲームは書かれたコードに従って NPC が動くゲームだよ」というのが伝わればよいことにします。

  • ゲームの流れをなぞるあたり
    • ステージのタスクを確認して、エディタを開こう、という内容(5秒)
    • コードを追記して、ステージをリスタートしよう、という内容(5秒)
    • コードによって NPC が動作し始めるあたり(5秒)
    • move(), work(), eat(), sleep() などの動作とコード(3秒 x 4)
  • 各ステージの要素を切り替えながら映すあたり(各4秒 x 6)
    • 建築、武器防具を装備、ダンジョン探索、敵軍の侵攻と防衛
  • 最後にゲームタイトル(4秒)
    • 背景は、各ステージのプレイ動画をタイル状に並べたものにしたい。
      • あきらめてもいい。

くらいです。
合計すると、15 + 12 + 24 + 4 で 55 秒ですね。
動画には簡単な説明を英文テロップで表示します。日本語版と英語版の動画を2つ作るのは面倒なので、英語版だけにします。

プレイ動画の保存と編集

編集完了までやろうとすると私の労力が尽きるので、途中までやります。
Streamlabs でプレイ動画を保存して、Davinci Resolve で編集します。

↓Streamlabs でキャプチャしている様子

そして、いざ保存しようとして気付くのですが、英語用の動画を作るのに英語版の言語データの用意が途中だったり、敵軍の侵攻はステージが作り直し中だったり、記録してたら Lua スクリプトの警告が表示されたりと、いろいろやるべきことがあるのに気付かされました。

あと、動作している API を表示するときに必要になったので、NPC を待機させる character:wait(seconds) を追加することにします。

まとめと今後の予定

PV 動画の内容を決めて途中まで作業しました。プレイ動画の保存に必要な実装をしてから、またこの続きをやっていきます。

竹林ソフト 2023/06/23 20:00

NPC をコーディングして領地経営するゲーム開発(食事でのパラメータ上昇まわり)

ゲームのヘルプに書いた「領主のパラメータは住民全てのパラメータに影響を与えます。領主によい食事を食べさせてパラメータを底上げしましょう」というあたりを実装します。

実装したい要素

領主によい食事を提供すると、全ユニットのパラメータを底上げできるようにします。これは、よい食事は原料のコストが高くなるようにすることで、余剰資源を使う手段の1つとして提供します。
これは必須ではなく、やりこみ要素に近い立ち位置にすることを考えています。

実装を見据えた仕様としては

  • キャラクターのパラメータはそれぞれに内部的な経験値があり、ある値を超えるとパラメータ値が1増加する。
    - パラメータが増える毎に必要経験値も増える。

  • 食べ物には、このパラメータ毎の経験値を定義できる。

くらいでしょうか。
今作れる食べ物は、小麦粉から作れるパンだけなので、じゃがいもから作れるベイクドポテトを追加して、VIT(耐久) の経験値が入る食べ物に設定します。
そういえば、食べ物だけでなく、ワークしても経験値が入るようにしたいなとも思いました。後でまた実装します。

↓追加したベイクドポテト。画像はいつか差し替えたい。

経験値の処理を追加

VIT, STR, DEX, INT, LUC それぞれに経験値があり、それが必要経験値を超えるとパラメータが1増える実装にしました。
このゲームの初期パラメータは 100 なのですが、パラメータ増加の必要経験値を

(パラメータ + 1 - 100) ^ 3

にしました。
つまり、3乗なので 100 から 101 への必要経験値は 1、
102 へは 8、
103 へは 27 の経験値が必要です。

アイテムの修正

アイテムの定義に「満腹度を満たす量」と「各パラメータへの経験値の量」を加えました。

キャラクターが食事をしたときに、これらの値が使われるよう修正しました。よいです。

動作確認

とりあえず、食事をしたときにキャラクターのパラメータが変わるのが確認できました!

↓耐久のパラメータが 102 になっている

よいです!
これに加えて、領主のパラメータの2割を他ユニットに加算するコードも実装しました。

書き出してみると地味ですが、後回しにしてきたタスクが終わって大変よい感じです。

あと、実装にあまり関係ない気付きとして、アイテムを運ぶときに手に固定して振りながら運搬させているので、スープ系の食べ物画像だと違和感があるかもと思いました。

↓ 手に持っている食べ物の角度が大変なことになっている例

気にしないことにしようと思います。

まとめと今後の予定

食事でパラメータが増加する仕組みと、領主のパラメータが他ユニットに影響を与えるあたりを実装しました。大変よいです。
そして、まだまだ実装のタスクも残っているのですが、そろそろ「英訳」「PV 作成」に着手しようと思います。すっごい気がすすまないのですが、Steam さまが要求してくるので仕方がないです。がんばります。

竹林ソフト 2023/06/09 20:00

NPC をコーディングして領地経営するゲーム開発(luac を外部プロセスとして実行する)

私の体験版のリリースに向けて開発していきます。
こう、実際にリリースしようとすると「あぁ、こんなに後回しにしてたんだな」というのに気付きます。

外部プロセスの実行に失敗したのをどうにかする

これは、luac という lua スクリプトをコンパイルするコマンドを使って「この Lua スクリプトの何行目が構文エラーです」という仕組みを実装して動作していたつもりだったのですが、リリースビルドでは動作しない問題です。

で、調べたところ

Postpone due to IL2CPP currently doesn't support external process creation.
超訳: IL2CPP は外部プロセスの作成に対応してないっす。

という記事↓が見つかりました。
https://issuetracker.unity3d.com/issues/il2cpp-system-dot-diagnostics-dot-process-dot-start-fails-to-launch-application

今使っている Unity Editor まで対応してないかは確認してないですが、ここまでの状況は一致しています。

で、さっきの記事に「外部プロセス実行できるアセットあるよ」という書き込みがあったので、買って試してみました。
System.Diagnostics.Process for IL2CPP

試したところ、付属サンプルはコルーチンの中でプロセスを開始していました。
とりあえず動作したのですが、希望通りの動作ではないのでどうするか考え中。

まとめと今後の予定

実装が複雑なだけなら着手すれば開発は進むのですが、技術的な問題だと悩ましいです。
IL2CPP でなく Mono でビルドするとか、Update() で呼び出している処理をコルーチンにしてしまえば外部プロセスを待つこともできるのですが、どうするのかもう少し考えてからどうにかします。
どうするかは決まっていませんが、問題の理解が進んだのは大変よいです。がんばります。

竹林ソフト 2023/06/02 20:00

NPC をコーディングして領地経営するゲーム開発(In-Game エディタの修正)

In-Game エディタの修正

本当は VS Code を利用してほしいのですが、それがなくてもコードを編集できるように In-Game Text Editor アセットを購入してゲームに取り込んでいます。
ただ、日本語文字の表示はできるけど編集が適切に扱えなかったりするので修正する必要があります。

まず、In-Game エディタで使うフォントをプログラミング用フォント Myricaに変更しました。今まで使っていたフォントでは、半角文字と全角文字の横幅の比が 1:2 でなかったためです。

売り物のアセットなのでオリジナルコードの公開は控えますが、下記の判定と処理を Line.cs:1114 あたりに追加しました。これで、カーソル位置が適切になり、文字の削除なんかも適切に行えるようになりました。

var encodedBytes = Encoding.GetEncoding("Shift-JIS").GetByteCount(text.Substring(i, 1));
if (encodedBytes == 2) {
    // 半角文字1文字ぶんの幅を追加する。
}

↓この記事にあったシフト JIS に変換するとマルチバイト文字のバイト数が 2 byte になる、という仕組みを使っています。
https://www.itlab51.com/?p=1446

よいです。
ただ、実行時にエラーになったので、以下の記事に従って dll を追加しました。
https://zenn.dev/ruccho/articles/a2996516338c01

よいです。

ここまでで体験版までの最低限の実装は終わったことにします。
ただ、IME を有効にしても IME の変換途中の日本語文字列が表示されないという問題に気づきました。これについては後で調べてみて無理そうならあきらめます。

まとめと今後の予定

In-Game エディタの修正という重めの対応が終わったので大変よいです。
まだまだ体験版までのタスクがいくつか残っているので引き続き実装していきます。がんばります。

竹林ソフト 2023/05/26 20:00

NPC をコーディングして領地経営するゲーム開発(体験版までの開発の続き)

引き続き体験版までのタスクを片付けていきます。

やったこと

ドキュメントの記述

体験版までに作るべきドキュメントとして、Tutorial と Lua のドキュメントを書き上げてなかったのを仕上げました。

よいです。

建物にエフェクトを追加

↓キャラがワークしているときに建物ごとのエフェクトを表示できるようにしました。

よいです。
エフェクトを再生する仕組みは実装できたので、「こういうエフェクトありだな」というのが思いついたら、他の建物にもエフェクトを追加しようと思います。

アイテム表一覧のサイズを調整

アイコン画像の大きさで違和感を感じていたのを修正しました。

↓調整前

↓調整後

調整前よりましになったので、よいです。

まとめと今後の予定

ここまでで体験版までの作業の重いタスクは終わりました。後はここまでに作ったドキュメントの英訳が残っているのですが、それは機械翻訳でどうにかします。
次回かその次くらいからは製品版に向けての機能追加を再開したいです。がんばります。

月別アーカイブ

限定特典から探す

記事を検索