1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

初心者がUnity2Dでゲーム作ってみた記録

Last updated at Posted at 2020-02-23

#目次
作ったもの
ざっくり設計・機能
学び
おわりに

#作ったもの
3_unity_MC_title.png

[まほうのクッキング | unityroom]
(https://unityroom.com/games/magic_cooking)
リンク先で遊べます。PC推奨、スマホなどでも一応動作はするようですがサポート外のためデザインが崩れます。
イラストなど諸々込で制作期間2週間、制作時間15時間ちょいくらい。完成したのは11月頃。
####ゲーム概要
子ども向け。遊びに来るお客さんのためにケーキを作ろう!というストーリー。ヒントからお客さんは誰か・使うべき食材は何か考え、調理パートで食材を選ぶ。選んだ食材によって完成するケーキが変化し、クリア分岐します。

#ざっくり設計・機能
magic_cooking.png
[スクリプト一覧 | Git]
(https://github.com/sky9-20/Magic_Cooking/tree/master/scripts)

〆切的にイラストが間に合わなそうで諦めたけどお客さんをランダムに設定したかったところ。
主に頑張ったのはケーキ土台とトッピングを数種用意し、選んだ食材によってケーキの完成図を変化させる部分。
3_unity_MC_select.png
3_unity_MC_cake2.png

「これでつくる」ボタンに変数を用意。食材を選ぶと、インスペクターで指定した値分「これでつくる」の変数を変化させるメソッドを呼ぶ仕様。

↓一部抜き出し

「これでつくる」ボタン側スクリプト
Judge
    public int which_cake = 0;
    public int whichi_decoration = 0;

   //食材側で呼び出される、判定値を変更
    public void Pc1()
    {
        which_cake += 1;
        Debug.Log("which_cake: " + which_cake);
    }

    public void Pw1()
    {
        whichi_decoration += 1;
        Debug.Log("whichi_decoration: " + whichi_decoration);
    }
   void OnMouseDown()
    {
        if(which_cake == 7)
        {
            cake_freshcream.SetActive(true);
        }
        else if(which_cake == 17)
        {
            cake_chocolate.SetActive(true);
        }
        else
        {
            cake_failed.SetActive(true);
        }

        if (whichi_decoration == 3 && (which_cake == 7 || which_cake == 17))
        {
            banana.SetActive(true);
            strawberry.SetActive(true);
            P.SetActive(true);
        }
        else if (whichi_decoration == 1 && (which_cake == 7 || which_cake == 17))
        {
            banana.SetActive(true);
            P.SetActive(true);
        }

        else if(whichi_decoration == 2 && (which_cake == 7 || which_cake == 17))
        {
            strawberry.SetActive(true);
            C.SetActive(true);
        }
        else
        {
            B.SetActive(true);
        }
    }
食材側スクリプト
Judge
   //足す値をインスペクター上で指定
    public int plus = 1;

    void OnMouseDown()
    {
        //ループ用の変数を定義
        int p = plus;

        //+値が0になるまでJudgeで足す
        while (p != 0)
        {
            judger.GetComponent<Judge>().Pc1();
            --p;
        }
        
        this.gameObject.SetActive(false);
    }

###ハマった問題
他オブジェクトのスクリプトから値を変化させる方法

共有する変数が記述されたクラスA
 public static int a = 0
利用側
 A.a = 0

上記のようにpublicかつstaticな変数であればクラス外からもアクセスでき、異なるシーン間でも共有することができる。またクラス外からも値を変更できます。ただしエラーのもとのためprivateにして、プロパティで操作するのが原則らしい。
今回はそもそも他オブジェクトのスクリプトから値を変化させないことで解決しました。

プロパティについては↓
プロパティ - C# プログラミング ガイド | Microsoft Docs
プロパティ?フィールド?メンバー?C#のクラス構造のおさらい

#学び

  • ハマったとき、どうしてもその方法に限る場合を除いて別手段を検討する
  • その方法に限る場合早めに人に聞いてみる
  • 後々まとめることを念頭にキャプチャなどを残しておくと未来の自分が喜ぶ。

##おまけ
制作前の自分用ざっくりメモ
IMG_3458.JPG

#おわりに
見ていただきありがとうございました!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?