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

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

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

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

Q&A

解決済

1回答

362閲覧

親クラスで子クラスの数値を使って計算し,子クラスに格納する.

sushisuke6

総合スコア18

Unity

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

0グッド

1クリップ

投稿2019/06/06 17:56

UnityでRPGゲームを開発しています.

敵キャラクターのステータスを与える際に,例えば以下のようなパラメータがあるとします.
キャラクター名:ゴブリン
レベル:3 力:10 健康:10
このステータスに対して最大HPが(力+レベル*健康)で定義されます.

親クラスに敵キャラクラス,子クラスにゴブリンクラスを継承して,子クラスのメンバの数値(レベル,力,健康)を用いて親クラスで最大HPを計算して,子クラスに返すというような処理はできますか?

もしこの処理が可能であれば,子クラスに各種パラメータを設定すれば,パラメータから計算される最大HPなどにかかわる計算式を親クラスに格納することができるので効率的かと思います.
オブジェクト指向についてかなり苦戦しています.何卒よろしくお願い申し上げます。

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

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

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

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

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

guest

回答1

0

ベストアンサー

レベル・力・健康のパラメーターはゴブリン固有ではなく、敵キャラクターみんなが持っているものと考えていいでしょうか?
そうでしたら、単純にこれらパラメーターを敵クラス側に持たせればいいんじゃないかと思います。

敵クラスがレベル・力・健康プロパティを持っていて、それらから最大HPを算出する機能も持っていて...

C#

1using UnityEngine; 2 3public abstract class Enemy 4{ 5 private int level; 6 private int strength; 7 private int health; 8 private int hp; 9 10 protected Enemy(int level, int strength, int health) 11 { 12 this.Level = level; 13 this.Strength = strength; 14 this.Health = health; 15 this.Hp = this.MaximumHp; 16 } 17 18 public int Level 19 { 20 get => this.level; 21 protected set => this.level = Mathf.Clamp(value, 0, 99); 22 } 23 24 public int Strength 25 { 26 get => this.strength; 27 protected set => this.strength = Mathf.Clamp(value, 0, 99); 28 } 29 30 public int Health 31 { 32 get => this.health; 33 protected set => this.health = Mathf.Clamp(value, 0, 99); 34 } 35 36 public int Hp 37 { 38 get => this.hp; 39 protected set => this.hp = Mathf.Clamp(value, 0, this.MaximumHp); 40 } 41 42 public int MaximumHp => this.Strength + (this.Level * this.Health); 43}

ゴブリンは特定のレベル・力・健康の値を固定的に持っていると仮定すると、それをたとえばコンストラクタで与えてやれば...

C#

1using UnityEngine; 2 3public class Goblin : Enemy 4{ 5 public Goblin() : base(level: 4, 6 strength: 3, 7 health: 5) 8 { 9 } 10 11 public void AddHp(int value) 12 { 13 var prevHp = this.Hp; 14 this.Hp += value; 15 Debug.Log($"{prevHp} -> {this.Hp}"); 16 } 17 18 public void PrintHp() 19 { 20 Debug.Log($"{this.GetType().Name}{this.GetHashCode()}:{this.Hp}/{this.MaximumHp}"); 21 } 22}

ゴブリンはそれらから算出された最大HPを持つ敵キャラクターとして振る舞うと思います。

C#

1using UnityEngine; 2 3public class InheritanceTest : MonoBehaviour 4{ 5 private void Start() 6 { 7 var goblin = new Goblin(); 8 Debug.Log($"Level:{goblin.Level}, Strength:{goblin.Strength}, Health:{goblin.Health}, MaximumHp:{goblin.MaximumHp}"); 9 while (goblin.Hp > 0) 10 { 11 goblin.AddHp(-7); 12 goblin.PrintHp(); 13 } 14 } 15}

図

投稿2019/06/06 20:49

編集2019/06/09 21:02
Bongo

総合スコア10807

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

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

sushisuke6

2019/06/09 16:32

回答ありがとうございます.例えばなのですが,パラメータが増えた場合に(力,健康のほかに知識,運,魅力など)サブクラスのコンストラクタのbase()から増えた個数分だけの値を渡せばよいのでしょうが,どの値がどのパラメータに対応するからわかりづらいコードになってしまいます.これを防ぐための書き方はありますか?
sushisuke6

2019/06/10 19:53

名前つき変数という便利な方法があるのですね!知ることができて大変うれしいです.ありがとうございます.それとは別に,自分なりの方法として,健康や力といったパラメータをもつパラメータクラスをつくり,コンストラクタの引数にパラメータクラスをおくことで,パラメータを管理するようなことは可能なのでしょうか?
Bongo

2019/06/10 21:45

いいアイディアだと思います。その方式でも特にデメリットは思い当たらないですし、問題ないと思います。 むしろ、そうした方がパラメータだけをひとかたまりのデータとして扱うことができ、取り回ししやすく修正も容易になりそうですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問