本記事の目的
サーバーエンジニアになってから、今の自分なら今までよりもUnityエンジニアとして活躍できそうだと感じています。
そこでUnityエンジニアがサーバーサイドを学ぶことによって得られるメリットを共有することで、独学等でサーバーに挑戦する人が増えたらいいなと思います。
自己紹介
新卒3年目
今までずっとUnityエンジニア
サーバーエンジニア歴約半年
今使用してる言語はGo
サーバーエンジニアになってからはインフラとかもいろいろやってはいましたが、本記事では主に「クライアントから叩かれるAPIを実装した経験」をもとに書いていきます。
テストコードが書けるようになった。
Unityの開発では、コードが書けた後は再生を押して実際にゲーム画面で正常動作をするかを確認することができます。
しかし、サーバーの開発では再生ボタンはないためテストコードを書くことで品質を担保します。
具体的には
「Aという入力に対してBが帰ってきたら成功」
「このリクエストがきてDBにxxが保存されてたら成功」
といったふうなテストを書きます。
そしてこのテストは実はUnity側でもやることができます。
やり方は以下です。
Editorフォルダ以下にC# Test Scriptを作成
using System.Collections;
using System.Collections.Generic;
using NUnit.Framework;
using UnityEngine;
using UnityEngine.TestTools;
namespace Tests
{
public class NewTestScript
{
[Test]
public void NewTestScriptSimplePasses()
{
Assert.AreEqual(2, 1 + 1);
}
}
}
サンプルとして上記のように記述
Test RunnerのWindowを開く。PlayMode ではなく EditMode。
対象の関数をダブルクリックするとテストが実行される。緑のチェックがついたら成功
で、このテストをUnity側でやることで以下のメリットが得られると思っています。
- テストが書けるようにコードを書くようになる(綺麗なコードじゃないとテスト書けない)
- ドキュメントの代わりになる
- 品質が担保できる
サーバーサイドの開発をやることで、「テストを書く癖」と「テストが書けるようなコードを書く癖」がついたので以前よりもいわゆるテスタビリティ高めのコードが書けるようになりました。
複数人で作業するときに自分の書いたコードのテストを書いておくと、他の人が見たときに理解がしやすいんじゃないかと思います!
疎結合な設計のノウハウが得られた。
私は綺麗な実装をするために「クリーンアーキテクチャ」や「DDD」を学習し、それをUnityでの開発に落としこもうとしていました。しかし、私にはゲーム開発においてオニオンアーキテクチャのように「一番上位となるレイヤがEntityとなるように設計する」というのが具体的にどう書けばいいのかが全然わかりませんでした。
サーバーのAPIはクライアントの開発よりもシンプルでした。そのため、ビューとロジック、そしてインフラを明確に分けることができ、ビューとインフラに依存しないドメイン層を実装することができました。
サーバー側で設計の成功体験を積むことができたおかげで自信がつきました。今はUnityエンジニアではないため実際にどうなるかはわかりませんが今までよりもドメインの分離がうまくできると思います。
ツール作りの選択肢が増える
以前はツール作るときはほぼUnityEditor一択でした。しかし、サーバーエンジニアになってターミナルに触れる機会が増えシェルやライブラリを以前より使うことができるようになりました。
以前コード生成のツールをEditorWindowで作ったことがありましたが、最近また別のコード生成機能を今度はコマンドで叩いて生成するように作っています。
黒い画面は怖くない!
まとめ
こういう記事は技術系の記事より書くの難しいですね…。
上記の書いたこと以外にも当然ながらサーバーまわりの知識を得ることができたりとか、新しい開発を行うときの全体の工数が分かるようになる、サーバーエンジニアのタスク管理ができるようになる等Unityエンジニアがサーバーを学ぶメリットは多くあります。機会があればぜひ挑戦してみてください!