Unityに関連する記事です

 以下の内容で実装していきます。

34.セーブ・ロード機能を追加する準備を行う



実装する概要


 ゲーム中の機能として、ゲームデータのセーブとロード機能を追加します。
いずれもボタンを用意し、タップすることで機能を実行します。

 セーブボタンを押すことで、現在再生中のシナリオデータの番号でセーブを行います。シナリオデータ中は1つの分岐につき1回だけセーブできるように制御します。
再生中のメッセージ単位ではなく、シナリオデータの番号単位でのセーブです。次のシナリオデータに移動すれば再度セーブが可能になります。

 ロードボタンを押すことでロード専用のポップアップが開き、セーブされているデータがボタンとして表示されます。
シナリオデータの分岐番号は表示されず、セーブデータの通し番号とセーブした時間が表示されます。


実装動画 

Title => DataLoad
https://gyazo.com/31713d0142b848a24dc98960b1d627ec


Title => SaveData なし
https://gyazo.com/05b590ff44da129ec754bcf85c6d3161


シナリオ1でセーブなし確認。その後セーブしてロード
https://gyazo.com/2af9ecbebe816c3ca299d643c50e8f4c


事前準備


 事前準備としまして、セーブ用のボタンとロード用のボタンをGameシーンに用意します。
またTitleシーンにもロード用のボタンを用意します。

 用意の仕方ですが、専用のオプションポップアップを作成してその中に各ボタンを配置してもよいですし、
Gameシーンに常駐して見えるように、既存のメッセージウインドウの空いている部分に配置してもよいです。
ゲームの仕様と世界観を損なわないデザインにしてください。


 今回は、Canvas内のMessageWindowゲームオブジェクトの子オブジェクトとして作成し、常時メッセージウインドウの上に表示するように配置しました。


Gameシーン 配置後の画像



Titleシーン 配置後の画像



配置参考


 Gameシーンでの配置参考を示します。MessageWindowゲームオブジェクトの子オブジェクトとして、btnSave ゲームオブジェクトと btnLoad ゲームオブジェクトを作成しています。
どちらも UI => Button で作成したゲームオブジェクトです。


Gameシーン ヒエラルキー画像画像



btnSave ゲームオブジェクト インスペクター画像



btnSave ゲームオブジェクト インスペクター画像



btnLoad ゲームオブジェクト インスペクター画像



btnLoad ゲームオブジェクト インスペクター画像



 各ボタンのデザインについて、ここでは初期設定の画像のまま利用していますが、これについては適宜な画像に差し替えて利用してください。

 また子オブジェクトであるTextゲームオブジェクトもそのまま利用していますが、フォントなどを他の部分と統一する場合には、これは削除して、作成済のTextPrefabを利用してください。
その上でフォントや文字の大きさ、文字装飾などは適宜変更してください。ここでは画像は割愛します。
 
 Text プロパティに入力されている文字列はそれぞれ、Save と Load です。ボタンの内容が分かる名称であれば他の名称でも構いません。


設計


 セーブ機能は、現在再生されているシナリオデータの番号を保存する機能です。シナリオデータの番号と保存を実行した時刻が PlayerPrefs クラスを利用してセーブされます。

 ロード機能はセーブしたデータが1つ以上ある場合に、そのデータ単位でのロードを行い、ロードしたシナリオデータの番号の最初のメッセージからゲームを再開できる機能です。

 次のような設計を行います。

<セーブ>
 ・セーブはGameシーンの間に、シナリオデータ1つ(分岐)につき1回実行できる
 ・ゲーム中でセーブボタンを押す
 ・セーブが実行されて、セーブボタンが一時的に押せなくなる
 ・次のシナリオデータの再生が始まると、再度セーブボタンが有効になる


<ロード>
 ・セーブはGameシーン、あるいはTitleシーンの間に実行できる
 ・ゲーム中でロードボタンを押す
 ・ロードが実行されて、ロード用ポップアップが画面前面に生成される
 ・ポップアップの中にはセーブデータ1つにつき1つの選択ボタンが生成される
 ・選択ボタンには通し番号とセーブしたデータの時間が表示される
 ・選択ボタンを1つ選択すると、そのデータがロードされて、自動的にポップアップが閉じ、そのシナリオデータの番号からゲームが再開される
 ・閉じるボタンを押した場合にはロード用ポップアップを閉じる


