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

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

ただいまの
回答率

87.59%

abstract抽象クラスが動かない。

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,426

score 36

unityVR アプリ開発入門という本を使って勉強しているのですが、その本でゲームの進行管理をabstructを使って抽象クラスを使って行っていたので、同じようにしてみたらSetActiveなどの操作全てが動きませんでした。エラーも全くでないです。
クラスを定義しているだけと思うので動かないのには納得がいきますが、どうすれば動くようになるのかが分からないです。
教えていただけると嬉しいです。

  • etcは他のクラスと同じようなものです。

コード h1

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameStateController : MonoBehaviour
{
    public GameObject gameReady;
    public RemainTimer timer;
    public GameObject gameStart;
    public GameObject gameOver;
    public GameObject[] result;
    public GameObject player;
    public GameObject spawners;

    abstract class BaseState
    {
        public GameStateController Controller { get; set; }
        public enum StateAction
        {
            STATE_ACTION_WAIT,
            STATE_ACTION_NEXT
        }
        public BaseState(GameStateController c) { Controller = c; }
        public virtual void OnEnter() { }
        public virtual StateAction OnUpdate() { return StateAction.STATE_ACTION_NEXT; }
        public virtual void OnExit() { }
  }
    class ReadyState : BaseState
    {
        float timer;
        public ReadyState(GameStateController c) : base(c) { }
        public override void OnEnter()
        {
            Controller.gameReady.SetActive(true);
        }
        public override StateAction OnUpdate()
        {
            timer += Time.deltaTime;
            if (timer > 5.0f)
            {
                return StateAction.STATE_ACTION_NEXT;
            }
            return StateAction.STATE_ACTION_WAIT;
        }
        public override void OnExit()
        {
            Controller.gameReady.SetActive(false);
        }
    }
    class StartState : BaseState
    {
       etc
            }
    class PlayingState :BaseState
    {
       etc
        }
    }
    class GameOverState : BaseState
    {
       etc
           }
    class ResultState : BaseState
    {
       etc    }
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • kotakot

    2019/01/27 17:17

    エラーは全く出ず、ReadyStateに書かれているSetActiveなどの操作全てが動きません

    キャンセル

  • vo3

    2019/01/27 18:10 編集

    どこでそのReadyStateを実体化してどんな感じで動かそうとしているのでしょう?

    キャンセル

  • kotakot

    2019/01/27 18:34

    よく分からないけど実体化されていないと思います。参考書によれば、GameStateControllerクラスがステートの状態を制御しているらしいですが、、、

    キャンセル

回答 2

+4

public virtual void OnExit() { }
class ReadyState : BaseState

ここですが、

public virtual void OnExit() { }
}

class ReadyState : BaseState
...

じゃないんでしょうか。
提示コードのままだと、ReadyState以下のクラスは は、BaseState の中に含まれるクラスとなります

#これでもエラーか警告か出る気がしますが

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/01/27 17:26 編集

    すみません。それはペーストの時に間違えてしてしまったものだと思います。プログラムを書いているほうではそのようになっています。訂正します。

    キャンセル

checkベストアンサー

+1

abstractクラスとその実装クラスの記述自体に関しては問題はないと思います。
動かないのはその処理が動作するように記述されていないからだけなわけです。

予想ですが、提示されているソースに対して、「このソースは参考書に書かれている内容そのままなのになぜ動かないのか?」といったところではないかと。
こういった本ではソース全文を乗せるにはスペースが足りないからという理由で、そのままをコピペしても動かない簡易例的に掲示されている事があります。
実際に動くものは、本にCD(DVD)でついている場合や、「ここからDLして」とURLがあったりで、別途サンプルプログラムがあると思います。

参考書の説明文前後や実装想定が一切わからないので、とりあえずテスト的にでも動かすようなプログラムとすると、こんな感じでしょうか。
以下のソースも予想があっている場合を想定して、各Stateクラスの定義や、ほかのステートへの遷移は省略しています。

using UnityEngine;

/*
  MonoBehaviourのStartイベントでStartステートに
  GameStateControllerに対して外部からSetReadyを実行するとReadyStateに
 */
public class GameStateController : MonoBehaviour
{
    public void SetStart()
    {
        m_currentState?.OnExit();
        m_currentState = new StartState(this);
        m_currentState.OnEnter();
    }
    public void SetReady()
    {
        m_currentState?.OnExit();
        m_currentState = new ReadyState(this);
        m_currentState.OnEnter();
    }

    BaseState m_currentState;

    void Start()
    {
        SetStart();
    }
    void Update()
    {
        m_currentState?.OnUpdate();
    }
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/01/27 22:46

    ありがとうございます!

    キャンセル

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

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

関連した質問

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