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

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

ただいまの
回答率

88.33%

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 329

junie

score 8

前提・実現したいこと

初めまして。どうぞ宜しくお願いします。
現在ターン制バトル物を作っています。
事前に敵役の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[]に乗せる方法です。。。が、これも二度手間のような気がしています。

試したこと

親---------------------------------------------
public abstruct class Atk_skill : mono
{
     public virtual void Attack(){;}
}
子---------------------------------------------
public class Atk_skill_MAHOU : Atk_skill 
{
     public override void Attack(){;}
}

統括スクリプト----------------------------------
public class Toukatu : mono 
{
     public Atk_skill[] mySkills;    // <-Inspector上から入れたい!
}

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • sakura_hana

    2019/08/23 11:07

    効果があるか分かりませんが、親と子のクラスの名前の上に「[System.Serializable]」を付けてみてください。
    参考→ https://teratail.com/questions/126506

    根本論を言っちゃうと、"この敵は攻撃スキルID:1,5,8 を持っている"みたいなやり方の方がいいかもしれません。
    敵が多数になる場合、最初から個別にオブジェクトを生成しておくというのがそもそも面倒な可能性があります。別途Excel的な一覧表やScriptableObjectでデータ管理し、必要な時に敵オブジェクトを作成する(IDに合わせたクラスをAddComponentなど)という方が楽ではないかなと思います。

    キャンセル

  • junie

    2019/08/24 08:26

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

    キャンセル

回答 2

checkベストアンサー

+1

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

using System;
using UnityEngine;
public class Skills : MonoBehaviour 
{
     public AttackSkill[] mySkills;    // <-Inspector上から入れられる!!!
}
[Serializable]
public abstract class AttackSkill : ScriptableObject
{
    public abstract void Attack();

}
[Serializable]
public class MagicAttack : AttackSkill
{
    public int requireMP;
    public int damage;
    public override void Attack()
    {
        //Attack!!!!!
    }

}

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/08/24 05:28

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

    キャンセル

  • 2019/08/24 08:28

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

    キャンセル

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 23:58

    試したことに書いてあるコードから推測される目標とかけ離れたコードに見えますが・・・

    あと、スキルの最大数を増やすたびにthird_attackなどのクラスを定義してif分岐を増やすつもりですか?

    キャンセル

  • 2019/08/24 05:27

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

    キャンセル

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

  • ただいまの回答率 88.33%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る