Effective Haru

ゲーム開発関係で学んだことや個人的なことをだらだらと書きます

CyberAgentさん主催のプロトスプリントリーグに参加しました!

 

 

7/28 ~ 8/6の計10日間で行われるCyberAgentさん主催のプロトスプリントリーグに参加しました。インターンの様子や、所感を書き残します。

 

 

プロトスプリントリーグとは

初日に与えられたテーマを元に、チームで事前準備期間7日、コーディング3日でゲームを完成させるイベントです。今回のチーム編成は5人チームと、前回と比較して人数が多くなっているようです。

 

事前準備期間(7日)

キックオフ

初日はZoomで全体集会をした後、Discordで自己紹介を行いました。

シェーダー、物理、DirectX、設計など、各自それぞれ強みがあるようで皆つよつよでした。 自分はオンラインは出来るのですが、今回はお役に立てそうになかったので、設計デキルってことにしときました!!()

 

そして、テーマは「組み合わせ」

皆で組み合わせから連想されることを書き出しました。この日はとりあえずアイデア出しをして、後日また企画を決めることになりました。

その後、2日間程で企画が無事固まりました。本当にありがとうございます!

この2日間は参加していなかったので、ほぼ企画に関われていなかったんですが...(大学の課題は終わらせておこう)

企画としては、「文房具を組み合わせて自分の機体を作り上げ、目標を制圧するゲーム」に決定しました。似たようなゲームとしてBesiegeというゲームがあります。

store.steampowered.com

 

 

設計

企画を全体に共有後、タスクの洗い出しと役割分担を行いました。

自分は設計担当になったので、暫定で決まってた仕様を参考にしつつ設計メモを作りました。皆で共有する機能だけクラス図に書き起こし、具体的な実装は、テキストで残しました。

後で見返して思ったんですが、今回のような短期間の開発ではServiceLocatorが強力だったかもしれませんね... ServiceLocatorに各自共有したいインスタンスを投げておいて、他の人に拾ってもらう形が、無駄に参照関係が複雑にならないし簡単そう。

 

設計メモの一部

 

他にも、画面遷移図を作っていただきました。

これがあるだけでだいぶゲームのイメージが湧きますね。
メモの入れ方や1画面の情報量など、とても勉強になりました!

 

そして、当日までに他のメンバーの方々が素材集め・作りをしてくださり、もう完成のイメージができるぐらいまで進みました。本当に感謝しかないです🙏

 

制作期間(3日)

1日目

私は機体組み立て機能担当だったので、破綻なく気持ちよく配置できるシステムを考えていました。オブジェクトをJointでくっつけただけですが、既に面白い遊びが出来ていると思います。

その他にも、別シーンで並行してパーツ、敵、UIなどを進めていただきました。まだゲームループは出来ていませんが、初日の進捗としてはかなり進んだ方だと思います。

 

2日目

引き続き、機体組み立て機能の実装を進めました。UIがほぼ完成したので、文房具の世界観が良く伝わっていると思います!私の方は折りたたみ定規への対応と、コスト、削除機能の実装を行いました。

また、お昼に中間発表会があり、他グループのメンターさんからFBを頂きました。主にパーツを上手く活かしたレベルデザインがあると良いといった意見を頂きました。

深夜になると、いつの間にかポーカー大会が始まっていました(?)
開発でとても疲れているはずなのですが、大盛りあがりで、より一層仲が深まったと思います!!

 

3日目

最終日は、組み立て機能に回転機能を加えました。この機能の実装を提案された際は、自分もそんなに時間がかからないと思ったのでノリノリでOKしましたが、実は一番苦戦した機能だったり...

残り5時間ということもあり、冷や汗かきながら実装した機能ですが、これがあるのとないとでは大きな違いだったと思います!回転が加わったことで、組み合わせに多様性が生まれ、今回のテーマをより活かすようなゲームになりました!

 

結果

最終発表終了後、結果発表会がありました。

そしてなんと... 第2位 を頂くことが出来ました!嬉しい!

 

「パーツを試行錯誤して組み合わせる楽しさ」を評価していただいたのかなと思います。試行錯誤させるようなステージ作りが間に合わなかったのが唯一悔しい点です😭

 

まとめ

同じ大学で本気でゲーム開発に取り組んでいる人にあまり巡り会えなかったので、実際にゲーム開発している人いるんだ!!ってことにまず感動しました。

 

更に、ゲームや雑談などを通じて仲良くなり、開発でもそのコミュニケーションを活かせたことが何より一番良かった点かなと思います。インターン中のLTでも言及されていましたが、報連相(ホウレンソウ)の前に雑相(ザッソウ)ができるような関係が一番良い関係ということです。メンバーと気軽に雑談ができる関係にあるからこそ、報連相が円滑にできるようになるということを、開発をしていて特に実感しました。

 

そして、10日間一緒に駆け抜けてくれたメンターさん、メンバーの方々、本当にありがとうございました!機体組み上げ機能でいっぱいいっぱいになってしまったので、バグ修正の部分のヘルプぐらいしか出来ませんでしたが、UIや演出、パーツの素材・動き、ステージなど、どれも素晴らしいものが出来ていて、作っている途中もずっと感動してました!

今回のインターンで、マインド面や技術面で自分に足りない部分を見つけ、沢山の刺激を得ることが出来ました。学んだことを振り返りつつ今後も精進していこうと思います。

 

FB・KPTメモ

メンターさんからのFB

→ 初動でもっと積極的に動くべき

最初に少し様子見してしまった。自らの役割を見つけ、積極的に動けるようになりたい。設計面では一方的に設計メモ作って共有する形になってしまったので、設計を考える前にメンバーのスキルや役割をヒアリングして、それに適した設計を提案できるように意識していきたい。

 

 

C#でbyte[] to int[] とか int[] to byte[]する

オンラインゲームの実装でプリミティブなデータを弄る機会があったので小ネタ投稿

BitConverterの内部実装

BitConverter.cs referencesource.microsoft.com

直接ポインタを操作するので、fixedでアドレスを固定。 byte型のポインタをそれぞれの型のポインタとして再解釈しているだけっぽい。逆も然り。

GCが絡むと複雑かと思ったけど、アドレスさえ固定すればC/C++みたいに自由が効くようになるのか~ (unsafeも忘れずに!)

実装結果

github.com

T[ ] to byte[ ]

public static unsafe byte[] ToBytes<T>(T[] array) where T : unmanaged
{
    byte[] bytes = new byte[sizeof(T) * array.Length];

    for (int i = 0; i < array.Length; i++)
    {
        fixed (byte* numPtr = &bytes[i * sizeof(T)])
        {
            *(T*)numPtr = array[i];
        }
    }

    return bytes;
}

確保するバイト列は型のサイズごとにアラインすればOK。
unmanaged制約は加えたけど、多分不十分だし確実に動かすならジェネリクスじゃない方がいいかも。

byte[ ] to T[ ]

public static unsafe T[] Convert<T>(byte[] bytes) where T : unmanaged
{
    T[] result = new T[bytes.Length / sizeof(T)];

    for (int i = 0; i < result.Length; i++)
    {
        fixed (byte* numPtr = &bytes[i * sizeof(T)])
        {
            result[i] = *(T*)numPtr;
        }
    }

    return result;
}

さっきの逆バージョン。
この場合、byte列が指定の型にアラインされてないとアクセス違反なるので、弾いてあげる必要がある。 最低限の例外を加えたものは冒頭のリポジトリに挙げました。