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

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

ただいまの
回答率

88.04%

unity 最初の1回のみ遊び方を表示して、その窓を消した後にゲームがスタートするようにしたい。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 2,178
退会済みユーザー

退会済みユーザー

if文を使ってDescriptionWindow(遊び方説明画面)が初回の1PLAYのみ表示されて、それ以降は表示されずにそのままゲームが始まるようにしたいと思っています。

・DescriptionWindow

#pragma strict

var DescriptionWindow : GameObject;

private var prefix : String = "dw_";

function Awake(){
    var isCheck : String = PlayerPrefs.GetString(prefix + "isCheck","false");    // 
    if(isCheck != "false"){                                                        // 
        DescriptionWindow.SetActive(false);                                        // 
    }
}
 
function windowClose(){                                                            // 
    DescriptionWindow.SetActive(false);                                            // 
    PlayerPrefs.SetString(prefix + "isCheck","true");                            // 
}


・InterfaceControllerの一部

#pragma strict

import UnityEngine.UI;

// Attach GameObject.
var startCountDown : UI.Text;
var curtain : UI.Image;
var DescriptionWindow : GameObject;                // DescriptionWindowのアタッチ

// Attach AudioClip.
var seOnCountDown : AudioClip;
var seOnFinish : AudioClip;

private var totalDistance : float = 1210.0;        //units.
private var currentDistance : float = 0;
private var maxSpeed : float = 35;
private var currentSpeed : float = 0;            //scroll speed in unit per second.
private var updateDeltaTime : float = 0;
private var onEntry : boolean = false;
private var onEntryStep : int = 0;
private var onPlay : boolean = false;
private var onFinish : boolean = false;
private var buttonAB : boolean = false;
private var isDamage : boolean = false;

// Other Componant.
private var background : Background;
private var player : GameObject;

function Awake(){
    background = GameObject.Find("Background").transform.GetComponent(Background);
    player = Resources.Load("Player/Player");
    curtain.enabled = false;
}

function Start(){
    updateDeltaTime = 0.0;
    startCountDown.enabled = false;
    startCountDown.text = "3";
    player = Instantiate(player);
    onEntry = true;
}

