マッチ3パズル後編


キャンディが3つ並んでいたら消去する(プレイ中)

今度は、ゲームプレイ中の判定である。

内容はCheckStartset関数とほぼ同じである。

 

publicな関数として、CheckMatching関数を作成する。

 

public void CheckMatching()

    {

        //下の行からヨコのつながりを確認

        for (int i = 0; i < height; i++)

        {

            //右から2つ目以降は確認不要

            for (int j = 0; j < width - 2; j++)

            {

                //同じタグのキャンディが3つ並んでいたら。X座標がj。

                if ((candyArray[j, i].tag == candyArray[j + 1, i].tag) && (candyArray[j, i].tag == candyArray[j + 2, i].tag))

                {

                    //CandyのisMatchingをtrueに

                    candyArray[j, i].GetComponent<CandyMove>().isMatching = true;

                    candyArray[j + 1, i].GetComponent<CandyMove>().isMatching = true;

                    candyArray[j + 2, i].GetComponent<CandyMove>().isMatching = true;

                }

            }

        }//

        //左の列からタテのつながりを確認

        for (int i = 0; i < width; i++)

        {

            //上から2つ目以降は確認不要。

            for (int j = 0; j < height - 2; j++)

            {

                //Y座標がj。

                if ((candyArray[i, j].tag == candyArray[i, j + 1].tag) && (candyArray[i, j].tag == candyArray[i, j + 2].tag))

                {

                    candyArray[i, j].GetComponent<CandyMove>().isMatching = true;

                    candyArray[i, j + 1].GetComponent<CandyMove>().isMatching = true;

                    candyArray[i, j + 2].GetComponent<CandyMove>().isMatching = true;

                }

            }

        }

 

        //isMatching=trueのものをListに入れる

        foreach (var item in candyArray)

        {

            if (item.GetComponent<CandyMove>().isMatching)

            {

//3つ以上そろったとき、キャンディを半透明にする。

                item.GetComponent<SpriteRenderer>().color = new Color(1, 1, 1, 0.5f);

                deleteList.Add(item);

            }

        }

 

        //List内にキャンディがある場合

        if (deleteList.Count > 0)

        {

 //キャンディを消去するとき、一瞬の間を持たせるためIvoke関数にする。

            Invoke("DeleteCandies",0.2f);

        }

                

    }

-------------------------

 

あわせてDeleteCandies関数を作成する。

 

void DeleteCandies()

    {

 

        //List内のキャンディを消去。かつ、その配列をnullに。

        foreach (var item in deleteList)

        {

            Destroy(item);

            candyArray[(int)item.transform.position.x, (int)item.transform.position.y] = null;

 

        }

        //Listを空っぽに。

        deleteList.Clear();

        //キャンディの落下を待って、空欄に新しいキャンディを入れる。

        Invoke("SpawnNewCandy", 1.2f);

    }

   

---------------------

キャンディを消去するときに、キャンディの入っていた配列をnullにしている。これにより、<CandyMove>スクリプトのFallCandy関数が働き、落下を始める。

 


新しいキャンディが上から降ってくる(プレイ中)

SpawnNewCandyを再利用する。

SpawnNewCandy関数に、else以下を追記。

 

//まだゲーム開始してないとき

        if (isStart == false)

        {

            CheckStartset();

        }

        else //isStart==trueのとき。

        {

            //新しい位置をmyPreviousPosに設定

            foreach (var item in candyArray)

            {

                int column = (int)item.transform.position.x;

                int row = (int)item.transform.position.y;

 

                item.GetComponent<CandyMove>().myPreviousPos = new Vector2(column,row);

            }

            //続けざまに3つそろっているかどうか判定。

            Invoke("CheckMatching",0.2f);

        }

--------------------

キャンディが落下し、新しいキャンディが追加されたときに、すべてのキャンディのmyPreviousPosを更新している。

 

<CandyMove>関数へ移動。

 

moveCandies関数内の上下左右の処理のあとに、以下を記述。

 

//0.5秒後にマッチしてるかチェック

        Invoke("DoCheckMatching", 0.5f);

----------------------

加えて、DoCheckMatching関数を作成。

 

void DoCheckMatching()

    {

        gameControllerCS.CheckMatching();

    }

    

