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

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

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

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

Unity

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

Q&A

解決済

2回答

1204閲覧

UnityのInspectorでScript取得はできますか?

junie

総合スコア8

C#

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

Unity

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

0グッド

0クリップ

投稿2019/08/22 15:52

前提・実現したいこと

初めまして。どうぞ宜しくお願いします。
現在ターン制バトル物を作っています。
事前に敵役のObjectに様々なパターンの攻撃スキル(Atk_skillを継承したもの)をAddComponentして
ex.
Atk_Skill_MAHOU
Atk_Skill_NIKAI_KOUGEKI など
実際の戦闘突入時に
システム側がその敵役のobjectにgetComponents<Atk_skill>()して敵ターン時にそのスキルの中から選んでそのscriptを実行するというやり方をしています。

発生している問題・エラーメッセージ

問題では無いのですが、コードが長い、その敵Objectのinspectorの見栄えが悪い為、
出来ればその敵Objectの中に一つだけスキル統括scriptみたいなものを入れて一括管理したいのですが
下記の通りにToukatuスクリプトだけを敵ObjectにaddComponentし、inspector上から
直接Atk_skillを継承したものを入れたいのですが入りません。

何かこのような手段でscriptを入れる手段はありますでしょうか?
今考えているのはその"子攻撃script"をそれぞれ空のobjectに張り、さらにそれを統括scriptに書いたgameObject[]に乗せる方法です。。。が、これも二度手間のような気がしています。

試したこと

c#

1--------------------------------------------- 2public abstruct class Atk_skill : mono 3{ 4 public virtual void Attack(){;} 5} 6--------------------------------------------- 7public class Atk_skill_MAHOU : Atk_skill 8{ 9 public override void Attack(){;} 10} 11 12統括スクリプト---------------------------------- 13public class Toukatu : mono 14{ 15 public Atk_skill[] mySkills; // <-Inspector上から入れたい! 16} 17 18

補足情報(FW/ツールのバージョンなど)

初めてのゲーム作成なので勝手がわかっておりません...。
ポケモンバトルのようなイメージなのですが、
"この敵は攻撃スキルID:1,5,8 を持っている"
みたいなやり方のほうが主流なのでしょうか?

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

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

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

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

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

sakura_hana

2019/08/23 02:07

効果があるか分かりませんが、親と子のクラスの名前の上に「[System.Serializable]」を付けてみてください。 参考→ https://teratail.com/questions/126506 根本論を言っちゃうと、"この敵は攻撃スキルID:1,5,8 を持っている"みたいなやり方の方がいいかもしれません。 敵が多数になる場合、最初から個別にオブジェクトを生成しておくというのがそもそも面倒な可能性があります。別途Excel的な一覧表やScriptableObjectでデータ管理し、必要な時に敵オブジェクトを作成する(IDに合わせたクラスをAddComponentなど)という方が楽ではないかなと思います。
junie

2019/08/23 23:26

ScriptableObjectを作成して、管理するようにしました!どうもありがとうございます
guest

回答2

0

ベストアンサー

Attackがどの程度統一性のある行為なのか?この点において大きく実装パターンは変わりますが・・・
ただ、今回やりたいことを試したことから推測した限りですと、Attackのなかでかなり色々なことが行われる可能性があるようですね。
この場合、ScriptableObjectと継承の組み合わせが良いでしょう。

C#

1using System; 2using UnityEngine; 3public class Skills : MonoBehaviour 4{ 5 public AttackSkill[] mySkills; // <-Inspector上から入れられる!!! 6} 7[Serializable] 8public abstract class AttackSkill : ScriptableObject 9{ 10 public abstract void Attack(); 11 12} 13[Serializable] 14public class MagicAttack : AttackSkill 15{ 16 public int requireMP; 17 public int damage; 18 public override void Attack() 19 { 20 //Attack!!!!! 21 } 22 23}

このようなパターンであれば異なるrequireMPを持つ複数のMagicAttack等も作ることができ、Inspector上からのセットも可能です。

投稿2019/08/23 14:56

Ram.Type-0

総合スコア424

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

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

SZ-Z0001

2019/08/23 20:28

これでは最初の攻撃に追加で与えられるダメージ間の関係が簡単なゲームになります。
junie

2019/08/23 23:28

ScriptableObjectを親にする方法は思いつきませんでした。inspector上をスッキリさせつつ開発出来そうです。ありがとうございます。
guest

0

初回時からの実装はあまりお勧めしませんがScriptableObjectは今回のケースにお勧めですよ。

今回のケースで例えますと

[Serializable] public class normal_attack:ScriptableObject{ public int val=0; }
[Serializable] public class second_attack:ScriptableObject{ public int val=0; }

のような形状で定義し。

モンスターには以下のようなクラスをつける事で攻撃を判定可能です。

public class monster:Monobehaviour{ public normal_attack att_normal; public second_attack att_second; public int Get_Attack(){ int damage=0; if(att_normal!=null){ damage+=att_normal.val; } if(att_second!=null){ damage+=att_second.val; } return damage; } }

注意点として、ScriptableObjectは途中で変更した場合、事前に定義した変数がリセットされてしまいますのでゲームシステムが決定し、格納する変数に変更の必要がない場合に有効です。

投稿2019/08/23 07:22

SZ-Z0001

総合スコア38

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

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

Ram.Type-0

2019/08/23 14:58

試したことに書いてあるコードから推測される目標とかけ離れたコードに見えますが・・・ あと、スキルの最大数を増やすたびにthird_attackなどのクラスを定義してif分岐を増やすつもりですか?
SZ-Z0001

2019/08/23 20:27

仮に属性攻撃等の弱点攻撃が有る場合、あなたのコードでは各Attack処理に別々に定義しなくてはいけない。 そういった意味でも1つのスクリプトで処理をした方が実際の開発では機能性が出てきましたのでこのような回答になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問