Akatsuki Hackers Lab | 株式会社アカツキ(Akatsuki Inc.)

Akatsuki Hackers Labは株式会社アカツキが運営しています。

インターンでクライアントエンジニアを体験しました

はじめまして。ハチナイのクライアントエンジニアインターンとしてお世話になりました、AxIと申します。
今回15日ほどハチナイの開発としてお邪魔させていただきました。
僕はゲーム開発は初めてだったのですが今回のインターンで、自分で改善点を見つけて、ある程度実装するところまで経験させていただきました。

目次

インターン開始前

一週間前に説明をいただき、UnityとGitの復習を行いました。

インターン開始

まずは改善点の探索ということで、仕様書を20時間ほど読み、仕様書で与えたいユーザー体験と僕が自分でプレイして経験した体験のどこにギャップがあるのかを考えました。また、1ユーザーとして不便なところやわかりにくいところを考えリストアップしました。
それらの改善点を抜粋し、開発チーム内の様々な職種の方のまえで発表とディスカッションを行い、理にかなっている物の中でインターンという短い時間の中で可能な改善点を選定しました。

課題決定

取り組む課題は、デレストのカード詳細のユーザーフレンドリーな確認方法の実装としました。
従来、デレストオーダー編成時、サポート選択時にはアクションカードの効果を三つ以下の小さなアイコンで理解しなければならなく、特に初心者にとっては難しい環境でした。(対象カードを所持しているキャラアイコンを長押しすると、選手詳細から説明文をみることが可能)
そのため、それらの画面で軽いアクションで確認できる機能は、初期ユーザーのデレストへのハードルを下げる、中長期ユーザーのオーダー編成時の煩雑さを下げるという点でメリットが期待されました。

実装

あまり触れたことのないUnityの2D周り(3Dは経験あり)、Git、ゲーム開発という環境で不安でしたが、社員さんの優しいサポートの元、牛歩ではありましたが実装を進めました。
インターン中にすべてのコード理解は不可能と感じたため、まだ見ぬ他の機能を阻害しないように基本的に現状の機能内に似た機能を探し、その実装方法を真似て実装するというカメレオン的なコーディングを意識しました。

初期想定ではカードタップ時にポップアップ表示、ポップアップ表示時にポップアップ以外タップでポップアップ消去という機能でしたが、実際に実機で触れてみたところ、ポップアップ消去動作が煩雑であったため、カードに触れている間のみポップアップを表示という機能に変更しました。
このように実機でなんどもビルドし、ユーザーの邪魔にならないポップアップの表示方法を検討しました。

f:id:AxI:20190628174437p:plain
実装結果
実装の詳細は成果発表の時に使ったスライドの抜粋として、末尾に添付しておきます。

インターンを終えて

反省点

迷惑をかけたくないという感情が強すぎ、自分でできる可能性があるところはとことん遠慮がちになってしまい逆に迷惑をかけてしまったように感じました。
配慮と遠慮の区別をつけられるよう今後精進したいです。

良かった点

仕様書を読んで改善点をプレゼンし、仕様書を書いて実装して、実機で動かして、使ってみて使ってもらって、改善して。と一連の流れを体験できたのは、ゲーム業界未経験の僕にとってかなり価値のあるものだったと思います。
また、問題提起や発表、コーディングは好評をいただけました。
問題提起や発表は学問や研究と繋がる面が多々あったので、普段頑張っていることが社会に出ても役に立つ実感ができてとても嬉しかったです。
コーディングも実務は未経験でしたが、実装をしていく中で授業や研究で学んできたことがしっかり役に立ってる感が味わえ、今後卒業に向けた研究へのモチベーションにもつながりました。

タイミングが良かった

アカツキの9周年祭、ハチナイ の2周年祭がインターン中にあり、インターン生ながら参加させていただきました。

f:id:AxI:20190628173036j:plain
かわいいケーキ
インターン生だろうが関係なく受け入れていただいた面や、ハチナイのお祝いに他の部署の人たちが御祝品もって突入してくる雰囲気はとても暖かでした。

成果発表の時に使ったスライドの抜粋

