Unityに関連する記事です

 OfflineTimeManager クラスにてお使いごとの時間の経過をセーブしましたので、最後にロードを行って、お使いが完了するか判定を行う処理を実装します。

 お使いが完了している場合にはキャラを生成し、完了していない場合には、経過時間を差し引いた残りの時間をカウントダウンするようにします。
また、お使いを完了した状態でゲームを終了した場合には、ゲームを再開した場合、お使いを完了している状態でゲームを再開するようにします。


<実装動画 .押璽爐鮑導する。放置した時間経過後に、残り時間が残っている場合には、放置した時間を差し引いてお使いを再開する>
動画ファイルへのリンク


<実装動画◆.押璽爐鮑導する。お使いを再開したままゲームを実行していると、お使い時間が 0 になるとお使い完了の状態になる>
動画ファイルへのリンク


<実装動画 ゲームを再開する。お使いの残り時間から放置した時間を引いて、お使いの時間が残っていない場合には、お使いを完了する>
動画ファイルへのリンク


<実装動画ぁ.押璽爐鮑導する。お使いを完了した状態(お使いの残り時間が 0)でゲームを終了していた場合には、お使いを完了した状態にする>
動画ファイルへのリンク


手順16 −お使いの時間データをロードしてお使いの完了を判定する処理の実装−
26.OfflineTimeManager スクリプトを修正する



 新しい学習内容は、以下の通りです。

 ・タプル型の実装例



26.OfflineTimeManager スクリプトを修正する

1.設計


 実装動画が4つあることからもわかるように、セーブ処理よりもロード処理の方が実装しなければならない内容が多く、確認すべき処理、実装する処理が複雑です。
そのため、どんな状態のときに、どのようになっていればよいか、というイメージをしっかりと持ちながら処理を実装していくことが求められます。

 設計としては、次のようなロジックを考えて、これを組み込みます。

<1.ゲームを実行したときの処理>
 1,ゲームを実行したときに、お使いの時間データを確認し、そこにデータがある場合には、お使いを行っていた状態で前回ゲームを終了したことになるので、お使いのデータのロードを行う(未実装なので、今回実装を行う)
   お使いのデータのロードを実行するスクリプトと、実際にロードを行うスクリプトは異なるので、しっかりと把握する

    ・お使いの時間のデータを確認する処理は、GameManager スクリプトが OfflineTimeManager スクリプトのメソッドを呼び出して行う

    ・お使いのデータがセーブされている場合、OfflineTimeManager スクリプトが PlayerPrefsHelper クラスのメソッドを利用してロードする
     ロードをする際には JSON 形式を利用して復元し、ゲーム終了時点と同じ情報を持つクラスとして利用できる状態にする → 2の処理へ

<2.お使いのデータがセーブされている場合>
 2.OfflineTimeManager スクリプト内には、ゲームを開始した時間の情報があるので、この情報と、ロードしたお使いのデータにある、お使いの残り時間の情報を1つずつ順番に計算する(未実装なので、今回実装を行う)
   「前回ゲームを終了したときのお使いの残り時間 - ゲームを再開するまでにかかった(放置した)時間」を計算することにより、放置した分だけお使いの時間を減算する
   この結果

    ・お使いの残り時間が 0 以下になった場合、そのお使いは完了した状態として扱う → 4の処理へ
    
    ・お使いの残り時間が 0 以上である場合には、そのお使いは未了の状態として扱う → 3の処理へ

<3.ゲーム再開後にお使いが未了の場合>
 3.OfflineTimeManager スクリプトが、お使いの時間を管理している TapPointDetail スクリプトのメソッドに命令を出して、お使いの処理を再開する(お使いの処理自体は TapPointDetail スクリプトにあるので、お使いの未了/完了の条件分岐を実装する)
   そのままゲームを実行していればお使いの時間が経過する。残り時間が 0 になったら、お使いを完了してキャラを生成する → 4の処理へ

    ・もしも、まだ残っているお使いの時間がある状態でゲームを終了した場合には、その時間と、残りのお使いの時間を再度セーブする → 1の処理へ

<4.ゲーム再開後にお使いが完了の場合>
 4.OfflineTimeManager スクリプトが、お使いを完了した btnTapDetail ゲームオブジェクトの上にキャラを生成する。このキャラをタップしてはじめてお使い完了判定になる(キャラの生成処理自体は OfflineTimeManager スクリプトにあるので、お使いの未了/完了の条件分岐を実装する)

    ・もしも、キャラが生成された状態でタップせずにゲームを終了した場合には、再度、1と2の手順を踏んで、もう一度、4の処理へ戻り、タップされるまでキャラを生成する
     (この処理自体は1と2の処理を通過することで自動的に行われるので、この状態になったときに、処理が正常に動くかどうかだけを確認する)

 何回も読んで、イメージを作ってください。

 その上で、処理の追加が必要なスクリプト内に、自分でコメントを書いてみて、処理の実装に挑戦してみてください。


2.OfflineTimeManager スクリプトを修正する


 足りない処理を考えます。
どのような処理があれば「お使いのデータがセーブされている確認ができるのか」、「セーブされているデータがあったら、どのようにしてロードすればいいのか」を考えてみてください。


OfflineTimeManager.cs


 スクリプトを修正したらセーブします。


3.GameManager スクリプトを修正する


 前回の手順で TODO を記述してあった場所に処理を実装していきます。
また、設計の内容も合わせて確認して、処理をどこに実装するのか、分岐はどういったものが必要なのかを考えてみてください。


GameManager.cs

 <= クリックすると開きます


 スクリプトを修正したらセーブします。


4.<タプル型の実装例>


 タプル(tuple)型は C# の持つ機能の1つです。複数のオブジェクトのデータをひとまとめにして管理することができます。
