たんぽぽを刺し身に乗せるゲームを作った!!!!

この記事は、NITKC ProLab Advent Calendar 2020 23日目の記事として、クリスマス後に書き始められました。


先日、僕はこのようなツイートを目にしました

これはさっさとUnityゲームジャムに投稿してnoteに記事を書くしかないのでは??

と思った僕が過去作を今回のお題「あける」に沿って改変し、提出することにしました。


作品の内容は題名の通り、たんぽぽを刺し身に乗せるゲームです。

刺し身工場の一員として働き、時には給料を上げ、時には刺し身の流れるペースを上げながら、1億貯蓄することが、このゲームのクリア条件です。

ちなみに、「開ける」要素は一つ、たんぽぽのボックスを「開けて」、たんぽぽを並べてもらいます。

たんぽぽはボックスから、ドラッグアンドドロップで、並べることができます。

数時間しかかからなかったとはいえ、このゲームを作るときに苦労したことの二番目にこの実装が入ると思います。(一番目は必要な素材探しです.....)

話すことがあまりないのでドラッグアンドドロップの実装について語ると、

まずクリックしたときMain CameraからRayを投げて、接触したColiderを確認し、たんぽぽの箱ならばたんぽぽをマウスに追従させる、といった感じです。

Update(){
    if(Input.GetMouseButtonDown(0))// たんぽぽを掴む部分
    {
    
           Vector3 screenpos = Input.mousePosition;
                      
           if (Camera.main != null)
           {
               Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

               int layerMask = 1;

               float maxDistance = 10;

               RaycastHit2D hit = Physics2D.Raycast((Vector2)ray.origin, (Vector2)ray.direction, maxDistance, layerMask);

               if (hit.collider != null &&hit.collider.name == "DandelionBox" && !isHoldDandelion)
               {
                   dandelion =  _objectPool.GetObject();
                   isHoldDandelion = true;
               }
               
           } 
    }
    
    if (Input.GetMouseButton(0)&& isDandelion)// たんぽぽを追従させる部分
    {
           Vector3 screenpos = Input.mousePosition;
           Vector3 worldPos = Camera.main.ScreenToWorldPoint(screenpos);
           dandelion.transform.position = new Vector3(worldPos.x,worldPos.y,0);
    }

    if (Input.GetMouseButtonUp(0) && isDandelion)// たんぽぽを刺し身に下ろす部分
    {
           isDandelion = false;
           Vector3 screenpos = Input.mousePosition;
           Vector3 worldPos = Camera.main.ScreenToWorldPoint(screenpos);
           if (Camera.main != null)
           {
               Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

               int layerMask = 1;

               float maxDistance = 10;

               RaycastHit2D hit = Physics2D.Raycast((Vector2)ray.origin, (Vector2)ray.direction, maxDistance, layerMask);
               
               if(hit.collider != null&&hit.collider.CompareTag("Sashimi")&&!hit.collider.gameObject.GetComponent<SashimiController>().Isonsashimi)
               {
                   hit.collider.gameObject.GetComponent<SashimiController>().Isonsashimi = true;
                   dandelion.transform.position = new Vector3(worldPos.x,worldPos.y,0);
                   dandelion.transform.parent = hit.collider.transform;
                   dandelion = null;

               }
               else
               {
                   Debug.Log("MISSED");
                   dandelion.SetActive(false);
                   dandelion = null;
               }
           }
       }
}

たんぽぽは刺し身の子オブジェクトに設定することで乗せることを表現しています。

今考えたらUpdate関数内の処理多すぎて別に関数に分けるべきでした。

反省します

たんぽぽ、刺し身にはObjectPoolを使って使い回すようにはしています

今回のゲームではそこまで大量に消したり生成したりということはしないのですが、一応ObjectPoolで実装しておきました。


余談ですが、このゲームをクリアするのには二時間程度かかる可能性があります。

余裕のある時に一気にするか、キャッシュを飛ばさないように地道に進めるかはあなた次第ですが、結構時間がかかるので、注意してください

ぜひプレイして、評価とコメントをしていただけると嬉しいです。




この記事が気に入ったらサポートをしてみませんか?