実装手順


 以下の手順で実装を行います。手順が多いため、2回に分けて実装手順を説明します。
ここでは【1】〜【4】までを対象とします。

 1.GameData スクリプトを修正し、セーブ・ロード機能にかかわる処理を追加する
 2.ロード用ポップアップである、DataLoadPopUp ゲームオブジェクトを作成する
 3.ロード用ボタンである、LoadDataSelectButton ゲームオブジェクトを作成する
 4.LoadDataSelectButton スクリプトを作成し、LoadDataSelectButton ゲームオブジェクトにアタッチして、プレファブにする

 5.DataLoadPopUp スクリプトを作成し、DataLoadPopUp ゲームオブジェクトにアタッチして、プレファブにする
 6.TextMessageViewew スクリプトを修正して、セーブ・ロード機能にかかわる処理を追加する
 7.GameDirector スクリプトを修正して、セーブ・ロード機能にかかわる処理を追加する
 8.Title スクリプトを修正して、セーブ・ロード機能にかかわる処理を追加する
 9.ゲームを実行して動作を確認する

 なお、メッセージウインドウ上ではなく、オプション機能をまとめたポップアップに自動再生ボタンを設置する場合には、
新しくポップアップ用のスクリプトを作成し、その中でTextMessageViewerスクリプトを取得し、自動再生処理用のメソッドを呼び出す処理を記述して対応してください。


新しく学習する内容


・ScrollView ゲームオブジェクト(ScrollRect コンポーネント、ScrollBar コンポーネント)について


1.GameDataスクリプトを修正し、セーブ・ロード機能にかかわる処理を追加する


 セーブ・ロード機能にかかわる処理を実装するために必要となる変数を3つ追加します。

 1つ目はシナリオデータの番号のセーブ・ロードに使用する string 型の CURRENT_BRANCH_NO 変数です。固定値を入力するため、変数を分かりやすく大文字にしています。
この文字列にシナリオ番号を付与して、セーブする際のIDにします。そしてこの変数を利用してセーブデータの確認をし、ロードを行います。

 2つ目はシナリオデータを保存した時間をセーブする際に使用する、 string 型の SAVE_TIME_NO 変数です。こちらも固定値を入力するため、変数を分かりやすく大文字にしています。
このデータは1つ目のデータに付随してセーブとロードを行うようにして、時間をセーブ、ロードします。

 3つ目はロードしたシナリオデータの番号を代入する int 型の LoadBranchNo 変数です。データをロードした場合には、この値が新しくシナリオデータの番号が代入されて
これを用いることでゲームをロードしたシナリオデータの最初のメッセージから再開するようにします。

 
 また、シナリオデータの番号のセーブ・ロード用にメソッドを2つ追加しています。


GameData.cs

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



GameDataゲームオブジェクトを確認する


 新しく追加した loadBranchNo 変数が 0 で表示されています。ここは 0 のままにしておきます。
セーブされたデータをロードした場合に、ここにシナリオデータの番号が代入されて、そのデータからゲームを再開出来るようにします。

 なおデバッグしやすいように public 修飾子を利用してインスペクターに表示していますので、ここに既読にしたいシナリオの番号を登録することでデバッグが可能です。

 またGetSaveDatasメソッド内にもDebug用の仮データを用意していますので、これの部分のコメントアウトを解除してもデバッグできます。


GameData ゲームオブジェクトのインスペクター画像



2.ロード用ポップアップである、DataLoadPopUp ゲームオブジェクトを作成する

設計


 ロードする際のデータを一覧で表示するためのポップアップを、DataLoadPopUp ゲームオブジェクトとして作成します。
ポップアップが開くと同時に、ロードするシナリオデータの番号と保存した時間が表示されたボタンを、このポップアップ内に生成するようにします。

 ポップアップを開くためには、Titleシーン、あるいはGameシーンに事前準備で用意した btnLoad ボタンを押すことで生成されるようにスクリプトより制御を行います。
ポップアップのボタン用の表示枠はScrollView コンポーネントを利用し、ロード用のボタンの数が増えても、自動的に枠の大きさを調整し、枠内をスライドしてボタンを表示できるよう設計します。

 完成した際のヒエラルキーの状態とSceneビューは、以下のような構造になります。