------------------

0.5秒の間を持たせているのは、キャンディの移動を待っているためである。移動が終わって、Update関数内のSetCandyToArray関数が実行されるのを待っている。 

 

これでプレイ中の処理もほぼ完成である。

 

もう少し、スクリプトを記述していく。

 


キャンディを操作したが3つ揃わなかったときは元の位置に戻る。

たとえば赤いキャンディと緑のキャンディの位置を入れ替えてみたけれども、どちらもタテヨコ3つ揃わなかった、ということもある。そのときに、そのまま入れ替えることができても構わないが、元の位置に戻したほうが、ゲームが難しくなって面白い。

 

<CandyMove>スクリプトへ移動。

 

新しくBackToPreviousPos関数を作る。publicにする。

 

  //元の位置に戻る。

    public void BackToPreviousPos()

    {

        column = (int)myPreviousPos.x;

        row = (int)myPreviousPos.y;

        

    }

-----------

myPreviousPosの位置に戻るようにしている。

 

<GameController>スクリプトへ。

 

CheckMatching関数に、Listにキャンディがない場合を追記。

 

//List内にキャンディがある場合

        if (deleteList.Count > 0)

        {

            Invoke("DeleteCandies",0.2f);

        }

        else//Listにキャンディがない場合。

        {

            //いま位置交換したキャンディを元の位置に。

            foreach (var item in candyArray)

            {

                item.GetComponent<CandyMove>().BackToPreviousPos();

            }            

        }

------------------------

これで3つ揃わなかったときは、キャンディが元の位置に戻るようになる。

 


同時に複数のキャンディを操作できないようにする。

現状のスクリプトだと、キャンディが横に移動しているときや、落下中などにキャンディを操作できてしまう。

そこで、キャンディが動いている間は、キャンディを操作できないようにする。

<CandyMove>スクリプトへ移動。

冒頭に以下を追記。publicで作る。

 

 //移動中はキャンディを操作できないように

    public bool isMoving;

 

-------------------