f:id:ytfkbc:20190729115421p:plainf:id:ytfkbc:20190729115700p:plainf:id:ytfkbc:20190729115718p:plainf:id:ytfkbc:20190729115726p:plainf:id:ytfkbc:20190729115736p:plainf:id:ytfkbc:20190729115745p:plainf:id:ytfkbc:20190729115754p:plainf:id:ytfkbc:20190729115803p:plainf:id:ytfkbc:20190729115830p:plainf:id:ytfkbc:20190729115839p:plainf:id:ytfkbc:20190729115922p:plainf:id:ytfkbc:20190729115930p:plainf:id:ytfkbc:20190729115940p:plainf:id:ytfkbc:20190729115951p:plainf:id:ytfkbc:20190729115959p:plainf:id:ytfkbc:20190729120007p:plainf:id:ytfkbc:20190729120018p:plainf:id:ytfkbc:20190729120027p:plainf:id:ytfkbc:20190729120038p:plainf:id:ytfkbc:20190729120048p:plainf:id:ytfkbc:20190729120059p:plainf:id:ytfkbc:20190729120120p:plainf:id:ytfkbc:20190729120130p:plainf:id:ytfkbc:20190729120139p:plainf:id:ytfkbc:20190729120153p:plainf:id:ytfkbc:20190729120203p:plainf:id:ytfkbc:20190729120238p:plainf:id:ytfkbc:20190729120250p:plainf:id:ytfkbc:20190729120301p:plainf:id:ytfkbc:20190729120329p:plainf:id:ytfkbc:20190729120340p:plainf:id:ytfkbc:20190729120353p:plainf:id:ytfkbc:20190729120407p:plainf:id:ytfkbc:20190729120419p:plain

Akatsuki Summer Internship 2019-7

はじめまして、イチノセです。

この度、株式会社アカツキにて「八月のシンデレラナイン」の部署にて3週間就業型インターンをさせていただきました。ここで何を学び、何を見たのか語っていきます。

 

経緯

2018年12月、私はインターンを探していました。将来の就職のために行くに越したことはないと思いネットで探していました。探している中、普段からお世話になっている教員の方から「アカツキで新しいイベントをやるから行ってみては?」と勧められ、そちらの会社ではお世話になった先輩が就職した会社であるということもあり、アカツキのイベントに参加することにしました。

 

「Akatsuki Geek Live」と呼ばれるそのイベントは、LT(Lightning Talks)と呼ばれるプレゼンテーションを企業と学生から数名ずつ募り登壇するイベント(以下LT会)でした。第1回目は2月にあり私は聴衆側でしたが、エンジニアの集う会ということもあり、面白い話を多く聞きました。何度かLT会にお邪魔させていただいてると夏に3週間就業型インターンシップがあると聞きました。

 

こちらでは参加期日が3種あり、7〜9月の頭の平日からそれぞれ3週間ありました。3週間という長いインターンであり、参加したら他の会社のインターンを受けることができないと思った私は学校と話をつけて7月の頭から3週間インターンに参加することにしました。

 

目標

こちらのインターンでは何をテーマにするかを初めに自分で決めるところからスタートします。テーマを決めたらメンターの方と話し合ってテーマに対する目標、そのための道筋を一緒に考えました。

選べる道が多い中で「データ管理、効率化をより深掘りしていく」ことを目標にしました。私はワークフローエンジニア(データの管理、効率化を図るエンジニア。エディタやパラメータ管理、処理軽減など)を目指しており今までの制作の中ではそちらの処理に関わる機会が多くありました。今回のインターンではそちらの実力を伸ばそうと考えたのです。

 

インターン課題1

目標を決めた後はタスク管理ツールを閲覧して、どのタスクが目標に沿っているか確認して課題を決めていきました。候補はいくつか挙げられた中で、デザイナーからのタスクに「デバッグ機能としてキャラクタのシーン画像を追加した際の表示範囲、座標をどのスマートフォン検証端末からでも確認できるようにしてほしい」とありました。データの管理に沿うということで今回はこちらの作業を行うことにしました。

初めはすぐに作業を開始するのではなく会社のコードを読むところから始まりました。会社の方で参考になる処理があれば使用できるからです。コードを読んで3日ほどで作業に取り掛かり始めました。コードを読んだりメンターの方と話して知ったのですが、IOSに合わせて画像サイズを合わせた後、画像の表示可能範囲、必須表示範囲からIOSに合わせた表示範囲を計算して描画してくれるオブジェクトがすでにあるそうなのでそちらを利用しながら作業しました。