function Update(){

    if (Input.GetKeyDown (KeyCode.A)) {
        onClickButtonA();
    }
    if (Input.GetKeyDown (KeyCode.S)) {
        onClickButtonB();
    }
    

    if(onEntry){
        updateDeltaTime += Time.deltaTime;                        // 
        if(updateDeltaTime > 1.0 && onEntryStep == 0){            // もし
            startCountDown.enabled = true;                        // 
            audio.PlayOneShot(seOnCountDown);                    // 
            startCountDown.text = "3";                            // 
            onEntryStep++;                                        // 
        }else if(updateDeltaTime > 2.0 && onEntryStep == 1){    // 
            startCountDown.text = "2";                            //     
            onEntryStep++;                                        // 
        }else if(updateDeltaTime > 3.0 && onEntryStep == 2){    //     
            startCountDown.text = "1";                            // 
            onEntryStep++;                                        // 
        }else if(updateDeltaTime > 4.0 && onEntryStep == 3){    // 
            startCountDown.text = "Go!";                        //     
            onEntryStep++;                                        // 
                                                        
            //start!
            GameObject.Find("Main Camera").GetComponent(AudioSource).Play();
            // audio.Play();
            onPlay = true;
            currentSpeed += 2.0;
            player.transform.GetComponent(Player).playStart();
            gameObject.transform.GetComponent(StopWatch).playStart();
            
        }else if(onEntryStep == 4){
            startCountDown.color.a -= 0.02f;
            if(startCountDown.color.a <= 0.0){
                startCountDown.enabled = false;
                onEntry = false;
            }
        }
    }

どこにどう書いていいのか分かりません。
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

javaScriptはあまり自信ないですが、コメントを付けるとしたらだいたいこんな感じです。

function Awake(){ 
    var isCheck : String = PlayerPrefs.GetString(prefix + "isCheck","false");  // isCheckの値を取得。無い場合(デフォルト)はfalse
    if(isCheck != "false"){  // 既にisCheckがtrueになっていたら
        DescriptionWindow.SetActive(false);  // DescriptionWindowを非活性にする(出さない)
    } 
} 
  
function windowClose(){  // DescriptionWindowを閉じる処理
    DescriptionWindow.SetActive(false);  // DescriptionWindowを閉じる
    PlayerPrefs.SetString(prefix + "isCheck","true");  // isCheckをtrueにしておく。こうする事でAwake()で出なくなる。
    // ★★★★★★
} 
つまり、最初はisCheckがfalseになっているからDescriptionWindowが画面に出るが、
一度windowClose()を読んで閉じれば、次回以降はisCheckがtrueになっているので出なくなります。


    if(onEntry){ 
        updateDeltaTime += Time.deltaTime;  // 経過時間を加算していく。(ストップウオッチみたいなもの)
        if(updateDeltaTime > 1.0 && onEntryStep == 0){  // もし1秒経過していてonEntryStepが0だったら
            startCountDown.enabled = true;  // startCountDownを活性化する
            audio.PlayOneShot(seOnCountDown);  // カウントダウンのseをスタートさせる(?)
            startCountDown.text = "3";  // カウントダウンの表示を「3」にする
            onEntryStep++;  // 次のステップへ進む(これでこのif分にはもう入らなくなる)
        }else if(updateDeltaTime > 2.0 && onEntryStep == 1){  // もし2秒経過していてonEntryStepが1だったら
            startCountDown.text = "2";  // カウントダウンの表示を「2」にする
            onEntryStep++;  // 次のステップへ進む
        }else if(updateDeltaTime > 3.0 && onEntryStep == 2){  // もし3秒経過していてonEntryStepが2だったら
            startCountDown.text = "1";  // カウントダウンの表示を「1」にする
            onEntryStep++;  // 次のステップへ進む
        }else if(updateDeltaTime > 4.0 && onEntryStep == 3){  // もし4秒経過していてonEntryStepが3だったら
            startCountDown.text = "Go!";  // カウントダウンの表示を「Go!」にする
            onEntryStep++;  // 次のステップへ進む
                                                         
            //start! 
            GameObject.Find("Main Camera").GetComponent(AudioSource).Play(); 
            // audio.Play(); 
            onPlay = true; 
            currentSpeed += 2.0; 
            player.transform.GetComponent(Player).playStart(); 
            gameObject.transform.GetComponent(StopWatch).playStart(); 
             
        }else if(onEntryStep == 4){ // ステップが4だったら
            startCountDown.color.a -= 0.02f; // カウントダウンの表示を透明にしていく
            if(startCountDown.color.a <= 0.0){ // 表示が消えたら(消えただけで活性化されてる)
                startCountDown.enabled = false; // カウントダウンの表示を非活性にする
                onEntry = false; // カウントダウンを終わりにする
            } 
        } 
    } 
この処理は完全にカウントダウンしてるだけですね。

で、質問の
>>if文を使ってDescriptionWindow(遊び方説明画面)が初回の1PLAYのみ表示されて、それ以降は表示されずにそのままゲームが始まるようにしたい
ですが、
今現在は DescriptionWindow をどうやって呼び出して、どうやって閉じていますか?
閉じる際に「とじるボタン」とかがあるなら、
それが押されたときにwindowClose()が呼ばれていれば可能な気がします。

もし出来ないようでしたら、windowClose()の★マークをつけたところに、
PlayerPrefs.Save(); これを追加してください。
function windowClose(){  // DescriptionWindowを閉じる処理
    DescriptionWindow.SetActive(false);  // DescriptionWindowを閉じる
    PlayerPrefs.SetString(prefix + "isCheck","true");  // isCheckをtrueにしておく。こうする事でAwake()で出なくなる。
    PlayerPrefs.Save();
} 
UnityのPlayerPrefsでデータをセーブする
※抜粋
Unityはアプリ終了時にデータを保存してくれますが、
アプリのクラッシュなどが発生した時は保存できないこともあるみたいなので、
大事なデータを保存するときは一緒に呼んでおいたほうが良さそうです。

なので、やってみる価値はありますね。

がんばってください。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/04/14 14:00

    すごく丁寧に回答してくださりありがとうございます!
    頑張ってやってみます!

    キャンセル

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

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

関連した質問

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