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

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

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

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

Q&A

解決済

3回答

3943閲覧

IFでの構文エラー

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

0グッド

0クリップ

投稿2016/11/22 04:16

お世話になっております。初心者です。
unity5.4
プラグイン 宴
前回の質問から https://teratail.com/questions/55563
一歩前進したのですが、構文エラーが出てしまいどこがおかしいのか指摘頂きたいです。
前回のAUTOを押した状態でメニューを押すと止まる。メニューを閉じると再開するというものは出来たのですが、AUTO押してない状態でもメニューを閉じたらAUTOが開始されてしまいました。なので、AUTOが起動した場合だけ機能するようIFを追加しました。

using System; using System.Collections; using UnityEngine; using UnityEngine.UI; using Utage; /// <summary> /// メインゲーム画面のサンプル /// 入力処理に起点になるため、スクリプトの実行順を通常よりも少しはやくすること /// http://docs-jp.unity3d.com/Documentation/Components/class-ScriptExecution.html /// </summary> [AddComponentMenu("Utage/TemplateUI/MainGame")] public class UtageUguiMainGame : UguiView { /// <summary>ADVエンジン</summary> public AdvEngine Engine { get { return this.engine ?? (this.engine = FindObjectOfType<AdvEngine>()); } } [SerializeField] AdvEngine engine; /// <summary>ADVエンジン</summary> public UguiLetterBoxCamera LetterBoxCamera { get { return this.letterBoxCamera ?? (this.letterBoxCamera = FindObjectOfType<UguiLetterBoxCamera>()); } } [SerializeField] UguiLetterBoxCamera letterBoxCamera; /// <summary>タイトル画面</summary> public UtageUguiTitle title; /// <summary>コンフィグ画面</summary> public UtageUguiConfig config; public GameObject menu; /// <summary>セーブロード画面</summary> public UtageUguiSaveLoad saveLoad; /// <summary>ギャラリー画面</summary> public UtageUguiGallery gallery; /// <summary>ボタン</summary> public GameObject buttons; /// <summary>スキップボタン</summary> public Toggle checkSkip; /// <summary>自動で読み進むボタン</summary> public Toggle checkAuto; //起動タイプ enum BootType { Default, Start, Load, SceneGallery, StartLabel, }; BootType bootType; //ロードするセーブデータ AdvSaveData loadData; bool isInit = false; /// <summary>起動するシナリオラベル</summary> string scenaioLabel; void Awake() { Engine.Page.OnEndText.AddListener((page) => CaptureScreenOnSavePoint(page)); } /// <summary> /// 画面を閉じる /// </summary> public override void Close() { base.Close(); Engine.UiManager.Close(); Engine.Config.IsSkip = false; } //起動データをクリア void ClearBootData() { bootType = BootType.Default; isInit = false; loadData = null; } /// <summary> /// ゲームをはじめから開始 /// </summary> public void OpenStartGame() { ClearBootData(); bootType = BootType.Start; Open(); } /// <summary> /// 指定ラベルからゲーム開始 /// </summary> public void OpenStartLabel(string label) { ClearBootData(); bootType = BootType.StartLabel; this.scenaioLabel = label; Open(); } /// <summary> /// セーブデータをロードしてゲーム再開 /// </summary> /// <param name="loadData">ロードするセーブデータ</param> public void OpenLoadGame(AdvSaveData loadData) { ClearBootData(); bootType = BootType.Load; this.loadData = loadData; Open(); } /// <summary> /// シーン回想としてシーンを開始 /// </summary> /// <param name="scenaioLabel">シーンラベル</param> public void OpenSceneGallery(string scenaioLabel) { ClearBootData(); bootType = BootType.SceneGallery; this.scenaioLabel = scenaioLabel; Open(); } /// <summary> /// オープンしたときに呼ばれる /// </summary> void OnOpen() { //スクショをクリア if (Engine.SaveManager.Type != AdvSaveManager.SaveType.SavePoint) { Engine.SaveManager.ClearCaptureTexture(); } StartCoroutine(CoWaitOpen()); } //起動待ちしてから開く IEnumerator CoWaitOpen() { while (Engine.IsWaitBootLoading) yield return 0; switch (bootType) { case BootType.Default: Engine.UiManager.Open(); break; case BootType.Start: Engine.StartGame(); break; case BootType.Load: Engine.OpenLoadGame(loadData); break; case BootType.SceneGallery: Engine.StartSceneGallery(scenaioLabel); break; case BootType.StartLabel: Engine.StartGame(scenaioLabel); break; } ClearBootData(); loadData = null; Engine.Config.IsSkip = false; isInit = true; } //更新中 void Update() { if (!isInit) return; //ローディングアイコンを表示 if (SystemUi.GetInstance()) { if (Engine.IsLoading) { SystemUi.GetInstance().StartIndicator(this); } else { SystemUi.GetInstance().StopIndicator(this); } } if (Engine.IsEndScenario) { Close(); if (Engine.IsSceneGallery) { //回想シーン終了したのでギャラリーに gallery.Open(); } else { //シナリオ終了したのでタイトルへ title.Open(this); } } } public void LateUpdate() { //メニューボタンの表示・表示を切り替え buttons.SetActive(Engine.UiManager.IsShowingMenuButton && Engine.UiManager.Status == AdvUiManager.UiStatus.Default); //スキップフラグを反映 if (checkSkip) { if (checkSkip.isOn != Engine.Config.IsSkip) { checkSkip.isOn = Engine.Config.IsSkip; } } //オートフラグを反映 if (checkAuto) { if (checkAuto.isOn != Engine.Config.IsAutoBrPage) { checkAuto.isOn = Engine.Config.IsAutoBrPage; } } } void CaptureScreenOnSavePoint( AdvPage page ) { if (Engine.SaveManager.Type == AdvSaveManager.SaveType.SavePoint) { if (page.IsSavePoint) { Debug.Log("Capture"); StartCoroutine(CoCaptureScreen()); } } } IEnumerator CoCaptureScreen() { yield return new WaitForEndOfFrame(); //セーブ用のスクショを撮る Engine.SaveManager.CaptureTexture = LetterBoxCamera.CaptureScreen(); } //スキップボタンが押された public void OnTapSkip( bool isOn ) { Engine.Config.IsSkip = isOn; } //自動読み進みボタンが押された public void OnTapAuto( bool isOn ) { Engine.Config.IsAutoBrPage = isOn; } public void OnTapAuto( bool isAuto ) { isAuto = true; } //コンフィグボタンが押された public void OnTapConfig() { Close(); config.Open(this); } //セーブボタンが押された public void OnTapSave() { if (Engine.IsSceneGallery) return; StartCoroutine(CoSave()); } IEnumerator CoSave() { if (Engine.SaveManager.Type != AdvSaveManager.SaveType.SavePoint) { yield return new WaitForEndOfFrame(); //セーブ用のスクショを撮る Engine.SaveManager.CaptureTexture = LetterBoxCamera.CaptureScreen(); } //セーブ画面開く Close(); saveLoad.OpenSave(this); } //ロードボタンが押された public void OnTapLoad() { if (Engine.IsSceneGallery) return; Close(); saveLoad.OpenLoad(this); } //クイックセーブボタンが押された public void OnTapQSave() { if (Engine.IsSceneGallery) return; Engine.Config.IsSkip = false; StartCoroutine(CoQSave()); } IEnumerator CoQSave() { if (Engine.SaveManager.Type != AdvSaveManager.SaveType.SavePoint) { yield return new WaitForEndOfFrame(); //セーブ用のスクショを撮る Engine.SaveManager.CaptureTexture = LetterBoxCamera.CaptureScreen(); } //クイックセーブ Engine.QuickSave(); //スクショをクリア if (Engine.SaveManager.Type != AdvSaveManager.SaveType.SavePoint) { Engine.SaveManager.ClearCaptureTexture(); } } //クイックロードボタンが押された public void OnTapQLoad() { if (Engine.IsSceneGallery) return; Engine.Config.IsSkip = false; Engine.QuickLoad(); } } //menuが押された public void OnTapmenu(){ if(isAuto = true){ /// オープンしたときに呼ばれる void OnEnable(){ Engine.Config.IsAutoBrPage = false; } /// 画面を閉じる void OnDisable(){ Engine.Config.IsAutoBrPage = true; } } } } コード

