Abyssstew 2024/06/18 04:36

制作進捗#03 研究共有:テーブル制御の採集システム

■ はじめに

いきなりPS:私は前の記事の冒頭に新しいデモ動画を追加しました。しばらくdemoをプレイすることができなかった友人たちも、デモ動画でゲーム内容を知ることができますよ~


最近、ゲーム内の採集システムを最適化しています。ここ数日迷っていましたが、最適化の結果はとても良く、採集システムの新しい処理方法を発見しました。ここで皆さんにシェアします。

演示。特に何もないように見えますが、実は重要なのは実現の仕方です。この採集システムはexcelテーブルによって制御されており、テーブル内のアイテムや確率を変更することで、ゲームに読み込まれることができますが、実現方法は複雑ではありませんので、必要な人にここで共有することで、役に立つと思います。

ここで必要なツールはDatabaseConverterMVです。これは無料で、steamで見つけることができます。その使い方は簡単に言えば:
1.プロジェクトのデータベースをexcelテーブルにエクスポートします。
2.excelテーブルを編集します。
3.編集したテーブルをプロジェクトファイルに導入します。
普通だと思います……か?データベースを一括編集することができ、時間を節約することができます。これが主な用途ですが、上限はそれではありません。ある日、私がテーブルに勝手に入力した情報がゲームプログラムに読み込まれることに気づき、新世界の扉を開けた、今日のテーブル制御採集システムの研究もあった。
PS:先日ゲームを翻訳したとき、すでにこのテクニックを使っていましたが、誰もが自分のゲームを翻訳する必要はないので、テクニックとして共有することはできませんでした。今日に至るまで採集テーブルを作成し、実行に成功しました……このツールの上限は予想以上に高く、複雑なデザインを完成させることができましたが、とにかく私はもっと早く知り合えばよかったと思う。
また、demoのイベントノートに「<Copy Event:4,1>」と表示されているのはyanfly先生のプラグイン:YEPEventCopier.js、メッセージに「 pum[0,0,0,0,Normal]」と表示されているのはやな先生のプラグイン:CommonPopupCore.jsPopupMessage.jsです。今回には、これらのプラグインは必須ではなく、補助的な役割を果たすだけです。具体的には、プラグインの説明を参照してください。


ツールの紹介が終わり、準備ができました。まず採集のプロセスの例を見てみましょう:
1.プレイヤーが採集ポイントを調査
2.採集ポイントは乱数を生成し、採集プロセッサを起動し、それから自分を一時的に隠す(実は「繰り返し開くことができる宝箱」)
3.採集プロセッサが起動され、乱数に基づいて素材プールから特定の物品IDを取得する
4.採集プロセッサがプレイヤーにそのアイテムを獲得させる
5.終了
問題ないように見えますが、実際に実現するには、プログラミングの基礎がなければ、巨大なデータ量に押しつぶされたり、柔軟性の限られた設計しか得られません。低データ量と高柔軟性を両立することはできません。

■ テーブルの作成

採集テーブルを作成することで、この問題を解決することができます。採集システムを構想する際には、採集ポイントのタイプ(木か石か)、所在地(初心者村か魔王城か)、産出素材(ゴミや希少素材)、産出確率(高いか低いか)これらは当たり前に考えられるです。
私たちはこれらの当たり前のものを利用して、このシステムを完成させなければなりません。
まず、採集ポイントのタイプ、位置、具体的な素材、確率を、データの論理で考えてみましょう:

・採集ポイントのタイプは、数字で表し、1は草、2は石、3は水産……と類推する。文字列で表現しないのは、このデータが後で計算に参加するからです。
・位置については、同種の採取ポイントから産出される素材によって、ゲームに1、2、3、4…などのエリアを区切る。(同じ草採集点でも素材が異なるのは、場所が異なるため)
・産出される具体的な素材。IDでこれらのアイテムを表すこともできますし、名前を使うこともできます。ここはデータが多いので、テーブルを見たり変更したりしやすいように、名前を使いました。
・産出確率。対応素材の横に書くといいです。採集ポイント内の確率は、計算を容易にするために100の合計を推奨します。(経験者は自分で構想できる)


