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

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

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

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

Q&A

3回答

472閲覧

プレイヤーが複数武器を持っているときの敵へのダメージ処理

tomakun

総合スコア4

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

0グッド

0クリップ

投稿2022/07/17 01:13

前提

現在、プレイヤーが武器を複数持っている場合の敵へのダメージ処理に困っています。
というのも処理自体は完成しているのですがもっといい書き方があるんじゃないかと思い質問するに至りました。

概要

Weponというスクリプトに武器のタイプとダメージを与えるインターフェースを持たせています。
次に、武器のコライダーに敵が当たるとダメージを与えるインターフェースを継承しているか検知しダメージを与える処理をしています。
その次が問題で、敵にダメージ計算の処理をさせているのですがこの方法だと敵や武器を増やすごとに多くの記述が必要になるので少ないものにしたいです。

該当のソースコード

public class Weapon : MonoBehaviour { //武器&スキルタイプ public enum Type { Firesword, IceSword, FireSkill}; //ダメージを与えられるインターフェース public interface IDamageable { void Damage(int Damage, List<Type> types); } }
//持っている武器スクリプト public class FireSword : MonoBehaviour { public int fireswordDamage; //敵に当たった時 private void OnTriggerEnter(Collider col) { //当たったオブジェクトがIDamageableを継承したオブジェクトなら if (col.GetComponent<IDamageable>() != null) { //炎属性の剣の場合 List<Type> types = new List<Type> { Type.Firesword }; col.GetComponent<IDamageable>().Damage(fireswordDamage, types); } } }
//敵へのダメージ処理 public void Damage(int Damage, List<Type> types) { for (int i = 0; i < types.Count; i++) { switch (types[i]) { case Type.Firesword: //炎の剣なら SkeletonHP = SkeletonMaxHP - Damage; SkeletonMaxHP = SkeletonHP; ViewDamage(Damage); break; case Type.IceSword: //氷の剣なら SkeletonHP = SkeletonMaxHP - (Damage * 2); SkeletonMaxHP = SkeletonHP; ViewDamage(Damage * 2); break; case Type.FireSkill: //炎スキルなら SkeletonHP = SkeletonMaxHP - Damage; SkeletonMaxHP = SkeletonHP; ViewDamage(Damage); break; } } }

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

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

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

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

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

guest

回答3

0

良いコード/悪いコードで学ぶ設計入門―保守しやすい 成長し続けるコードの書き方
https://www.amazon.co.jp/dp/B09Y1MWK9N/r

こちらの本の第6章の題材が、今回の質問のケースにかなり近い感じです。
複数の呪文があってswitchでダメージ計算の処理の切り替えをしているのを、interfaceを使ってswitchを無くして呪文追加してもコードが長くならないようにする方法的な。

投稿2022/07/21 02:13

編集2022/07/21 02:14
UnchFullburst

総合スコア663

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

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

0

アイテムなどの管理は基本的にデータベース(UnityならScriptableObjectでしょうか)を使うと思います。
※攻略サイトなどに載っている一覧表みたいなものがイメージしやすいかと。

それはそれとして提示されたソースコードは設計が妙な気がします。
ぱっとみクラスの役割分担がうまくいっていないように見えます。

とりあえず Damage 関数が各武器の処理を行う必要性があるのかから考えてみてはどうでしょうか?
※引数として武器のリストが渡ってくるところがよく分かりませんが、
ダメージを処理するにあたって必要な情報は、ダメージ値と属性だけではないかなと。
(その二つだけに絞ってしまえば switch文はいらなくなるかと)

投稿2022/07/20 11:29

Kerupim

総合スコア52

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

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

0

テンプレートパターンでフィールドとというかステージというかなんというかそういうものに処理フローの制御を持たせる。
属性とか武器の種類によるダメージ判定は基底クラスに持たせる。(ポケモンだとポケモンクラスドラクエだとモンスタークラスかキャラクタークラス)。スキル関係はスキルを優先度と処理を持たせたオブジェクトを配列にしキャラクターに持たせる。基底クラスに持たせた関数で優先度に応じてスキルの関数を処理とかこんなんですかね。
一度やりたいことを整理した方がいい気がします。まあそんなものは後からどんどん出てくるからよのゲームソフトにバグが多いんでしょうけど。
○○無双とか遊戯王とかポケモンのプログラムはどうなってんだろ…
物理無効の敵に物理無効貫通の物理武器で攻撃したけど物理貫通も無効の敵だったとか考えだすと禿上がりそう…
抽象的な回答ですみません。
とりあえずテンプレートパターン多様すれば何とかなりそうな気はします。

投稿2022/07/17 03:13

usekay

総合スコア395

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

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

tomakun

2022/07/17 10:46

ご回答ありがとうございます。イメージとしてはわかるのですが具体的にどう作ろうと悩んでいます。 参考にはしてみます。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問