DataLoadPopUp ゲームオブジェクトの構造



DataLoadPopUp ゲームオブジェクト Sceneビュー



DataLoadPopUp ゲームオブジェクトを作成する


 Titleシーン、あるいはGameシーンのいずれかで作成します。最終的にプレファブにするため、どちらのシーンで作成しても問題ありません。



1.DataLoadPopUp ゲームオブジェクトを作成する

 Canvasの上で右クリックをしてメニューを開き、Create Empty を選択し、名前を DataLoadPopUp に変更します。
必ず Canvas 内の子オブジェクトとして生成されるように作成してください。

 DataLoadPopUp ゲームオブジェクトは、これから作成するUI部品のフォルダの役割と、スクリプトをアタッチしてポップアップ全体を操作するための役割を持ちます。

 DataLoadPopUp ゲームオブジェクトを選択してインスペクターを確認します。インスペクターの一番下にある Add Component ボタンを押して
CanvasGroup コンポーネントを追加してください。この機能を利用することによって、子オブジェクトをまとめて透明にしたり、表示したりすることが出来るようになります。


DataLoadPopUp ゲームオブジェクト インスペクター画像




2.DataLoadPopUp ゲームオブジェクトの子オブジェクトとして、BackGround ゲームオブジェクトを作成する

 DataLoadPopUp ゲームオブジェクトの上で右クリックをしてメニューを開き、UI => Panel を選択します。名前を BackGround に変更します。

 BackGround ゲームオブジェクトは、ポップアップの背景画像になります。今回は画像の設定は初期値のままで色を黒くして、透明度を調整しています。
適宜な形にして運用してください。画像を変更するには、Image コンポーネントの Source Image の部分を変更します。


BackGround ゲームオブジェクト インスペクター画像




3.DataLoadPopUp ゲームオブジェクトの子オブジェクトとして、ScrollView ゲームオブジェクトを作成する

 続いて、ロード用のボタン群を並べる枠用のゲームオブジェクトを作成します。
Unityの持つ機能を利用して、ロード用のボタンを等間隔に整列させ、もしもボタンの数が表示枠よりも増えてしまった場合には、自動的に枠内をスライドしてボタンを表示できるようにします。

 DataLoadPopUp ゲームオブジェクトの上で右クリックをしてメニューを開き、UI => ScrollView を選択します。名前は変更しなくても大丈夫です。

 ScrollView ゲームオブジェクトのインスペクターを確認します。ScrollRect コンポーネントがアタッチされていると思いますが、これが、枠内の大きさに合わせて
表示枠内をスクロールさせる機能になります。スクロールさせる方向は縦(垂直)、または横(水平)方向になります。ボタンの配置に合わせてどちらかに指定します。

 今回は垂直方向にロード用のボタンを並べる予定ですので、スクロールさせる方向も垂直方向にします。

 ScrollView ゲームオブジェクトを作成すると、それに付随するゲームオブジェクトが複数一緒に作成されます。これらを複合的に利用して、スクロールさせる処理を行っています。
このうち、水平方向にスクロールさせる処理は利用しなくなりましたので、ScrollBar Horizontal ゲームオブジェクトとその子オブジェクトを Delete してください。
(ScrollBar Vertial ゲームオブジェクトとその子オブジェクトのみ利用します)


 その後、画面の大きさなどを加味し、下記の画像を参考してScrollView ゲームオブジェクトの大きさを調整してください。この大きさがボタン群の表示される枠になります。


ScrollView ゲームオブジェクト インスペクター画像



ScrollView ゲームオブジェクト インスペクター画像




4.Content ゲームオブジェクトを修正する

 ScrollView ゲームオブジェクトと一緒に作成されるゲームオブジェクトのうち、子オブジェクトである、Viewport ゲームオブジェクトは変更ありません。
Viewport ゲームオブジェクトの子オブジェクトである、Content ゲームオブジェクトのみ、コンポーネントの追加を行います。


Viewport ゲームオブジェクト インスペクター画像



 Content ゲームオブジェクトは、実際にロード用ボタンを設置する場所になります。この Content ゲームオブジェクトの子オブジェクトとしてボタンを生成します。
