初めてゲームジャムに参加してみた。

こんにちは、青ごまです。
前回の記事を見てくださった方がもしいましたら改めてありがとうございます。
私の想定より多くの方に見てもらって大変恐縮でした。
無事2回目の投稿ができたのも、「スキ」を押してくれた方々のおかげです。

さて、前置きはこのあたりにして、今回はタイトルにもある通りゲームジャムに参加したので、感想だったり、新しく知ったことだったりを書いていこうと思います。
お付き合いくださると幸いです。


ゲームジャムとは


そもそもゲームジャムって何?

という方もいると思うのでまずはゲームジャムについて簡単に説明します。
ゲームジャムとは、複数人のグループに分かれ、決められたお題に沿ったゲームを短期間で作るイベントです。

国内だけでなく、全世界で同時に行われるグローバルゲームジャムというイベントもあるので、興味があればぜひ調べてみてください。

ゲームジャムに参加した経緯

そもそもどういう経緯だったかお話しすると、

現在私はとある専門学校にてゲームのプログラミングについて勉強させてもらっているのですが、その専門学校内の部活動でゲームジャムをやることになったわけです。
もともとゲームジャムに興味があったため、これ幸いにと参加させていただきました。

ですので外部でのゲームジャムではなく、学校内でのゲームジャムに参加したわけですね。
ただ、今回とは別に外部でのイベントに参加する予定もあるので、そちらの方も書きたいな~と思っています。

今回のゲームジャムで使ったソフト

今回はUnityを使ってゲームを作りました。
バージョンは2021.3.26.f1です。
Unityを使って一からゲームを作るのは初めてだったので全く自信がない中始まりました。

ゲームジャム開始!!

ということでいよいよ本題です。
ゲームジャムのチームとテーマが発表され、ついに始まりました!
今回のテーマは
「落ちる」「逃げる」「無限」
の3つの中からどれか1つでも入っていればOKということでした。

まずはどんなゲームを作るか、案を出すところから始まります。
私のチームでは、テーマの「無限」を入れるのは難しそうだから「落ちる」と「逃げる」に絞って案を出していこうという話になりました。
そして最終的に、

「足場が下から出てきて画面外に落ちないようにするゲーム」

を作ることになりました。
そして私はプレイヤー(操作キャラクター)を作ることに…
Unity触って1か月の私がちゃんと作れるのか!?

ゲーム制作開始!

ついにゲーム制作です。
制作するのはプレイヤーということで、まずは左右移動の実装から。

左右移動


public class MoveCharactorControll : MonoBehaviour
{
    //プレイヤーの動く速度
    private  float m_speed = 0.01f;

    private SpriteRenderer m_SpriteRenderer;

    private Animator m_anim;

    private Rigidbody2D m_Rigidbody;
    void Start()
    {
        m_SpriteRenderer = GetComponent<SpriteRenderer>();
        m_anim = GetComponent<Animator>();
        m_Rigidbody = this.GetComponent<Rigidbody2D>();
    }
    void Update()
    {
        Vector2 position = transform.position;

        //左右移動
        if (UnityEngine.Input.GetKey(KeyCode.LeftArrow)) 
        {
            position.x -= m_speed;
            m_SpriteRenderer.flipX = true;
            m_anim.SetBool("move",true);
        }
        else if(UnityEngine.Input.GetKey(KeyCode.RightArrow))
        {
            position.x += m_speed;
            m_SpriteRenderer.flipX = false;
            m_anim.SetBool("move", true);
        }
        else
        {
            m_anim.SetBool("move", false);
        }
        transform.position = position;
    }
}

とりあえずばーーーーーーっと書いてみましたが…
何の変哲もないような左右移動ですね。
ネットの記事をいくつか参考にして書いたものなのであまり胸を張って見せられるようなコードでもないです。
今回は、アニメーションについて得る知識が多かったと思うので、今回はそこについて書こうと思います。

ジャンプ

そして次にジャンプ!!
ここはめっちゃ頑張りました。
とりあえずコードどーん。

 public class MoveCharactorControll : MonoBehaviour
{
    //音声の再生に使う変数
    private AudioSource m_audioSource;
    //ジャンプの効果音に使用する変数
    public AudioClip m_jumpAudio;