そちらを加えた後は画像の情報を取得する手段について考えました。画像の表示位置を変更したい、表示範囲を変更したい、画像自身を移動させたいなど後々で変更もできるようにしようと思い、画像の表示範囲、座標をUIで表示し変更ができるようにしてデザイナー側からも楽に変更ができるようにしました。さらに画像自身をスライドして表示中心座標を感覚で変更できるようにしました。

こちらのゲームではキャラクタの画像を閲覧する方法として、パラメータ確認の時にも閲覧できるようになっています。そちらの挙動も確認できるようにしたほうがいいということを話し合って挙動を追加しました。そしてこれらUIの表示を消すフルスクリーン機能、読み込みの処理の多重化など測りました。

 今回の制作では、使いやすくわかりやすい機能を目指して開発できたのでいい経験になりました。

 

インターン課題2

次の課題は「対戦時のキャラクタ表示を上記で使用したオブジェクトを使用して表示する」ことすることでした。表示方法が「背景、半透明の黒、キャラクタ」の順で後ろから表示します。こちらではSSR未満の場合には背景はデフォルトの背景画像、SSR以上ならばキャラクタの背景画像を表示させていました。しかし、私がオブジェクトを追加してこの処理を真似て表示させようとすると背景と画像で表示範囲が合いませんでした。そちらの原因を調べていると背景とキャラクタの継承先が違く描画手段が違っていました。ならばと、背景抜きをするシェーダーを背景を薄暗くするシェーダーに書き換えて完成させようとしたのですがその途中で作業は中断してしまいました。なぜならば、今回のインターンの期日が来てしまったからです。

今回のインターンで一番悔やむことと言えば最後まで作業をやり抜けなかったことです。余裕を持って全ての作業を完成できなかったことが大変残念です。

 

総評

上記で書かなかったこと以外では、「Git」「アセットバンドル」について関われたこと、チーム制作を学校で行っていた身として会社の制作は経験として得られたこともデータ管理関係として深く理解が得られたと思います。課題2は完成までには至りませんでしたが、現場の作業を1つでも多く行い、最高でした!上記にある課題1を完成に至るまでの過程でのデータの取得、配置、効率化を考察してきたことと、課題2での失敗からのコード読解で処理の理解を深めることができたからです。

過程を理解して簡略化することにより、全ての作業効率をあげることができるのをここまでのインターン活動で深く知ることができました。今回の活動と今後行うインターン活動、普段の作業から成長した自分を9月にあるゲームジャムで証明していきたいと思います。

www.slideshare.net

 

成果報告資料(slideshareには代理で登録しています)

【LT会】Akatsuki Geek Live開催レポート!Vol.3

こんにちは、エンジニア採用担当の宮田です。

先日7/1(月)に学生向けLT会「Akatsuki Geek Live Vol.3」を開催いたしました!

2月・4月に次ぐ3度目の今回は、梅雨になり、ジメジメした天気が続く中、パッとしないお天気をカラッと晴らしてしまうぐらい、パワフルで大盛り上がりの会になりました!この記事ではそのイベントの様子をご紹介いたします。

 「Akatsuki Geek Live」とは...

学生エンジニアと、アカツキエンジニアが登壇するLT会です。今回は学生5名、アカツキメンバー5名の計10名が発表しました。その後、参加者全員で懇親会を実施し、交流の場を持ちました。

▼イベント概要はこちらから

aktsk.connpass.com

 ▼なぜLT会を開催しているのか

初回のレポートに開催の思いを綴っています。ご興味ある方はこちらもご覧ください

hackerslab.aktsk.jp

#当日の様子

序盤からTwitter上で知り合いだったけど顔を合わせたことがなかった人、学校が一緒でこのLT会でお互いの参加を知った人たちなど、思いがけない出会いが判明する中、今回もドリンクを片手にカジュアルな雰囲気で早速スタートです。

 

▼1人目:@きたばやしあでぃ(@tk_adio)さん(アカツキ)

「“はやく“開発するための開発速度のあげかた」

 トップバッターはアカツキから!スクラムマスターでもある金髪のあでぃが“はやく“開発するためのポイントを紹介してくれました。チーム開発のあるある話にみなさん頷いて聞き入っていました。

f:id:kayomiyata:20190704183714j:plain

 発表資料

www.slideshare.net

 

▼2人目:@梶原さん(アカツキ)

「Elixir におけるリスト反転処理の実装を覗いてみよう」