OnMouseUp関数の冒頭に追記。

 

 private void OnMouseUp()

    {

        

        if (isMoving)

        {

            return;

        }

 

----------------------

 

一度、<GameController>スクリプトへ移動。

新しく、publicなStopCandies関数を作成。

 

//キャンディを操作できないようにする。

    public void StopCandies()

    {

        foreach (var item in candyArray)

        {

            item.GetComponent<CandyMove>().isMoving = true;

        }

    }

-----------------------------

あわせて、CanMoveCandies関数も作成。

 

void CanMoveCandies()

    {

        foreach (var item in candyArray)

        {

            item.GetComponent<CandyMove>().isMoving = false;

        }

    }

---------------------------------

CheckMatching関数に、再びキャンディを操作できるように、以下の通り記述する。

 

else//Listにキャンディがない場合。

        {

            //いま位置交換したキャンディを元の位置に。

            foreach (var item in candyArray)

            {

                item.GetComponent<CandyMove>().BackToPreviousPos();

            }

            //再びキャンディを操作できるようにする。

            Invoke("CanMoveCandies", 0.4f);            

        }

---------------------------

いちいちInvokeを使っているのは、キャンディの移動時間を待っているためである。

 

<CandyMove>スクリプトへ戻る。

moveCandies関数の冒頭に追記。

 

 void moveCandies()

    {

        //すべてのキャンディを操作できないようにする

        gameControllerCS.StopCandies();

--------------------------

これで、キャンディが動き出したときには操作不能になり、3つ揃ってキャンディが消え、落下し、新しく追加されたりした後に、再びキャンディを操作できるようになった。

 


点数を計算する。

マッチ3パズルの基本的な形は完成した。ここからはよりゲームらしさを増す仕組みを作っていく。

 

点数計算方法はいろいろ考えられるだろうが、ここでは単純に消したキャンディの数に10を乗じた数を得点とする。

 

Unityへ戻る。

 

Canvasオブジェクトを作成する。

 

<Hierarchy>にて、<UI>--<Canvas>を選択。

<Inspector>にて以下のように設定。

 

<Render Mode>--> Screen Space - Camera

<Render Camere>--> <Main Camera>オブジェクトをアタッチ

<Plane Distance>--> 5

<UI Scale Mode>--> Scale With Screen Size

<Reference Resolution>--> X:720, Y:1280

<Screen Match Mode>--> Expand

 

Textオブジェクトを作成する。

赤文字:2023年10月18日追記。TextMeshProについて。

スコアを画面左上に表示させよう。

 

 

<Hierarchy>--<Canvas>にて右クリック、<UI>--<Text>を選択。名前を<ScoreText>とする。

<UI>--<Text-TextMeshPro>

従来のTextを使いたい場合は、<UI>--<Legacy>--<Text>です。

 

位置を、PosX:-260、PosY:570とする。(Anchorがmiddle,centerのとき)

<Text>--<Paragraph>--<Horizontal Overflow><Vertical Overflow>をOverflowにする。

フォントや文字サイズなどはお好みで設定。

(TMPの場合は、お好みで位置やサイズを決めてください。)

 

スクリプトを書く。

<GameController>スクリプトへ移動。

 

冒頭に以下を追記。

 

using UnityEngine.UI; //Textの場合。

 using TMPro; //TMPの場合はこちら。

 

 

 public Text ScoreText; //Textの場合。

 public TMP_Text ScoreText; //TMPの場合。

    private int score;

 

----------------------

Start関数に追記。

 

void Start()

    {

        score = 0;

        ScoreText.text = "SCORE: " + score.ToString();

        CreateCandies();

    }

-----------------------

キャンディを消すときに、その数を数える。

DeleteCandies関数に追記。

 

//List内のキャンディを消去。かつ、その配列をnullに。

        foreach (var item in deleteList)

        {     

            Destroy(item);

            candyArray[(int)item.transform.position.x, (int)item.transform.position.y] = null;

            //スコアをキャンディ1つあたり10点加算

            score += 10;

        }

    //score表示

        ScoreText.text = "SCORE: " + score.ToString();

-------------------------

Unityへ戻る

<Hierarchy>--<GameController>を選択、<Inspector>--<GameController(Script)>--<Score Text>に、<Hierarchy>--<Canvas>--<ScoreText>オブジェクトをアタッチ。

 


NewGameボタンを作る。

ゲームのやり直しができるように、NewGameボタンを作成する。

<Hierarchy>--<Canvas>にて右クリック、<UI>--<Button>を選択。

名前を<NewGameBtn>とする。

 

<Inspector>にて、

<Rect Transform>--> PosX:260、PosY:570

Width:100、Height:100

に設定。

 

<NewGameBtn>の子オブジェクトである<Text>を選択し、<Inspector>にて、<Text>を"New(改行)Game"とし、文字サイズなどを調整する。

 

 

スクリプトを書く。

<GameController>スクリプトにて、以下を追記。

 

using UnityEngine.SceneManagement;

 

public void NewGameBtn()

    {

        SceneManager.LoadScene("Game");

    }

--------------------

Unityに戻る。

 

スクリプトをボタンオブジェクトにアタッチ。

<Hierarchy>--<Canvas>--<NewGameBtn>を選択し、<Inspector>--<Button>--<On Click()>の+マークをクリック。

<GameController>オブジェクトをアタッチして、NewGameBtn関数を関連付ける。

 

 

<Unity>--<File>--<Build Settings>を開く。

<Add Open Scenes>をクリック。

 


キャンディを消すごとに加算される得点を表示する

トータルスコアを表示する<ScoreText>は作成したが、キャンディを消すごとに何点入るのか表示するアニメーションを作成する。

 

ScoringMessageオブジェクトを作成する。

 

<Hierarchy>--<Create Empty>を作成、名前を<ScoringMessage>とする。

<Transform>--<Position>--> X:2 Y:6 Z:0

<Inspector>--<Add Component>--<Mesh>--<Text Mesh>を選択。

 

以下の画像を参考に<Text Mesh>を設定する。

 

スクリプトを書く。

 

<Project>--<Scripts>にて右クリック、<Create>--<C# Script>を選択。名前を<ScoringMsg>とする。

 

<ScoringMsg>スクリプトを、<ScoringMessage>オブジェクトにアタッチ。

<ScoringMsg>をダブルクリックして、Visual Studioへ。

 

 

このスクリプトでやりたいことは、

表示されたら上に向かって移動し、すぐに消える、ということである。

 

    void Start()

    {

        Destroy(gameObject, 0.8f);

    }

 

    void Update()

    {

        transform.Translate(Vector2.up *2* Time.deltaTime);

    }

 

---------------------------

1秒当たり2Unitの速度で上に移動するようにし、オブジェクトがゲームに登場してから0.8秒後に削除されるようにした。

 

保存してUnityへ。

 

プレハブにする。

 

<Hierarchy>--<ScoringMessage>を、<Project>--<Prefabs>にドラッグアンドドロップしてプレハブ化する。

<Hierarchy>ウィンドウにあるものは削除する。

 

 

<GameController>スクリプトへ移動。

 

冒頭に、以下を追記。あとでUnityで<ScoringMessage>オブジェクトをアタッチする。

 

public GameObject ScoringMessage;

--------------------

DeleteCandies関数内に追記する。

 

void DeleteCandies()

    {

        //List内のキャンディを消去。かつ、その配列をnullに。

        foreach (var item in deleteList)

        {

(中略)

        }

        //加算される得点を表示

        var scoringPopUp = Instantiate(ScoringMessage);

        scoringPopUp.GetComponent<TextMesh>().text = "+" + deleteList.Count * 10;

----------------------

deleteListにあるキャンディの数に10を乗じた値を表示させている。(「+30」などのように)

<ScoringMsg>スクリプトにおいて、自身を0.8秒後に削除するよう記述したので、ここではDestroy関数を使う必要がない。

 

Unityへ戻る。

<GameController(Script)>--<Scoring Message>に、<Prefabs>--<Scoring Message>をアタッチする。

 

テストプレイ。

 

うまく動くだろうか?

 

 

タイトルを入れたり、文字色や文字サイズを調整して、完成。

 


実機ビルド(for Android)

スマートフォン端末(Android)の「開発者向けオプション」と「USBデバッグの有効化」を設定する。

以下のサイトを参照。

https://developer.android.com/studio/debug/dev-options?hl=ja

 

スマートフォンとPCを、USBケーブルでつなぐ。(おそらく充電器のコードがUSBケーブル)

 

<Unity>--<File>--<Build Settings>--<Player Settings>をクリック。

 

<CompanyName><ProductName>を適当に決め、下の画像の<Default Orientation>を<Portrait>にする。これでスマートフォンを傾けてもゲーム画面が回転しない。

 

設定したら、右上の×ボタンで<Project Settings>を閉じる。

 

スマートフォンとPCがケーブルで接続されていることを確認し、<Build And Run>をクリック。

 

ファイル名を求められるので、「TestSample」などとしておく。

おそらく3分くらいでビルド処理が終了する。

終わったら、右上Xボタンで<Build Settings>を閉じる。

Unityに、ビルドが正常に終了したことを示すメッセージが出ている。

 

USBケーブルを抜いて、スマートフォンでテストプレイしてみる。

 

これで、あなたオリジナルのゲームの完成です!

 

より面白くするために、

・BGMをつける。

・連鎖の数によって得点を変える。

・キャンディが消えるときのグラフィックを用意する。

などなど、いろいろ試してみましょう。

 

 

それでは!

Feel free to Share and Comment!

ホームへ戻る。

コメントをお書きください

コメント: 42
  • #1

    まさお (日曜日, 11 4月 2021 11:55)

    こんにちは
    参考にさせて頂きながら作成しております。

    最後に詰まっているので、教えて頂けると嬉しいです。

    Unityへ戻る。
    <GameController(Script)>--<Scoring Message>に、<Prefabs>--<Scoring Message>をアタッチする。

    とあるのですが、
    GameController(Script)内にScoring Massageが存在しないため、Prefabsをアタッチできません。
    何が原因か思い当たる部分はあるでしょうか?

    宜しくお願いします。

  • #2

    Renoboy (日曜日, 11 4月 2021 17:18)

    まさおさん、こんにちは。
    最後の最後のところでしょうか?

    冒頭に、
    public GameObject ScoringMessage;

    この宣言が抜けてるのかもしれません。
    確認してみてください。よろしくお願いします。

  • #3

    スズキ (木曜日, 20 1月 2022 14:59)

    参考にさせていただいております。
    パズルのゲーム部分をテストプレイしている時、InvokeでDocheckMatchingが呼び出せずにキャンディが消えず、困っています。
    また、結構な頻度でこのようなエラー文が表示され、キャンディが動きません
    NullReferenceException: Object reference not set to an instance of an object
    CandyMove.moveCandies () (at Assets/Scripts/CandyMove.cs:146)
    CandyMove.OnMouseUp () (at Assets/Scripts/CandyMove.cs:86)
    UnityEngine.SendMouseEvents:DoSendMouseEvents(Int32)


    思い当たる原因はあるでしょうか?教えていただけると嬉しいです。よろしくお願いします。

  • #4

    Renoboy (木曜日, 20 1月 2022 19:57)

    スズキさん、お疲れさまです。
    Invokeの方は、関数名が間違っているのかもしれません。大文字小文字合ってますでしょうか?
    他のInvoke関数が動くなら、書き方に間違いはないと思われるので、細かいミスかと思われます。

    エラーの方はなかなか難しいですが、、、キャンディのタグに間違いはないでしょうか?

    ご健闘を祈ります!

  • #5

    スズキ (火曜日, 25 1月 2022 11:58)

    ご返信ありがとうございます!無事に動かすことができました!

    しかし、今度はキャンディを消した後にFallCandy関数が動かずに困っています。
    エラーなどは特になく、キャンディが消されたところに直接キャンディが補充されてしまいます。

    こちらもよろしければ教えていただきたいです。よろしくお願いします…!

  • #6

    Renoboy (火曜日, 25 1月 2022 14:19)

    スズキさん、引き続きお疲れさまです~。

    もしかすると、落下する前に補充されてしまっているかもしれません。
    Invoke関数の時間の設定は合ってますか?1.2fとか0.5fの部分です。落下が完了するのを待ってから補充する、というように時間を設定してあります。

    それから、補充する関数を動かないようにして(コメントアウトしたりして)、それでキャンディが落ちるかどうか確認してみるのも一案かと思います。

    それでは!

  • #7

    スズキ (火曜日, 08 2月 2022 15:55)

    お久しぶりです。落下しない原因もわかり、すべてが無事に完成しました!!
    ただテストプレイをする時、何度も画面が暗転したり(おそらくクラッシュの一種だと思います。)オーバーフロウしたとエラーが出たりします。
    何か対策はあるでしょうか?
    何度も申し訳ないです。これが最後になると思います。よろしくお願いします!

  • #8

    Renoboy (火曜日, 08 2月 2022 18:13)

    スズキさん、完成までこぎつけたようで何よりです。お疲れさまでした!

    エラーメッセージをそのままコピペしてグーグル検索してみるといいですよ。出てくるのは英語ばかりかもしれませんが、ぼんやりヒントが得られると思います。
    このチュートリアルのプログラムでオーバーフローというのは、ちょっとわかりませんので。。。もしかしたら、再帰状態(リカージョン)になっているのかもしれません。(同じ関数を行ったり来たりしてエンドレスになっている状態のことです)この場合は、どこかのif文など条件設定が間違っているのだと思います。

    それでは!

  • #9

    S (木曜日, 03 11月 2022 22:02)

    とてもわかりやすく、勉強させていただいています。ありがとうございます。
    初心者ですが、手順通りに作成することができました。
    うまく動いているのですが、
    なぜうまく動くのかわからないところがあり、教えていただけると大変ありがたいです。

    CheckMatching関数の中で
    deleteListに何も入っていない時にCanMoveCandiesを実行して
    操作可能にしていると思いますが、3つ並んだ時、deleteListにキャンディが入っているときは
    DeleteCandiesを実行して、CanMoveCandiesは実行していないはずなのに
    キャンディが消えて移動が終わると操作ができるようになります。
    CheckMatching関数はマウス操作からしか呼び出されず、マウス操作は1回しかしていないのに
    2回CheckMatchingが実行されているようで、不思議です。

    宜しくお願いします。

  • #10

    Renoboy (金曜日, 04 11月 2022 12:53)

    S さん、お疲れさまです!
    うまく動いてるようで、ヨカッタです。

    ご質問についてです。
    DeleteCandiesを実行すると、SpawnNewCandyを実行することになって、そこから再びCheckMatchingを実行してます。
    だから、ご質問に記載の通り、2回CheckMatchingが実行されてるのです。

    これで質問の回答になってますか?
    それでは!

  • #11

    S (土曜日, 05 11月 2022 12:24)

    ありがとうございます!
    SpawnNewCandyから呼び出されるのを見落としていました。

    ドラッグ中にぬるっと入れ替わるように改造してみていて
    連打するとうまく動かない時があり
    揃う時と揃わない時で待ち時間が同じなのが原因みたいだったので
    そこをなんとかしようとしての質問でした。うまくできました。

    他にもキャンディの個数や大きさを動的に変えられるようにしてみたり
    ハイスコアを保存してみたりと改造しながらUNITYの基礎を勉強できています。
    とても助かっています。

  • #12

    Renoboy (土曜日, 05 11月 2022 12:45)

    よかったです!

  • #13

    rin (月曜日, 16 1月 2023 18:16)

    こんにちは。
    参考にさせていただいております。

    完全初心者で、四苦八苦しながらなんとかやっています。
    しかし【キャンディを消すごとに加算される得点を表示する】のところでつまづいておりまして。
    表示させるところまではできたのですが、重なって「+0」が表示されてしまっています。
    プログラムが分からないなりに考えてみて色々やってみたのですが、直らず……。

    解決方法はありますでしょうか?

    よろしくお願いいたします

  • #14

    Renoboy (月曜日, 16 1月 2023 20:21)

    rinさん、お疲れ様です。
    あと少しのところですね!

    もしかしたら、

    <GameController>スクリプトへ移動。の項目の、

    <ScoringMessage>オブジェクトをアタッチする。

    というところが抜けているのかもしれません。
    違ってたらすいません。

  • #15

    rin (月曜日, 16 1月 2023 23:51)

    お疲れ様です。ありがとうございます!

    確認しましたが、ちゃんとアタッチできているようで……。
    ですが変わらず、加算される得点と重なるように違う数字のテキストが浮かんでしまいますね……。

    うーん、もう少し試行錯誤してみます!

  • #16

    Renoboy (火曜日, 17 1月 2023 07:21)

    そうですかー。
    キャンディを消してないのにテキストが出てくるのなら、
    var scoringPopUp = Instantiate(ScoringMessage);
    これが、DeleteCandies内に入ってない、とかでしょうかね?

    前の数字が残ってるなら、Destroyできてない。

    数字だけがおかしいなら、計算式が間違っている。
    その場合、DeleteListの計算式が違うのかもしれない。

    どうでしょね?

  • #17

    kumonryu (月曜日, 27 2月 2023 11:52)

    unityゲーム開発初心者です

    サイトを参考にさせてもらい、なんとか動作するところまで漕ぎ着けました
    大変感謝しております

    初歩的なミス(iと1、lや|などの入力ミス、追加するコンポーネントを間違えるなどなど)かなり苦労しました

    今後も参考にさせて頂きたいと思っていますのでよろしくお願いいたします

  • #18

    Renoboy (月曜日, 27 2月 2023 13:56)

    kumonryuさん、お疲れ様でしたー!
    3マッチパズルは、結構作るの難しかったんじゃないかと思います。
    同じゲームを、何度も作ると理解度が深まるのでおすすめですよ。
    がんばって楽しんでくださいね!

  • #19

    トク (日曜日, 02 4月 2023 14:07)

    こんにちは。
    丁寧なチュートリアルをありがとうございます。
    おかげさまでパズルを作ることができました。

    1点、完成版の挙動として正しいのか確認させてください。
    (作成途中に何度か設定を間違え挙動がおかしくなったことがあり、完成している自信がないです……)

    キャンディを消した後、上のキャンディが落下してきますが、
    例えば最下段から上方向に3つのキャンディをそろえて消した場合、
    上の4つのキャンディ+3つのキャンディが落ちてくるのではなく、
    上の4つのキャンディが落ち切ってから、3つのキャンディが落ちてきます。

    これは正しく作れていますでしょうか。

  • #20

    Renoboy (日曜日, 02 4月 2023 17:38)

    トクさん、お疲れ様でしたー!
    その挙動で合ってます。
    もし、同時に七つ落としたい場合は、そのようにプログラミングしてみると楽しいと思います。
    キャンディを消去したときに、配列をnullにしてFallCandy関数を動かしてますけど、そうではなく、タテでいくつ消去したのか数えて、その数だけキャンディを生成して上から落としてやるとか、、、ですかね? ちょっと思いつきですが。。
    それでは!

  • #21

    トク (日曜日, 02 4月 2023 18:23)

    正しく作れていて安心しました。
    勉強のため色々カスタマイズしてみようと思います。
    ありがとうございました!

  • #22

    Huali (金曜日, 15 9月 2023 01:27)

    GameCollectorとCandyMoveのコードの順番がよくわからないのでコード全体を送ってもらえませんか。お願いします。

  • #23

    ura (火曜日, 10 10月 2023 17:06)

    こんにちは、参考にさせていただいております。
    ゲームはエラーなく動作してくれたのですが、別アスペクト比のAndroid端末で開いたところ、
    キャンディが画面からはみ出してしまいました。
    どこの設定を変更すれば可変するかわからず、お手数ですがご教授いただけますと幸いです。

  • #24

    Renoboy (火曜日, 10 10月 2023 21:33)

    uraさん、お疲れ様でした。うまくゲームが動いたようで何よりです!
    画面の解像度を変更するには、別途プログラムする必要があるように思います(どのスマホでもきれいに表示させたいわけですよね?)。
    「unity 画面解像度 変更」みたいに検索すると出てくるかもしれません。
    ぜひトライしてみてくださいね!

  • #25

    ura (水曜日, 11 10月 2023 20:29)

    ご回答いただき誠にありがとうございます!
    解像度の件、無事に解決できました。
    これで完成だと実機プレイを楽しんでいたのですが、一点不具合を発見しまして、質問させていただきたく存じます。
    3つ揃えて消した後に補充されるキャンディが、消えていないキャンディの上に落ちてきてしまうことがありまして、対処法をご教授いただけますと幸いです。
    お手数をおかけしますが何卒よろしくお願いいたします。

  • #26

    Renoboy (木曜日, 12 10月 2023 07:08)

    uraさん、お疲れさまです。
    不具合(バグ)修正がプログラミングの大変なところであり、楽しいところでもありますね。
    たとえば二列目を消してるのに三列目に降ってくる、と。
    毎回なら基本的な設定が間違ってるんでしょうし、特定の消し方をしたときだけなら、そのとき、どこの関数が動いているか考える。そんな感じで仮説と検証の繰り返しです。
    たとえば、myPreviousPosがきちんと更新されてないとか?座標の入れ方が間違ってるとか?
    見た目(絵)と中身(座標)がズレてるのかもしれません。

    画面解像度の変更できましたか? よかったです!
    もし、追加でプログラムされたのでしたら、どんな関数を使ったのかちょっとシェアしてくれるとありがたいです。
    それでは!

  • #27

    フクベ (日曜日, 31 12月 2023 03:51)

    private List<GameObject> deleteList = new List<GameObject>();と入力すると名前空間にフィールドやメソッド、またはステートメントのようなメンバーを直接含めることはできませんCS0116と出てしまい進むことができません。どうすればよいでしょうか?
    プログラミング初心者ですみません。

  • #28

    Renoboy (日曜日, 31 12月 2023 08:08)

    フクベさん、おつかれさまです。
    private List<GameObject> deleteList = new List<GameObject>();

    これを書くのは、classの内側です。「冒頭」と説明文にありますが、int とかboolとか書くのと同じ場所です。
    そのエラーメッセージはクラスの中に書いてね、という意味です。
    良いお年を。
    2048や四川省のチュートリアルもやってみてくださいね!

  • #29

    フクベ (日曜日, 31 12月 2023 11:17)

    返信ありがとうございます。
    無事そこは解決できたのですが、実際に実行すると始めた瞬間に揃っているものが消えて、ほかのドロップは揃えても消えない状態になってしまいました。具体的にどこを見て直せばよいでしょうか。

  • #30

    フクベ (日曜日, 31 12月 2023 11:26)

    追記
    始めた瞬間消えてしまうのですが、さらに補充もされません。コピペでVScodeに入力していたのでタイピングミスはないと思うのですが…

  • #31

    Renoboy (日曜日, 31 12月 2023 15:49)

    フクベさん、おつかれさまです。
    チュートリアルの後編もやったうえでのことですか?
    なんか、前編までの話のように思いましたので。。。
    それでは、頑張ってください!

  • #32

    フクベ (日曜日, 31 12月 2023 17:22)

    後編の新しいキャンディが上から降ってくる(プレイ中)のとこまではやってます。スコア表示などのとこはまだやっていなくて、テストプレイしようと思った時に上記のようになってしまいました。
    全部最後までやらないと実行できないのですが?
    始めたてでその辺りの知識がないもので…すみません

  • #33

    あみ (水曜日, 03 1月 2024 16:51)

    何とか完成に持っていくことができたのですが、空いているところに上から落ちてくるのではなく新しいドロップが補充されてしまいます。。。
    あとドロップが重なっているのか分からないのですが、入れ替えているのに入れ替えた先のドロップがそのまま残って空白ができてしまうようになってしまいました。。。

  • #34

    Renoboy (木曜日, 04 1月 2024 08:26)

    フクベさん、おつかれさまです。
    作った関数は実行されるようになってますか?

  • #35

    Renoboy (木曜日, 04 1月 2024 08:29)

    あみさん、おつかれさまです。
    完成までご苦労さまでした~。

    不具合点が明確なようですから、チュートリアルの該当箇所をもう一度よんでみてくださいな。
    ドロップを生成する位置(座標)がちがうか、Lerpのところの速度がちがうかもしれませんね。
    それでは!

  • #36

    フクベ (火曜日, 09 1月 2024 09:56)

    動いて消えるようになったのですが、上の方と全く同じ状況でして…
    ドロップが落ちる前にその場に補充されてしまう感じです…
    時々ドロップが入れ替わらず同じところにふたつ重なって空白が生まれてしまいます…

  • #37

    フクベ (火曜日, 09 1月 2024 11:54)

    ドロップを左にスライドした時だけ重なってしまう感じです

  • #38

    にししし (木曜日, 21 3月 2024 10:03)

    ゆびではなくマウスで動かすにはどうすればいいでしょうか?

  • #39

    shizuku (日曜日, 07 4月 2024 23:26)

    こちらの記事を参考にさせていただき、点数ロジック部分以外について実装し6×7ではなく6×5で実装したところ、右から2列目のキャンディが右に動くことができない事象が発生しました。
    こちらは想定通りの挙動でしょうか?

    現在、キャンディ消去時の動作を変更するところを並行して実施させていただいてます。

    とても有益な情報をありがとうございます!

  • #40

    Renoboy (月曜日, 08 4月 2024 08:19)

    shizukuさん、お疲れ様です。このチュートリアルを作ったのも3年半も前のことなんで覚えていませんが、記事を読み直してみると、横5列、縦7行で作ってます。shizukuさんのいう6×7(or 5)というのは横6列という意味ですよね?そうすると、moveCandies関数内の (column < 4)というのがそのままだとおっしゃるような挙動になるような気がします。いかがでしょうか?

  • #41

    リカ (火曜日, 16 4月 2024 22:19)

    大変参考になりました。ありがとうございます。
    基本的にコピペで動かすところまでいけたので、色々と改変したりして遊んでいます。

    こちらの改変したものを、自サイトにゲームとして公開しても良いのでしょうか?

  • #42

    Renoboy (水曜日, 17 4月 2024 07:45)

    リカさん、お疲れ様でした。
    ご自身のゲームとして公開して構いませんよ。
    プログラムの不具合や、画像、音楽の著作権関係の対応については、もちろんご自身でお願いいたしますね。
    それでは!

 

 

Profile

string name = "Renoboy";

string message = "《Unity,C#》に詳しくない私による、詳しくない人のためのチュートリアルです。詳しくないので、難しいことは決して教えません。";

 

Appale-Takemuroid