Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Game Development Tutorial 2021

Game Development Tutorial 2021

We held Game Development Tutorial 2021, a training course for newly-graduated engineers in mixi, Inc., on April 22.
This slide is mainly the advanced part of the course.
In this section, the students learn how networking games work, through customizing a simple networking game by using Photon Unity Networking (PUN).
GitHub repository including the Unity projects of this course is here.

About our training courses, please visit here.

YuukiARIA

May 10, 2021
Tweet

More Decks by YuukiARIA

Other Decks in Technology

Transcript

  1. 本日の予定 ▪ 10:30-11:00 イントロダクション ▪ 11:00-13:00 基礎編(岡本さん) ▪ 13:00-14:00 お昼休憩

    ▪ 14:00-17:30 実践編(信夫) ▪ 17:30-18:30 社員講演(井本さん、田那辺さん、本間さん)
  2. 私は誰 開発本部CTO室 Yuuki Shinobu / YuukiARIA 2014年新卒入社 ▪ モンストサーバエンジニア ▪

    ブラナイリードサーバエンジニア ▪ 新規ゲームクライアント・サーバエンジニア ▪ その他色々…
  3. メンバー紹介 ▪ 信夫 裕貴(yuki.shinobu) – 14新卒 開発本部CTO室 ▪ 田那辺 輝(akira.tanabe)

    – 開発本部CTO室 ▪ 岡本 勇太(yuta.okamoto) – 18新卒 モンストクライアントG ▪ 佐々木 智崇(tomotaka.sasaki) – 20新卒 モンストクライアントG ▪ 篠崎 瑞樹(mizuki.shinozaki) – 20新卒 モンストクライアントG ▪ 井本 大登(imo) – モンスト事業本部 MSスピンオフゲーム事業部 ドリアンG エンジニアリングT ▪ 本間 心(makoto.homma) – 20卒 開発本部CTO室
  4. 本日の研修を受けるにあたって ▪ 本日はUnityの基本的な使い方とゲーム開発の基礎を扱います ▪ また、Photon Engine によるネットワーク同期を使用するゲームも扱い、マルチプレ イの基本的な仕組みにも触れます ▪ ゲームクライアントエンジニアではない人も、ゲーム開発の世界観を感じ取れればと

    思います ▪ 非ゲームでの応用や、ゲームのサーバエンジニアとしてクライアントエンジニアとや り取りする上で、言葉や要素が分かることは全体を見渡す助けになります ▪ ぜひ楽しんでください!
  5. マルチプレイ実現技術 ▪ Photon Engine ▪ Monobit Engine ▪ MLAPI ▪

    Unity NetCode ▪ gRPC, WebSocket, MagicOnion, ... ▪ ちなみにモンストは… – TURN (RFC5766) をリレーサーバとするHost/Guestクライアント型の構造
  6. マルチプレイ実現技術 ▪ Photon Engine ▪ Monobit Engine ▪ MLAPI ▪

    Unity NetCode ▪ gRPC, WebSocket, MagicOnion, ... ▪ ちなみにモンストは… – TURN (RFC5766) をリレーサーバとするHost/Guestクライアント型の構造 今回の研修ではこちらを扱います
  7. [準備] Photon AppID の設定 ▪ メニュー [Window]>[Photon Unity Networking]>[Highlight Server

    Settings] を選択 – または Assets/Photon/PhotonUnityNetworking/Resources/PhotonServerSettings アセットを選択 ▪ App Id PUN に配布された Photon App Id を入力 – 新卒以外の方はご自身でPhotonアカウントを作成(無料)し、AppIDを取得して ください – https://doc.photonengine.com/ja-jp/realtime/current/getting-started/obtain-your-app-id
  8. Photonサーバの構成 ▪ マッチメイキングを行う Master Server – ルーム一覧取得や条件マッチング、Game Server へのルーティング ▪

    実際にクライアント間でやり取りする Game Server – 情報の保持と通信の中継、カスタムゲームロジック Master Server Lobby Game Server Game Server Game Server Room Room Room
  9. ビルド・実行方法 ▪ メニュー [ビルド]>[PhotonTutorialをビルドして実行] を選択 ▪ メニュー [ビルド]>[ビルドフォルダを開く] を選択するとビルド成果物のフォルダを 開きます

    ▪ mac でアプリケーションを複数起動したい場合、ターミナル上で以下のコマンドを実 行します – ビルドしたアプリケーションとUnityエディタ間でも通信に支障ありません open -n RingCrisis/Builds/PhotonTutorial/PhotonTutorial.app
  10. [PT0] クリック座標を送信するRPCの作成 ▪ 左クリックの検知 – Input.GetMouseButtonDown(0) – 座標の取得は Input.mousePosition プロパティ

    – Update メソッドの中でチェックしよう ▪ RPCの作成 – Vector3 の引数をもつメソッドを定義 – PunRPC 属性をつける – サンプルのように送信者のニックネームなどを追加してもよい ▪ RPCの送信 – サンプルと同様に _photonView.RPC を使う ▪ 接続状態、ルーム入室状態をチェックする – PhotonNetwork.InRoom を条件に加えよう
  11. [PT0] クリック座標を送信するRPCの作成 [PunRPC] private void NotifyClick(string sender, Vector3 position) {

    AppendLog($"{sender}> {position}"); } private void Update() { if (PhotonNetwork.InRoom && Input.GetMouseButtonDown(0)) { var sender = PhotonNetwork.NickName; var position = Input.mousePosition; _photonView.RPC("NotifyClick", RpcTarget.AllViaServer, sender, position); } }
  12. [PT1] クリックした位置にマーカーを表示 ▪ PT0の内容を拡張し、受け取った座標にマーカー画像を表示してみましょう – Canvas の下にマーカー用の Image を作成 –

    PhotonTutorial からマーカー用オブジェクトの Transform を参照 – マーカー用オブジェクトの Transform の position を受け取った座標で更新 ▪ マーカー画像は Assets/PhotonTutorial/Sprites/cursor を使ってください
  13. PhotonViewについて ▪ ネットワーク越しにオブジェクトを同期するための基本的なコンポーネント – https://doc.photonengine.com/ja-jp/pun/v1/getting-started/feature- overview#00g284n2rn1tuqq6 ▪ RPC以外にも、オブジェクトの状態を監視して自動的に同期する仕組みなど、あまり コードを書かなくても動く便利な仕組みもあります –

    Observed Components とある部分 – OnPhotonSerializeView といったメソッドでシリアライズだけ定義すればよい ▪ オブジェクトの状態ではなくイベント系の通知などはRPCの方が向いている – リバーシや将棋などで駒を打つときなど ▪ この研修では、通信のやり取りが見えやすいRPCのみを使って実装していきます – 興味のある方は PhotonTransformView など便利なコンポーネントについても調べ てみてください
  14. [RC1] 軌道ガイドを正しく実装する ▪ 上 (+Y) 方向の初速度 VelocityY – 定数として private

    static readonly で定義してあります ▪ 下 (-Y) 方向への重力加速度 9.8f – 即値で使っても定数定義してもよいです ▪ 水平(XZ平面)方向へは等速直線運動 – 速度ベクトルが引数 velocityXZ で渡されます ▪ 球のインデックス番号 0 ≦ i < n ▪ ヒント – まず y = 0 から発射して、再び y = 0(着地)するのにかかる時間を求めよう
  15. [RC1] 軌道ガイドを正しく実装する 𝑦 = 𝑣𝑦 𝑡 − 1 2 𝑔𝑡2

    d = v𝑥𝑧 𝑡 𝑡𝑖 = 𝑖 𝑛 − 1 ∙ 𝑡max 時刻 t における y 座標 時刻 t における x, z 座標(ベクトル) 球 i に対応する時刻 ti
  16. [RC2] ターゲットをランダム位置に生成する ▪ 最初に1つだけ原点に生成されている ▪ ランダムな位置に生成するように変更しよう ▪ でもYは0にしよう ▪ UnityEngine.Randomクラスを使おう

    – https://docs.unity3d.com/ja/current/ScriptReference/Random.html – Rangeメソッドには引数がint/floatのオーバーロードが存在するので注意!
  17. [RC4] ターゲットを一定時間で消滅させる ▪ ターゲットが無限に増えていく ▪ このままではまずいので、一定時間経過したらターゲットは消滅するようにしよう ▪ 実は Ring はすでに一定時間で自然消滅するようになっている

    ▪ 同様の実装をターゲットに対しても実装しよう ▪ オブジェクトの削除は Destroy メソッドを使います – Destroy(gameObject) ではなく Destroy(this) とするとどうなるでしょうか – 理由も考えてみてください
  18. 他にも ▪ プロジェクト内にはまだ説明しきれていない要素も盛り込んであります – シェーダー – エフェクト – エディタ拡張(ビルドのメニュー) ▪

    いろいろ観察したりいじったりしてみてください ▪ 今回は基礎的な内容にフォーカスしましたが、それぞれの要素ごとにもう少し発展的 な講習を実施するかも知れません ▪ Unity Engine Challenge というイベントもやっています
  19. おわりに ▪ 本日の研修で扱った内容はまだまだごく一部です – サウンド、アニメーション、AssetBundle、… ▪ Unityマニュアルや書籍などを活用することで更に様々な機能を知ることができます – https://docs.unity3d.com/ja/current/Manual/UnityManual.html ▪

    社内にも多くのUnityエンジニアがおり、社内外に情報を発信しています – まずはdocbaseを眺めてみると良いでしょう ▪ ぜひゲームを作ったり、またゲーム以外でも映像やコンテンツ生成など、様々に活用 してみてください
  20. 研修後の Photon AppID について ▪ 新卒の皆さんに配布した AppID は研修担当側のPhotonアカウント上で作成したものに なります ▪

    研修終了後はすみやかに削除するので、引き続きPhotonを使用したい場合はご自身で Photonアカウントを作成してください
  21. Staff Credits Developer Relations Koji Kita Engineers Yuuki Shinobu Yuta

    Okamoto Akira Tanabe Hiroto Imoto Mizuki Shinozaki Tomotaka Sasaki Makoto Homma And you...