続いてもアカツキから。サーバサイドエンジニアの梶原さんが、アカツキでは初めてプロジェクトで使用に至ったElixirについて、紹介をしてくれました。

f:id:kayomiyata:20190704185429j:plain

 発表資料

speakerdeck.com

 

▼3人目:@大嶋さん(アカツキ)

「カジュアルゲームとチュートリアル 〜実はチュートリアルが一番複雑になってませんか? ちょっとの工夫で改善!〜」

続いてアカツキ大嶋さんによるピッチです。

来たる夏、ハッカソンやイベントでゲーム作りをする機会が増える時期だからこそ心がけたいポイントを伝授してくれました! 

f:id:kayomiyata:20190704192215j:plain

 発表資料(slideshareには代理で登録しています)

www.slideshare.net

 

 ▼4人目:@konnyaku256さん(学生)

「Hyperdashで機械学習モニタリングをやってみよう」

 満を持して、学生さんの登場です!konnyaku256さんが、デモも交えて機械学習におけるあるあるな問題をモニタリングで解決する方法について語ってくれました。

f:id:kayomiyata:20190704192904j:plain

登壇資料 

speakerdeck.com

 

▼5人目:@細川さん(アカツキ)

「CloudFormationと付き合い続けよう」

アカツキ新卒2年目の細川さんは、将来大規模システムに携わる際に役に立つ内容を実体験をもとに発表してくれました。

f:id:kayomiyata:20190705142620j:plain

 登壇資料

www.slideshare.net

 

▼6人目:@f4snさん(学生)

「オンラインゲーム救命救急」

学生枠2人目のF4snさんは、初めてのピッチとは思えないぐらい落ち着いて話をしてくれました!

f:id:kayomiyata:20190704194002j:plain

登壇資料

speakerdeck.com

 

▼7人目:@河野さん(アカツキ)

 「大規模Railsアプリケーションをバージョンアップするときのハマりどころ」

サーバサイドエンジニアの河野さんは、大規模プロジェクトに所属しているからこその苦労話をしてくれました。

f:id:kayomiyata:20190704194845j:plain

登壇資料(slideshareへは代理で登録しています) 

www.slideshare.net

 

▼8人目:@ぷらすさん(学生)

「5分で分かるClean Architecture」

ぷらすさんは、オススメ本やビジュアルも用いながらClean Architectureについてわかりやすく説明してくれました! 

f:id:kayomiyata:20190704195419j:plain

登壇資料

speakerdeck.com

 

▼9人目:@がっちょさん(学生)

「世界を創造するOSS開発を始めた話」

がっちょさんは、ご自身で開発したOSSライブラリについて、開発情報含め紹介してくれました!

f:id:kayomiyata:20190704195842j:plain

登壇資料

www.slideshare.net

 

▼10人目:@Dopponさん(学生)

「Slackをハックしよう」

ここで飛び入りでのピッチをやってくれる学生さんが!

トリを飾るのはDopponさんによる、Slackをハックしよう!という話です。

f:id:kayomiyata:20190704201946j:plain

登壇資料

speakerdeck.com

 

総勢10名による熱のこもったピッチはあっという間に過ぎ、懇親会へと移行します。

LT発表内容についての質問や、最近興味を持っている技術についてなど、話題に花が咲いていました。中には自分で作ったゲームを見せてくれる学生さんも。

f:id:kayomiyata:20190705210500j:plain

登壇者のみなさん、そして参加してくださったみなさん、本当にお疲れ様でした!

アカツキメンバーや学生同士の交流を通して、この時間がこの夏また一歩踏み出すきっかけとなっていたらとても嬉しいです。

夏を経てさらに成長した姿のみなさん、また新たに興味を持ってくださる学生さんと出会えることをいまから楽しみにしています!次回また会いましょう^^

f:id:kayomiyata:20190705213001j:plain

 

▼次回の開催は2019年秋頃予定!

 

インターンでCloud Runに挑戦した話

エンジニアインターンとして約1ヶ月アカツキで就業したyasuさんの体験記をお届けします。来年4月に入社予定のyasuさんですが、今回の経験で入社までの課題も見えてきた様です。

はじめまして、yasuといいます。
今回私はアカツキで内定者インターンに参加させて頂きました。
期間は1ヶ月ほどでしたが、色々と貴重な経験をさせて頂けたので具体的にどのようなことをしたのか紹介して行きたいと思います。