//自動読み進みボタンが押された に isAuto = true; というフラグを作り、最後の//menuが押された にIF文記述しました。

現在のエラー
//menuが押された public にparse errorが出ています。
void OnDisable(){ のvoidも緑色になっていません。

間違っているプログラムを教えていただきませんでしょうか
よろしくお願いします。

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

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

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

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

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

guest

回答3

0

//メニューが押された
の前でclassブロックを終了してますよね?だからです。
括弧'}'の対応くらいあわせましょう。

c#

1 //クイックロードボタンが押された 2 public void OnTapQLoad() 3 { 4 if (Engine.IsSceneGallery) return; 5 6 Engine.Config.IsSkip = false; 7 Engine.QuickLoad(); 8 } 9} 10 11//menuが押された 12 public void OnTapmenu(){ 13

構文エラーが出てしまいどこがおかしいのか指摘頂きたいです

この件に関してはコンパイラーが丁寧に「このあたりがこういう理由でおかしいよ」とエラーを出してくれてます。

# こういう応用的なものをいきなり作るのではなく
# もうちょっと基礎(Classの定義の仕方・使い方、メソッド・メンバーの定義の仕方・使い方)から
# 習得されたほうがいいように思います。

投稿2016/11/22 04:24

編集2016/11/22 04:35
Y.H.

総合スコア7914

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

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

退会済みユーザー

退会済みユーザー

2016/11/22 04:40

コメントありがとうございます。 }直しましたが、次はvoid OnEnable(){ が構文エラーになってしまいました、、
guest

0

ベストアンサー

メソッドの中にメソッドは記入できません。
OnEnable と OnDisable は OnTapmenu の外に出す必要があります。

投稿2016/11/22 04:25

sakura_hana

総合スコア11427

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

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

退会済みユーザー

退会済みユーザー

2016/11/22 04:43

回答ありがとうございます。なるほど、書けませんか…。IF文とOnTapmenuを別々に書くべきですね。
sakura_hana

2016/11/22 04:58

別々にという言い方に不安を感じますが、OnTapmenuの外に出した場合の正しい書き方は下記になります。 void OnEnable(){ if(isAuto) { Engine.Config.IsAutoBrPage = false; } } 但しOnEnable/OnDisableは特別なメソッドで、「このクラスが有効化/無効化された時に自動で呼び出される」メソッドです。 なのでこのままOnTapmenuの外に出すと、恐らくこのSceneに入った瞬間と別のシーンに移る瞬間だけ呼び出され、以後動作しなくなります。 要望に合わせるとしたら恐らくこうなります。 public void OnTapmenu(bool isAuto){ if(isAuto){ Engine.Config.IsAutoBrPage = isAuto; } } (OnEnable/OnDisableメソッドはどこにも記入しないでください) 「メニューを開く時」に「OnTapmenu(false)」を、 「メニューを閉じる時」に「OnTapmenu(true)」を呼べば希望通りの動きをすると思います。
退会済みユーザー

退会済みユーザー

2016/12/02 03:00

回答ありがとうございます。詳しく回答してもらったのですが、まだわからない部分がありまして……><。OnEnable/OnDisableを使わずに、メニューを開く閉じるを書かなければならないのがどうすればいいかわかりません。 メニューを表示、非表示で作っているので、IFにして表示しているときにOnTapmenu(false)を書こうと思ったのですが、それはどのような関数を使えばいいでしょうか。gameObject.SetActiveではIFで使えませんよね お時間ありましたらよろしくお願いします。
sakura_hana

2016/12/02 08:49

意味がよく分かりませんが、gameObjectのアクティブ状態(gameObject.SetActiveで切り替えた状態)を取得したいということなら、 if (gameObject.activeInHierarchy) { //gameObjectがアクティブならこの処理を実行 } で出来るかと思います。
退会済みユーザー

退会済みユーザー

2016/12/02 09:27

くみ取っていただき、ありがとうございます!理解しました!(_ _)
guest

0

手元で確認していないので推測になりますが…。

if文の条件式の中で代入しているのが気になりました。
OnTapmenu()のif文は、正しくは以下のように書くと思います。

// 文法エラー? // if (isAuto = true) { // こっちが正しい if (isAuto == true) {

文法的には上記で問題ないのですが、一般には単純に以下のように書かれることが多いです。

if (isAuto) {

また、メソッドの内部でメソッドが定義されているのが気になりました。
C#でこのように書けましたっけ?

投稿2016/11/22 04:34

carimatics

総合スコア740

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

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

退会済みユーザー

退会済みユーザー

2016/11/22 04:42

回答ありがとうございます。修正します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問