    //ジャンプに使用する変数
    [SerializeField]private float m_jumpForse = 10.0f;  //ジャンプの強さ
    [SerializeField] private float m_upForce = 1.0f;   //上昇量
    private bool m_jumpFlag = true;            //ジャンプできる回数
    private float m_jumpTimer = 0;            
    [SerializeField] private float m_jumpTime = 0.5f;  

    private float oldPositionY = 0;
    void Start()
    {
        m_anim = GetComponent<Animator>();
        m_Rigidbody = this.GetComponent<Rigidbody2D>();
        oldPositionY=transform.position.y;
        m_audioSource=GetComponent<AudioSource>();
    }
    void Update()
    {
        //ジャンプの処理
        if (UnityEngine.Input.GetKeyDown(KeyCode.Space)&&this.m_jumpFlag)
        {
            this.m_Rigidbody.AddForce(transform.up * m_jumpForse);
            m_jumpFlag = false;
        }
        if (UnityEngine.Input.GetKey(KeyCode.Space) && m_jumpTimer < m_jumpTime)
        {
            m_Rigidbody.AddForce(transform.up * m_upForce);
            //m_Rigidbody.velocity += new Vector2(0.0f, m_upForce);
            m_jumpTimer += Time.deltaTime;
        }
        if (UnityEngine.Input.GetKeyUp(KeyCode.Space))
        {
            m_jumpTimer = m_jumpTime * 2;
        }

        //今の位置から下に向かって光線を飛ばす
        RaycastHit2D hit = Physics2D.Raycast(transform.position + (-transform.up * 0.6f), new Vector2(0, -10.0f), 1.0f);
        //光線の長さで接地判定をとる
        //接地しているとき
        if (hit.collider != null && hit.fraction < 0.01f)
        {
            m_jumpFlag = true;
            m_jumpTimer = 0;
            m_anim.SetBool("floor", true);
            m_anim.SetInteger("jumpState", 0);
            if(UnityEngine.Input.GetKeyDown(KeyCode.Space))
            {
                m_audioSource.PlayOneShot(m_jumpAudio);
            }
            //m_gravity = 0.0f;
        }
        //接地していないとき
        else
        {
            m_anim.SetBool("floor", false);
      //上昇中
            if (oldPositionY < transform.position.y)
            {
                m_anim.SetInteger("jumpState", 1);
            }
      //下降中
            else if (oldPositionY > transform.position.y)
            {
                m_anim.SetInteger("jumpState", 2);
            }
        }
        //前のフレームのYの位置を更新する
        oldPositionY = transform.position.y;
    }
}

長いですね…
説明しようと思ったんですが先輩に教えてもらったところが多く、今の私には説明できないところもあるので詳しい解説はまたいつかということにしておきます。
特に「Ray」に関してはよくわかってないことだらけで、
「設定した地点から光線を発射してそれが当たった地点の情報をもらう」
みたいな理解しかできていないのです。
この理解であってるかどうかもわかりません…
ここは今回のゲームジャムで得た課題ですね。

ゲーム完成!!

と、そんなこんなでなんとかゲームを完成させることができました!
ほんとによかった…
不安もありましたが、先輩の指導やネットで調べた方法を駆使し、完成までもっていくことができました。
今回、アニメーションについて書こうと思ったのですが、書いている時点でとんでもなく長くなってしまったので、いったんここで区切らせてもらおうと思います。
前言撤回になってしまって申し訳ありません。
必ずアニメーションのことについてはまた投稿します。

今回完成させたゲームは「Unity Room」という、Unityで作ったゲームをブラウザで遊べるサービスに上げました。
お粗末な出来ではありますが、遊んでいただけると幸いです。
助言や感想などいただけたらもっとうれしいです。
↓こちらがそのリンクです。

まとめ

今回は初めてのゲームジャムについて書かせていただきました。
最後まで読んでくださって本当にありがとうございます。
どうでしたか?
長すぎてウンザリしたかもしれないですね、すみません。
これも経験だと思って長いまま投稿します。

感想としては、本当にただただ楽しかったです!
不安になったこともありましたが、それも全てひっくるめて楽しかったなと思えるような経験でした。
新しく得た知識も多かったですし、知らない人との交流もやっぱり楽しかったです。

7月29、30日に某所のイベントに参加する予定なので、そちらも今から楽しみです。
ということで、本当に長いことお付き合いいただきありがとうございます!
後日また、新しく得たUnityの知識について書くのでそちらも見ていただけたら嬉しいです。

それでは、また会いましょう!

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