生成の際、ボタンの大きさを統一し、かつ、自動的に整列して並ぶように、コンポーネントを1つ追加します。

 Content ゲームオブジェクトを選択してインスペクターを確認します。インスペクターの一番下にある Add Component ボタンを押して
GridLayoutGroup コンポーネントを追加してください。この機能を利用することによって、この Content ゲームオブジェクトの子オブジェクトの大きさと整列を行うことが出来ます。

 GridLayoutGroup コンポーネントの設定ですが、下記の画像のように設定をしてください。


 また、Conten ゲームオブジェクトの名前を LoadSelectButtonTran_Content に変更してください。ここにボタンを生成する、という目印になります。


LoadSelectButtonTran_Content ゲームオブジェクト インスペクター画像



 以上でロード用のボタンを生成し、操作する部分は完成です。



5.DataLoadPopUp ゲームオブジェクトの子オブジェクトとして、btnClose ゲームオブジェクトを作成する

 最後にポップアップを閉じるためのボタンを1つ作成します。ロード用ボタンを選択した場合にはそのシナリオからゲームを再開しますが
もしもロードするデータがない場合や、ロードを止めたい場合にはポップアップを閉じる必要があるためです。

 このボタンを押下することでポップアップを破棄できるように、スクリプトから制御を行います。


 DataLoadPopUp ゲームオブジェクトの上で右クリックをしてメニューを開き、UI => Button を選択します。名前を btnClose に変更します。

 btnClose ゲームオブジェクトの配置する位置や大きさは適宜調整してください。
ScrollView ゲームオブジェクトの枠外、かつ、BackGround ゲームオブジェクトの範囲内なら問題ありません。

 ここではボタンの色やボタンの画像を変更していませんが、それらも自由に設定してください。


btnClose ゲームオブジェクト インスペクター画像



btnClose ゲームオブジェクト インスペクター画像



 btnClose ゲームオブジェクトの子オブジェクトとして Text ゲームオブジェクトが一緒に作成されていますので、Text コンポーネント内の Text プロパティに
「Close」と入力してください。このボタンがどのような役割を持っているかを明示させます。他の単語でも、処理の内容が伝わるのであれば変更して頂いて構いません。


btnClose ゲームオブジェクトの子オブジェクトのTextコンポーネント インスペクター画像



btnClose ゲームオブジェクトの子オブジェクトのTextコンポーネント インスペクター画像



 以上でポップアップの作成作業は終了です。


完成画像 Sceneビュー画像



3.ロード用ボタンである、LoadDataSelectButton ゲームオブジェクトを作成する


 【2】で作成した DataLoadPopUp ゲームオブジェクトを利用して、LoadDataSelectButton ゲームオブジェクトを作成していきます。

 LoadDataSelectButton ゲームオブジェクト内の LoadSelectButtonTran_Content ゲームオブジェクトの上で右クリックをしてメニューを開き、
UI => Button を選択します。名前を LoadDataSelectButton に変更してください。


Sceneビュー画像(LoadSelectButtonTran_Content ゲームオブジェクトの子オブジェクトか確認)



 この LoadDataSelectButton ゲームオブジェクトに後程作成するスクリプトをアタッチし、シナリオデータの番号と保存時間を保持させます。
1つずつ異なるセーブデータの内容をその都度、スクリプトを利用することで動的に変更できるようにします。

 そのため、このゲームオブジェクトはプレーン(シナリオデータの番号などを持たない)状態として作成します。

 LoadDataSelectButton ゲームオブジェクトを選択してインスペクターを確認します。
インスペクターの一番下にある Add Component ボタンを押して、CanvasGroup コンポーネントを追加してください。

 なおこのゲームオブジェクトは、LoadSelectButtonTran_Content ゲームオブジェクトにアタッチされている GridLayoutGroup コンポーネントの影響化にあるため
自由に大きさを調整することはできません。ボタンの大きさを調整する場合には、LoadSelectButtonTran_Content ゲームオブジェクトにアタッチされている
GridLayoutGroup コンポーネントの値を変更して調整を行います。


LoadDataSelectButton ゲームオブジェクト ヒエラルキー画像



LoadDataSelectButton ゲームオブジェクト インスペクター画像



LoadDataSelectButton ゲームオブジェクト インスペクター画像



 LoadDataSelectButton ゲームオブジェクトの子オブジェクトとして Text ゲームオブジェクトが一緒に作成されていますので、Text コンポーネント内の Text プロパティに