自己紹介

私は現在、大学で経営工学を学んでいる4年生です。
普段は趣味でGo言語を主に触っています。
Go言語で主にやっている事としては研究室のSlackボット開発や自分用のブログエンジンの開発、ハッカソンなどでネイティブアプリ用のAPIの開発などです。
最近はOSのカーネルやコンパイラなどソフトウェアの中でも低いレイヤーに位置する技術に興味があります。
新しいものが好きです。

きっかけ

きっかけは逆求人イベントでした。
逆求人に参加した際に会社訪問に誘われ、そのまま選考 => 内定 => インターン参加という流れです。
大学3年生のころに一度インターンに参加したことがあり、アカツキの技術に対する挑戦的な姿勢や「なぜ?」を大切にする社風、オフィスの快適さに惹かれてすぐに内定承諾とインターンに参加することを決めました。

何をしたのか?

今回は面接の際にお世話になった坂尾さんの所属するゲームの基盤開発チームでお世話になり以下の3つのタスクをこなしました。

  • 基盤の管理システムのCloud Run移行
  • 基盤の管理システムの操作ログのBigQueryからStackdriver Loggingへの移行
  • アプリケーション側でのIP制限機能の追加

今回利用したCloud Runについて

公式の説明ではRun stateless HTTP containers on a fully managed environment or in your own GKE cluster.と書かれています。
Google Cloud Next ’19で発表されました。
Knativeをベースにしたサービスで、オートスケールの機能やインフラ周りの設定の自動化などが特徴です。
Cloud Run ではContainer Imageさえあれば、その他の設定はほとんど自分でせずにデプロイできます。
公式ではCloud Buildを使ってContainer Imageをビルドしているので今回はCloud Buildも合わせて利用します。

基盤の管理システムのCloud Run移行

今回のインターンの大本のタスクです。
もともとGAE FEで動いていた基盤の管理システムをCloud Runへ移行します。
このタスクをこなすために次のフローを踏みました。

  1. アプリケーションのCloud Runでの動作確認
  2. Cloud Run へCircleCIでデプロイするようにする

アプリケーションのCloud Runでの動作確認

もともとGAE FEを使用していたので既にアプリケーションを動かすためのDockerfileが存在しました。
これをドキュメント通りにCloud Buildでimageをビルドしてgcloud beta run deployをするとすんなりとデプロイ出来ました。

また、GAE FE上でシステムを動かしていた際にはこちらのイメージを使っていたのですが、余計なパッケージを含まないようにDockerオフィシャルのPythonイメージを使うようにDockerfileを修正しました。

Cloud Run へCircleCIでデプロイするようにする

管理システムはCircleCIを使ってデプロイを自動化していたのでCircleCIのconfigファイルを修正する必要がありました。
具体的にはGAE FE向けに書かれていたconfigファイルをCloud Buildを使ってイメージをビルドし、Cloud Run へデプロイするように書き直す必要がありました。
gcloud build submitコマンドでイメージをビルドし、gcloud beta run deployコマンドを使ってCloud Run へデプロイするよう修正しました。

システム操作ログのStackdriver Loggingへの移行

管理システムの監査のための操作ログを、もともとは BigQuery に書き込んでいました。 これを Stackdriver Logging へ移行しました。
このタスクでは次の事を行いました。

  1. Cloud Run 上でStackdriver Logging の構造化ロギングが動くことの確認
  2. ログのデータ構造を定義する
  3. 構造化ログを吐くように操作ログのコードを修正する
  4. ログをRequestログと紐づけて表示できるようにする

Cloud Run 上でStackdriver Logging の構造化ロギングが動くことの確認

Cloud Run では 標準出力・標準エラー出力などにログを書き込むことで、 Stackdriver Logging に自動で集約されます。 またJSON文字列でログを書き込むことで Stackdriver Logging の LogEntry に jsonPayload として格納されます。
これを構造化ログと呼びます。
今回はこちらを使用して操作ログを記録することにしました。
参考 Using simple text vs structured JSON

print('{"sample": "hello"}')

実際に上記のようなJSON文字列でログを標準出力に吐くとLogEntryのjsonPayloadに入り、無事に構造化ロギングが動くことを確認できました。

ログのデータ構造を定義する

