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

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

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

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

Unity

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

Q&A

解決済

2回答

593閲覧

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

kotakot

総合スコア36

C#

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

Unity

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

0グッド

0クリップ

投稿2019/01/27 07:38

編集2019/01/27 08:27

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

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

#コード h1

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class GameStateController : MonoBehaviour 6{ 7 public GameObject gameReady; 8 public RemainTimer timer; 9 public GameObject gameStart; 10 public GameObject gameOver; 11 public GameObject[] result; 12 public GameObject player; 13 public GameObject spawners; 14 15 abstract class BaseState 16 { 17 public GameStateController Controller { get; set; } 18 public enum StateAction 19 { 20 STATE_ACTION_WAIT, 21 STATE_ACTION_NEXT 22 } 23 public BaseState(GameStateController c) { Controller = c; } 24 public virtual void OnEnter() { } 25 public virtual StateAction OnUpdate() { return StateAction.STATE_ACTION_NEXT; } 26 public virtual void OnExit() { } 27  } 28 class ReadyState : BaseState 29 { 30 float timer; 31 public ReadyState(GameStateController c) : base(c) { } 32 public override void OnEnter() 33 { 34 Controller.gameReady.SetActive(true); 35 } 36 public override StateAction OnUpdate() 37 { 38 timer += Time.deltaTime; 39 if (timer > 5.0f) 40 { 41 return StateAction.STATE_ACTION_NEXT; 42 } 43 return StateAction.STATE_ACTION_WAIT; 44 } 45 public override void OnExit() 46 { 47 Controller.gameReady.SetActive(false); 48 } 49 } 50 class StartState : BaseState 51 { 52 etc 53 } 54 class PlayingState :BaseState 55 { 56 etc 57 } 58 } 59 class GameOverState : BaseState 60 { 61 etc 62 } 63 class ResultState : BaseState 64 { 65 etc }

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

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

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

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

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

y_waiwai

2019/01/27 08:04

うごかない、というのはなにがどういうふうに動かないんでしょうか。 エラーが出るならエラーメッセージをそのまま提示してください
y_waiwai

2019/01/27 08:04

うごかない、というのはなにがどういうふうに動かないんでしょうか。 エラーが出るならエラーメッセージをそのまま提示してください
kotakot

2019/01/27 08:17

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

2019/01/27 09:19 編集

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

2019/01/27 09:34

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

回答2

0

public virtual void OnExit() { }

class ReadyState : BaseState

ここですが、

public virtual void OnExit() { }
}

class ReadyState : BaseState

...

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

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

投稿2019/01/27 08:22

y_waiwai

総合スコア87747

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

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

kotakot

2019/01/27 08:26 編集

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

0

ベストアンサー

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 10:43

vo3

総合スコア321

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

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

kotakot

2019/01/27 13:46

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問