仮のテキストとして「保存時間が表示されます」と入力してください。このボタンがどのような役割を持っているかを明示させます。
後程スクリプトからこの値が書き換えられて、保存時間がこの部分に代入されて表示されることになります。

 
LoadDataSelectButton ゲームオブジェクトの子オブジェクトのTextコンポーネント インスペクター画像



LoadDataSelectButton ゲームオブジェクトの子オブジェクトのTextコンポーネント インスペクター画像



Gameシーン画像




 もしも、ロードしたデータにシナリオのサムネイル画像を表示する場合には、さらに、Image ゲームオブジェクトを2つ作成して、親子関係にしてください。
親となるゲームオブジェクトは imgBackGround、子となるゲームオブジェクトは imgChara に名前を変更してください。


ヒエラルキー画像



 imgBackGround ゲームオブジェクトには、サムネイル画像としてシナリオの背景画像を表示するようにします。
ここには最初は何も画像は選択していない状態にしておいてください。シナリオデータの番号によって、動的にスクリプトから画像を差し替えるようにします。


imgBackGround ゲームオブジェクト インスペクター画像



 imgChara ゲームオブジェクトには、サムネイル画像として、シナリオの最初に登場するキャラを表示するようにします。
そのシナリオにキャラが登場しない場合には、この部分は透明にして、背景画像のみを表示するように制御します。
ここも最初は何も画像は選択していない状態にしておいてください。シナリオデータの番号によって、動的にスクリプトから画像を差し替えるようにします。


imgChara ゲームオブジェクト インスペクター画像



Sceneビュー画像



Gameビュー画像



シナリオデータを読み込んだ場合の画像



Resources フォルダ内に Charas フォルダを作成してキャラの画像を入れる


 ※ すでにフォルダがあり、その中にキャラのデータ画像がある場合には、ファイル名の変更だけ行ってください。

 LoadDataSelectButton スクリプトでは、キャラのデータ画像を差し替えるため、Unityの Resources フォルダのファイルを読み込む機能を利用しています。
 
 Resources フォルダ内に Charas フォルダを作成して、その中にキャラのデータ画像を入れておいてください。
また、ファイル名は統一し、最後の通し番号だけ変更するような命名規則で名前をつけなおしてください。


Resources/Charas/chara_x フォルダ画像



4.LoadDataSelectButton スクリプトを作成し、LoadDataSelectButton ゲームオブジェクトにアタッチして、プレファブにする

設計


 どのようなシナリオデータの場面でセーブデータがセーブされるかはユーザーの任意です。
そのため、ロード用のボタンもそれに対応し、セーブされたシナリオデータの番号と時間とを反映して作成しなければなりません。
事前にこれはシナリオデータ1用、という感じで用意が出来ないためです。

 ロード用ボタン専用のスクリプトを1つ作成し、このスクリプトを利用することで、ユーザーのセーブデータに応じて動的なボタンを生成することが可能になります。

 先ほど作成した LoadDataSelectButton ゲームオブジェクトでは、Text コンポーネントには仮の保存時間用のメッセージを記述していますが、これをスクリプトから制御を行い書き換えます。


LoadDataSelectButton スクリプトを作成する


 LoadDataSelectButton スクリプトを作成します。
ボタンを押した際の制御や、ボタンのTextに保存時間を表示させる制御を行うためのものです。


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

public class LoadDataSelectButton : MonoBehaviour
{
    // UI関連
    [SerializeField]
    private Button btnLoad;                 // ボタン制御用

    [SerializeField]
    private Text txtLoadDataInfo;           // Text制御用。セーブ番号と保存時間表示

    [SerializeField]
    private Image imgBackGround;      // Image制御用。サムネイルの背景設定用。サムネイル不使用の場合には宣言不要です。

    [SerializeField]
    private Image imgChara;                 // Image制御用。サムネイルのキャラ設定用。サムネイル不使用の場合には宣言不要です。

    public CanvasGroup canvasGroup;         // CanvasGroupの透明度の制御用

    public bool isClickable;                // 重複タップ防止制御用。true はタップ済

    private int branchNo;                   // セーブされている分岐番号

    private DataLoadPopUp dataLoadPopUp;    // DetaLoadPopUpへの参照