操作の際に送信されるパラメーターと送信元と送信者を特定するメタデータをログの構造としてまず定義します。 今回は操作ログなので操作内容と実際に操作しているユーザーのemailなどのメタデータをログのスキーマとして定義しました。

構造化ログを吐くように操作ログのコードを修正する

その定義していた構造通りにJSON文字列をログとして出力します。
今回はFlaskのapp.logger(python標準のloggingライブラリ)を使って標準エラー出力へJSON文字列を吐き出すようにしました。

ログをRequestログと紐づけて表示できるようにする。

Requestログとの紐づけは次の資料を参考にしました。

https://cloud.google.com/run/docs/logging#correlate-logs

In the Stackdriver logs viewer, logs correlated by the same trace are viewable in "parent-child" format: when you click on the triangle icon at the left of the request log, the container logs related to that request show up nested under the request log.

Container logs are not automatically correlated to request logs unless you use a Stackdriver Logging client library. If you want this correlation without using a client library, use a structured JSON log line that contains a trace field with the content of the incoming X-Cloud-Trace-Context header. Then your logs will be correctly correlated to the request log.

https://cloud.google.com/logging/docs/agent/configuration#special-fields

logging.googleapis.com/trace is stripped from jsonPayload and assigned to the LogEntry trace field. For example, assume the value of logging.googleapis.com/trace is [V]. [V] should be formatted as projects/[PROJECT-ID]/traces/[TRACE-ID], so it can be used by the Logs Viewer and the Trace Viewer to group log entries and display them in line with traces. If autoformat_stackdriver_trace is true and [V] matches the format of ResourceTrace traceId, the LogEntry trace field will have the value projects/[PROJECT-ID]/traces/[V].

飛んでくるRequestからHTTP HeaderにあるX-Cloud-Trace-Contextの値を取ってログとして吐くだけです。

ちなみにX-Cloud-Trace-Context
X-Cloud-Trace-Context: TRACE_ID/SPAN_ID;o=TRACE_TRUE
というフォーマットになっているので
/以下を取り除いてTRACE_IDだけ抽出する必要があります。
このTRACE_IDをログとして吐くJSONのlogging.googleapis.com/traceキーのバリューとして設定します。
そうするとLoggingエージェントが収集し、LogEntryのtraceフィールドに自動的にTRACE_IDを設定してくれます。
これでStackdriver Loggingでリクエストログと紐付き、まとまったログとして見る事ができます。

アプリケーションへのIP制限機能の追加

今回の基盤の管理システムは社内用ツールであるため社外からアクセス出来ないようにする必要がありました。
GAE FEではGAEのfirewallの機能でIP制限をしていたのですがCloud Runでは現時点でそのような機能が提供されていませんでした。
なので、今回はアプリケーションレイヤーでIP制限機能を実装することにしました。

最初は Flask の request.remote_addr の使用を試みてみたのですが、 Cloud Run にデプロイすると、これには Google Frontend の IP アドレスが設定されるということがわかりました。
X-Forwarded-For には Google Frontend がクライアントの IP アドレスを付与してくれていたため、こちらの IP アドレスを使用してアクセス制限機能を実装しました。

Cloud Run を実際に使ってみて

学習コストが低いので初学者でもすぐに始められて良いと感じました。
インフラ周り初心者の私でもすんなりデプロイできたのでの学習コストはかなり低いなと感じました。
また、デプロイをすれば設定など何もすることなくスケーリングなどのサーバー全般の管理をGoogleがやってくれるのでかなり便利だと感じました。

インターンで学んだこと

何をするにも なぜ? そうしたのか深堀ること。

インターン中一番改善しなきゃいけないと思った点はこれです。 どのタスクの際にも技術を理解せずに突き詰められていた事が多かったと思います。 例えばシェルスクリプトでShebangを使っているのにshコマンドを使っていたことがありました。

また、traceの設定の仕方もドキュメントを読めばしっかり書いてあるのに網羅的に読まなかったせいで見落としていたりしていました。 プルリクエストで詰めて頂いたおかげでかなり勉強になったので凄く感謝しています。 理解しないで実装するのは結局はバグや脆弱性を生み出し非効率なので一番自分が成長しなければならない部分だと感じました。

チーム開発でのコミュニケーションの大切さ

普段私はハッカソンや個人開発を主にしていたこともあり一人よがりな開発をしがちです。 そのせいで今回、妙に一人で抱え込んだりして余計に時間をかけたり心配をかけてしまったりしていました。 開発の効率にも関わる問題なので普段からのコミュニケーションも大切にしていきたいなと感じました。

