質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

3回答

3646閲覧

Unity RPGのレベル上げのコードを書きたいです。

kiriyama

総合スコア24

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2022/04/22 03:17

RPGのレベル上げのシステムを作りたいです。
つまり、
・経験値が一定数になったら、レベルが1上がる
ということです。

簡単だと思うのは、

C#

1public int exp; //経験値 2public int lv; //レベル 3 4if(exp > 0){ 5 lv = 1; 6}else if(exp > 10){ 7 lv = 2; 8}else if(exp > 20){ 9 lv = 3; 10}else if( 11//以下レベルが99になるまで続く

だと思うのですが、たとえばレベルが最大999のとき、999回も同じようなコードを書く必要があり、正直面倒です。

どうすればいいでしょうか。
コード丸投げになってしまいますが、せめて考え方だけでも教えていただけると幸いです。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2022/04/22 03:24

必要な経験値を計算で出せるようにすれば良いと思います。 グラフを頭に浮かべてみてください。二次関数にすればちょうどいいように感じませんか?
退会済みユーザー

退会済みユーザー

2022/04/22 03:37 編集

質問のコードの書き方はそれで良いのですか? exp > 20 の先どうなってるのか書いてないので分かりませんが、exp が 0 または負以外結果は同じになるような気がしますけど。
guest

回答3

0

DBもしくは配列に経験値テーブルを持っておけば良いかと思います。
現在の経験値+取得した数値 以下の数値をテーブルから取得し、最大値が上がった先のレベルです。

投稿2022/04/22 03:24

編集2022/04/22 03:26
m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

他の方が具体的なやり方を書いてらっしゃいますが、方針としてはレベルアップ経験値判定やステータスをソースコードに書かないことです
インターネット接続が前提であるならば、WebAPI等で自分で用意したサーバーからレベルアップに必要な経験値テーブルと書くレベルのステータスを取得する処理を作ります
※WebAPIは自分で作る必要があります
もしもoff-lineのゲームであるならば、別ファイルでデータを持たせて処理ではそれを読み込むようにします
んで、どちらの場合でも取得した経験値/ステータステーブルを元にレベルがいくつかとステータスを反映させる汎用的な処理を作ります

この方針ならば、職・種族などの要素が増えても変更するのはそれにかかわる処理だけで済みますし、レベル上限が上がっても要素に変化がない場合はデータのみの変更で済みます

で、具多的なやり方は他の方の回答を参考にするなりググってみて色々試して自分に合ったやり方にするなりすると良いかと思います

投稿2022/04/22 05:05

len_souko

総合スコア1348

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

レベルアップ用の経験値テーブルのデータを別に作るといい感じですね!
やり方は色々ありますが、Scriptable Objectっていう仕組みを使うと作りやすいです!
https://ekulabo.com/about-scriptable-object
https://gametukurikata.com/program/scriptableobjectitemdatabase

例えば超シンプルに作るならこんな感じですかね?

C#

1using System.Collections.Generic; 2using UnityEngine; 3 4[CreateAssetMenu(fileName = "PlayerExpTable", menuName = "PlayerExpTable")] 5public class PlayerExpTable : ScriptableObject 6{ 7 // レベルアップに必要な経験値クラス(PlayerExpTableData)を格納するリスト 8 public List<PlayerExpTableData> m_playerExpTableData = new List<PlayerExpTableData>(); 9 10 // レベルアップ関数 引数は現在のプレイヤーのレベルと所持経験値 11 public int SetPlayerLevel(int playerLevel, int playerExp) 12 { 13 // プレイヤーの所持経験値が次のレベルの経験値を超えていたら1レベルアップ 14 if (playerExp >= m_playerExpTableData[playerLevel].m_exp) 15 { 16 return playerLevel + 1; 17 } 18 // じゃない場合はレベルアップしない 19 return playerLevel; 20 } 21} 22 23//Inspector表示用アトリビュート 24[System.Serializable] 25// レベルアップに必要な経験値を格納するクラス 26public class PlayerExpTableData 27{ 28 public int m_level; 29 public int m_exp; 30}

イメージ説明

で!
あとはこのScriptable ObjectをPublicとかでPlayerに持たせて、経験値計算が終わったあとにSetPlayerLevelを呼ぶとかどうでしょう?

C#

1lv = PlayerExpTable.SetPlayerLevel(lv, exp);

考えどころとしては、この仕様だとはぐれメタルを狩っても連続レベルアップせず、絶対に1しかレベルが上がらないってところですね!
そうしたい場合は、適正レベルになるまで判定を繰り返す…とか、途中のレベルをスキップして一気にレベルアップしちゃう…とかそういう処理をいい感じに考えてみてください!

あ、これ仮にレベル999までテーブルを作りたい場合、項目は全部手打ちしてかないといけないです!w
なのでデカめのテーブルだとExcelで作ってそれをScriptable Objectに変換したりするんですけど、流石にそこまでだとちょっとここに書ききれない量になってしまうのですみません!
Assetとか記事とかあると思うので調べてみてください!

投稿2022/04/22 04:24

編集2022/04/22 04:54
UnchFullburst

総合スコア663

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kiriyama

2022/04/26 07:12

ありがとうございます。 助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問