    /// <summary>
    /// ロードボタンの設定
    /// </summary>
    /// <param name="branchNo"></param>
    /// <param name="date"></param>
    /// <param name="dataLoadPopUp"></param>
    /// <param name="no"></param>
    public void SetUpLoadSelectButton(int branchNo, string date, DataLoadPopUp dataLoadPopUp, int no) {
        this.branchNo = branchNo;
        this.dataLoadPopUp = dataLoadPopUp;

        // ボタンに保存時間を表示
        txtLoadDataInfo.text = "セーブ番号 : " + no + "   保存時間 : " + date;

        // ボタンにメソッドを登録
        btnLoad.onClick.AddListener(OnClickLoadButton);

        // 現在のシナリオデータをシナリオの番号で検索して、scenerioData 変数へ代入
        SenarioMasterData.SenarioData scenarioData = GameData.instance.scenarioSO.senarioMasterData.senario.Find((x) => x.senarioNo == this.branchNo); 

        // サムネイルの背景設定
        imgBackGround.sprite = Resources.Load<Sprite>("BackGround/" + scenarioData.backgroundImageNo);

        // サムネイルのキャラ設定
        if (scenarioData.charaTypes.Length > 0) {
            // シナリオ番号の最初のキャラを表示
            imgChara.sprite = Resources.Load<Sprite>("Charas/chara_" + (int)scenarioData.charaTypes[0]);
        } else {
            // キャラがいない場合、透明にして背景だけにする
            imgChara.color = new Color(255, 255, 255, 0);
        }
    }

    /// <summary>
    /// ボタンを押下した際の処理
    /// </summary>
    private void OnClickLoadButton() {
        if (isClickable) {
            // 一度タップしたら処理しない
            return;
        }

        // 一度タップしたら押せなくする
        isClickable = true;

        // 他のロードボタンも押せなくする
        dataLoadPopUp.InactiveLoadSelectButtons();

        // 選択したボタンの分岐番号をGameDataに保存
        GameData.instance.loadBranchNo = branchNo;

        Debug.Log("データロード完了 分岐番号 : " + GameData.instance.loadBranchNo + "からゲーム再開");

        // ゲームシーンをロード
        dataLoadPopUp.LoadGame();
    }
}


LoadDataSelectButton スクリプトを LoadDataSelectButton ゲームオブジェクトにアタッチして設定する


 作成した LoadDataSelectButton スクリプトを、 LoadDataSelectButton ゲームオブジェクトにアタッチします。

 LoadDataSelectButton ゲームオブジェクトを選択し、インスペクターを確認してください。
LoadDataSelectButton スクリプトのアサイン情報が表示されますので、そちらの設定を行います。

 
 btnLoad 変数には、ロード用のButton コンポーネントを登録します。
LoadDataSelectButton ゲームオブジェクトをドラッグアンドドロップしてアサインします。


 txtLoadDataInfo 変数には、Text コンポーネントに保存時間を反映させるための変数です。
LoadDataSelectButton ゲームオブジェクトの子オブジェクトのTextゲームオブジェクトをドラッグアンドドロップしてアサインします。


 canvasGroup 変数には、LoadSelectButton ゲームオブジェクトのCanvasGroup コンポーネントを登録します。
LoadDataSelectButton ゲームオブジェクトをドラッグアンドドロップしてアサインします。


LoadDataSelectButton ゲームオブジェクト インスペクター画像



LoadDataSelectButton ゲームオブジェクト インスペクター画像



LoadDataSelectButton ゲームオブジェクトをプレファブにする


 スクリプトの設定も終了しましたので、LoadDataSelectButton ゲームオブジェクトをプレファブにします。
プレファブ後はヒエラルキーより削除しておいてください。


 このプレファブのLoadDataSelectButton ゲームオブジェクトを利用して、複数のロード用のボタンをまとめて生成するようにしていきます。
その際、セーブデータに応じて、シナリオデータの番号や保存時間を動的に1つずつ変更します。


 以上でこの手順は終了です。

コメントをかく


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

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

Menu



プログラムの基礎学習

コード練習

技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

3D脱出ゲーム(抜粋)

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

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

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

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

3Dトップビューアクション(白猫風)

VideoPlayer イベント連動の実装例

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

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

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

private



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

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