良かったこと

新しい技術に挑戦できた!

他社でのインターンやバイトは自分のできる技術をベースにできることを任されることが多かったです。 しかし今回のインターンではCloud Runという発表されて間もない新しい技術を触らせて頂いた上にインフラ部分の移行を任されるという大きな課題に挑戦できたので他では体験出来ない有意義な経験が出来ました。 プルリクエストのコメントも議論が活発でそこから学べる事も沢山あったので凄く感謝しています。 今までのインターン経験上一番悩んで、一番楽しかった1ヶ月でした。

働きやすい環境が用意されている!

アカツキさんのオフィスではみんなが楽しんで仕事をしている雰囲気があり、オフィスも働きやすい設備(バリスタが常駐してたりとか休憩スペースが用意されてたりとか...etc)が整っていたので非常に働きやすかったです! 私の経験上一番働きやすい環境だと思いました。

最後に

2年前にアカツキでインターンをした際も感じたのですが、アカツキの働きやすさを改めて実感できた1ヶ月だったと思います。 インターン生が行うタスクに関しても他では経験できない裁量が与えられる非常に有意義なものでした。 また、今回のインターンで入社するまでのあと半年で解決すべき私自身の課題も見えてきたので半年後には進化した姿でまた戻ってこれるように精進したいです。 今回色々と見て頂いた坂尾さん、田中さん本当に感謝しています。

長々と書いてしまいましたが最後までお付き合い頂きありがとうございました!

インターンでミニゲームづくりに挑戦しました。

エンジニアインターンとして2週間アカツキで就業したkeiwさんの体験記をお届けします。ゲーム開発は経験があったものの、これまで触れてこなかったUnityでの開発。課題としてミニゲームづくりに挑戦してもらいましたが、どのような学びがあったのでしょうか。今回はその様子をご紹介します。

 

こんにちは、2週間ほどインターン生としてお邪魔させていただきましたkeiwです。

 

今回、2週間で、ちょうど企画フェーズにあったバッテイングセンターのミニゲームをインターンテーマとして挑戦させて頂きました。今後、ハチナイ開発チームによる改修などを経て実際ゲームに登場するかも、とのことですが、自分が作ったものの何割が残れるか楽しみです。

この記事では、そのインターン体験記的なことを書こうと思います。(拙い文章ですが、お付き合いください^^;)

 

以下、目次です。

 

 

インターン開始まで

インターン開始まであと1ヶ月のとき。UnityとC#、GitHubをさわってくるように言われました。ゲーム作りはそれまで、バンバンやってきたのですが、それらはノータッチ。やってきてねと言われたリストは一応一通り試したのですが、他の用事などもあって十分にはさわれず、不安しかありませんでした。

 

インターン開始!

不安(と期待もあった)を胸に始まった初めてのインターンでしたが、自分が配属されたチームは会社っぽいというよりは雰囲気は高校の部活という感じで、技術的な不安以外はだいぶ緩和されました。ほとんどの読者には伝わらないと思いますが、とくにアイスブレイク担当を指名する愉快な茶番は面白かったし、そのアイスブレイクの内容自体もけっこう面白かったです。スターウォーズ昼食会などもよかったです。

 

壁、壁、壁!

初めての事ばかりで、当然壁にもぶち当たりました。

まずは、技術的な問題。雰囲気はよかったものの、やはり技術的な不安は的中してしまいました。1か月前からある程度さわってきたとはいえ、ほとんど初心者のUnityやGitHub。けっこう苦戦しました。何よりもMacPCには準備期間もなく、最後まで慣れなかったですね。(普段使っているWindowsやUbuntuもデキるわけではないのですが^^;)

また、今まで個人で何本かゲームを作ってはいたのですが、企画もイラストもコードも全て一人でやってきて、ゲームの内部的なところを人にみてもらうのは初めて。特にプログラムは1か月後の自分が再び編集し始められる程度を目安に書いていたので、人に読んでもらうことを前提とした書き方はなかなか難しかったし、恥ずかしかったです。ただ、細かく丁寧にコメントをしてもらえ、恥ずかしさによる抵抗感はすぐに消えました。

 

成果報告(一応メイン)