そして私逹はこのようなデータテーブルを手に入れました。私逹の目標はこのテーブルをプロジェクトに導入し、見てすぐに得られるようにすることです。


しかし、現在のテーブルはdatabaseの構造は異なり、直接使用することはできません。このテーブルをdatabaseの構造に合わせる必要があります。

私はテーブルのフォーマットをこのように変更して、今回は本当にプロジェクトを導入することができました。

←完全なテーブルはこの通りです。

この完全なテーブル(ExportFolderフォルダ内)をプロジェクトにインポートし、ゲームを実行し、F8のコンソールに$dataItems[22].dropAと入力すると、結果は「草I」("草!")、同理$dataItems[22].dropAPの結果は「50」であった。

ここまで来ると、スクリプトをよく使う友人は、次はどうすればいいかわかってきます。

■ イベントの作成

《画像変数名対照表》
01 随机数       : 乱数
05 採取点所在地图ID : 採取ポイント所在の地図ID
06 採取点所在区域   : 採取ポイント所在のエリア
07 採取点类型     : 採取ポイントタイプ
08 採取点ID     : 採取ポイントID
11 获取的物品ID   : 取得したアイテムID
12 获取的物品名称   : 取得したアイテム名


目の前に採集ポイントがあり、触ってみると、それは……
1.0 ~ 99の乱数を生成し、自身の採集ポイントタイプ(1は草、2は石)と乱数をそれぞれ変数に格納し、採集プロセッサを起動しました。

2.採集プロセッサ起動後:自分がいる地図の地図IDを取得し、地図IDをエリア番号に変換する。(上表によると、新米草原Aの番号は21、新米草原Bの番号は26、魔王城の番号は31)

3.エリア番号と採集ポイントタイプを加算すると、得られた数値が特定の採集ポイントにインデックスされます。(例えば、採集プロセッサが得た番号は26であり、タッチされた採集ポイントはそのタイプの数値が2であることを返し、28を加算して得られ、28はdatabaseテーブル内のIDが28である行を表す)

ここまで、私たちは目の前の採集ポイントのすべての情報を把握しており、残りはどのようにしてプレイヤーに採集ポイントの中のアイテムを獲得させるかです。

【確率計算】
確率の計算方法は、皆さん自身の好みがあるかもしれませんが、ここでは参考にして1つを書きましょう。
先に採取ポイント内の素材ごとの確率を加算した結果を100とし、それに0 ~ 99の乱数pを得た。
仮にこの採集点が魔王城の石(ID:33)であるとすると、石III、石IV、石Vの3種類のアイテムが出現し、その確率はそれぞれ50%、30%、20%である。予想:
p>=0 && p<50 , 石III get
p>=50 && p<50+30, 石IV get
P>=50+30 && p<50+30+20, 石V get
スクリプト形式で書く:

このステップでは、取得するアイテムの名前だけが得られ、そのアイテムを直接取得するには、私たちこのアイテムのIDが必要です。まず変数Iにアイテムの名前を入れて、次のステップに使います。

【アイテムを取得】
アイテムリスト全体のアイテム名を巡回し、以前に取得したアイテム名と比較するためのループを作成します。


←プロジェクトのスクリプト表示。

■ 最後に

ここまですべて完了しても、今後はdatabaseテーブルを更新するだけで、採集ポイントの素材や確率を制御することができます。
採集点の更新、中大賞、多重採集などは、この仕組みに追加することができ、今回のテーマではないので、ここでは展開しない。以上です。

フォロワー以上限定無料

今度のサンプルエンジニアリングファイルです!(テーブル付き)

無料

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

月別アーカイブ

限定特典から探す

記事を検索