また、戻り値として利用する場合には、複数のオブジェクトのデータを同じようにまとめて戻してくれることが出来ます。

 書式は複数ありますので、それぞれ紹介します。今回は△僚饉阿納汰しています。
 
<記述例 
  (int, bool) damage = (0, false);

 上記の例の場合、damage 変数には、2つの型の情報が含まれていることになります。
より丁寧に書く場合には、今回のように、通常の変数のように型に対して宣言も可能です。
出来るだけタプル内のオブジェクトの型にも変数の宣言をつけて利用することをおすすめします。

<記述例◆
  (int value, bool isWeakness) = (0, false);

<記述例>
  (int value, bool isWeakness) damage = (0, false);



 タプル型の情報を扱う場合、タプル内のオブジェクトに対して変数の宣言を行っているか、いないかによって、参照する場合の記述が変わります

 記述例,里茲Δ法▲織廛詁發之燭里澆靴宣言していない場合には、タプル内の情報は Item1、Item2 というように自動的に採番されます
その場合は、「タプルの変数名.タプル内のオブジェクトの宣言順のItemの番号」の書式で記述できます。

<記述例,両豺腓了仮販磧
  UpdateDurability(damage.Item1);  // int 型の引数を参照して渡しています

 変数の宣言を行っている場合には、通常の変数のように「タプルの変数名.タプル内のオブジェクトの変数名」の書式で記述できます。
そのため、タプルの変数名から、値の推測が可能です。

<記述例△両豺腓了仮販磧
  UpdateDurability(damage.value);  // int 型の引数を参照して渡しています

 Item1、Item2 でも処理は動きますが、プログラムは処理を見て、誰でもすぐに内容が理解できる設計が理想です。
なるべく変数名をつけてタプルの宣言をした方がいいというのは、このようにプログラムの可読性に関わるためです。
damage.Item1 よりも、damage.value の方が、変数名だけ見てもどのような値が代入されているか判断がつきやすいので、処理を読み解きやすいということです。



 今回の処理では、タプル型を戻り値を持つメソッドとしても活用しています。

<右辺で戻り値を持つメソッドの実行命令>
 // お使いの状態と残り時間を取得
  (bool isJobEnd, int remainingTime) = JudgeJobsEnd(jobTime);

<呼び出されて実行されるメソッドと戻り値の確認>
  /// <summary>
    /// 時間の差分より、お使いが終了しているか判定
    /// </summary>
    /// <param name="jobTimeData"></param>
    /// <returns></returns>
    private (bool, int) JudgeJobsEnd(OfflineTimeManager.JobTimeData jobTimeData) {

      // 処理


    // 経過時間がお使いにかかる時間よりも同じか多いなら
        if (remainingTime <= elaspedTime) {
            // お使い完了
            return (true, 0);      //  <=  タプル型の戻り値
        }
        // お使い未了。残り時間から経過時間を減算して残り時間にする
        return (false, remainingTime - elaspedTime);         //  <=  タプル型の戻り値
    }
 
 JudgeJobsEnd メソッドの戻り値の型は (bool, int) のタプル型です。
よってこの処理はタプル型 = タプル型になりますので、代入処理が成立しています。
タプル型同士であっても、タプル内の型が異なる場合には代入処理できませんので注意してください。
今回は、(bool, int) = (bool, int) であるため処理が成立しています。

 この処理が実行されると、JudgeJobsEnd メソッド内において処理が行われて、
その処理結果として、bool 型でお使いが完了している/していない(true / false)と、int 型で残っているお使いの時間、という2つの情報が damage 変数に代入されることになります。


参考サイト
MicroSoft C#リファレンス
タプル型
https://docs.microsoft.com/ja-jp/dotnet/csharp/lan...


5.ゲームを実行して動作を確認する


 ロードの処理には複数の確認を行うべきポイントがあります。
それらを順番にデバッグを行い、制御が正常に行われているかを確認してください。


<実装動画 .押璽爐鮑導する。放置した時間経過後に、残り時間が残っている場合には、放置した時間を差し引いてお使いを再開する>
動画ファイルへのリンク


<実装動画◆.押璽爐鮑導する。お使いを再開したままゲームを実行していると、お使い時間が 0 になるとお使い完了の状態になる>
動画ファイルへのリンク


<実装動画 ゲームを再開する。お使いの残り時間から放置した時間を引いて、お使いの時間が残っていない場合には、お使いを完了する>
動画ファイルへのリンク


<実装動画ぁ.押璽爐鮑導する。お使いを完了した状態(お使いの残り時間が 0)でゲームを終了していた場合には、お使いを完了した状態にする>
動画ファイルへのリンク



 以上でこの手順は終了です。
 
 次は 手順17 −お使いの結果の褒賞表示用のポップアップとスクリプトの作成と生成処理の実装− です。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu



技術/知識(実装例)

2Dおはじきゲーム(発展編)

2D強制横スクロールアクション(発展編)

3Dダイビングアクション(発展編)

2Dタップシューティング(拡張編)

レースゲーム(抜粋)

2D放置ゲーム(発展編)

3Dレールガンシューティング(応用編)

3D脱出ゲーム(抜粋)

2Dリアルタイムストラテジー

2Dトップビューアドベンチャー(宴アセット使用)

3Dタップアクション(NavMeshAgent 使用)

2Dトップビューアクション(カエルの為に〜、ボコスカウォーズ風)

VideoPlayer イベント連動の実装例

VideoPlayer リスト内からムービー再生の実装例(発展)

AR 画像付きオブジェクト生成の実装例

AR リスト内から生成の実装例(発展)

private



このサイト内の作品はユニティちゃんライセンス条項の元に提供されています。

管理人/副管理人のみ編集できます