先ほど述べた通り2週間でミニゲームをつくることになりました。
ボールが飛んでくる。タイミングよく打つ。飛距離がスコアになる。というバッティングセンターを模したシンプルなゲームをつくりました。以下にゲームの使用を簡単に説明し、できたゲームのスクショにコメントを添える形で成果報告とさせてもらいます。

簡単な仕様

初めて見た現場の仕様書。ちょっと感動しました。

かなり簡単に書くと、

 1:画面内にいるバッターのストライクゾーンめがけてボールが飛んでくる
 2:それを画面をスワイプすることで打ち返す
 3:スワイプのタイミングと位置に応じて飛距離(スコア)が決まる

というもの。これを10球1セットで遊びます。イメージ図もあり、非常にわかりやすく、また作る前からワクワクしてました。

簡単なフロー

下図のように状態遷移させることで実現させました。

f:id:aktsk_keiw:20190315141602p:plain

・「初期化1」

 10球ごとに初期化が必要なものの初期化

・「初期化2」

 1球ごとの初期化

・「準備OK?」

 ボールがいきなり投げられるのを防止。タップで「メイン」へ

・「メイン」

 高スコア目指してバッティング!
 スコア計算はスワイプ終了直後にされる

・「ヒット」

 バッティング成功したら、キャラのカットインが入り、
 スコアがカウントアップするシーンが入る

・「空振り」

 バッティング失敗。タップで「初期化2」に戻り、もう一度トライ!

・「結果」

 今回のスコアを表示。

・「最終結果」

 今回で最高スコアと今までの最高スコアを表示。

プレイ画面

f:id:aktsk_keiw:20190315143155p:plain

「メイン」の画面です。主に右下の赤い十字めがけてボールが飛んできますが、ボールは少しブレます。ボール到達直前に青い十字が出るので、出来るだけ近い位置で指を離そう!

f:id:aktsk_keiw:20190315143834p:plain

「ヒット」のカットインです。バッティングに成功すると見れます。さらにスコアによって効果音が変わります。

f:id:aktsk_keiw:20190315144038p:plain

「最終結果」です。記録更新を目指せ!

スコア計算

スコア計算に使う主な要素は3つで、その要素を掛け合わせることでスコアを決定しました。

・スワイプで指を離すタイミング

・スワイプで指を離す位置

・スワイプにかける時間

工夫・苦労した点

工夫・苦労した点はやはりスワイプの判定です。きちんとスワイプしたかどうかの判断は4つのチェックポイントを設け、順に通過させた場合のみ、きちんとバッティングしたと判断するようにしました。通過したチェックポイントは色を濃くするようにし、次回へのフィードバックができるように工夫してあります。

他にも指を離した位置に白い十字マーカーを置くことでも、失敗しても「次こそは」と思えるようにしてあります。

また、タイミングの判定が悪ければ、面白くならないどころか、理不尽さにイライラしてしまうだけので、タイミングの判定にも工夫をしました。スワイプを終了すべき正しいタイミングを把握するために、発射されたボールの位置を把握してストライクゾーンをいつ通過したのかを把握するのではなく、ボールがストライクゾーンに到達するまでの時間を変数でおき、その変数に応じてボールを動かす感じ(変数が0の時がストライクゾーン通過中)で、正確なスワイプを終了すべきタイミングを得ました。

 

成果報告は以上です。

慣れないツールで、2週間は短かった。やり足りない部分もありますが、自分自身ワクワクしながらでき、先日の簡単なお披露目会では楽しそうにやってもらえたので、おおよそ満足。

 

反省・その他

初めての場所で初めての事ばかりで緊張しまくりの状態。集中したらちょっと周りが見えなくなる性格もあいまって、雑談とかはあまりできなかった。ちょっともったいなかったなぁ。


今後、同じようなインターンを受ける場合、ただ絵を画面に表示させるだけなどの何もしない状態でも実機で試すまでの一連の流れを3日目くらいまでにやるべきだったかなぁと。

色々とギリギリだった今回のインターン、デザイナーさんに絵素材をお願いする機会もあったのですが、背景絵を翌日にもらえないかと無茶な依頼もしました。でも、翌日にはハイクオリティの絵素材が! 感謝するとともになんか感動してしまいました。

 

最後に

サポートしてくれたメンターさんをはじめとする野球チームの皆さんや、人事・総務の皆さん、非常に濃密な2週間をありがとうございました。

初めてのインターンがここでよかったです!