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

ゲーム開発研修(ハンズオン学習編)【ミクシィ22新卒技術研修】

MIXI ENGINEERS
April 25, 2022
31k

 ゲーム開発研修(ハンズオン学習編)【ミクシィ22新卒技術研修】

22新卒技術研修で実施したゲーム開発研修の講義資料(ハンズオン学習編)です。
動画:https://youtu.be/7kt4mso5qUc

※こちらの資料のハンズオン用リポジトリは公開していないので、ハンズオンを実際に試していただくことはできません。

<< ゲーム開発研修資料一覧 >>
イントロダクション
https://speakerdeck.com/mixi_engineers/2022-game-development-training-number-00-introduction

Unity基礎編
https://speakerdeck.com/mixi_engineers/2022-game-development-training-number-01-quaternion

Photon編
https://speakerdeck.com/mixi_engineers/2022-game-development-training-number-02-photon

ハンズオン学習編
https://speakerdeck.com/mixi_engineers/2022-game-development-training-number-03-hands-on-study

ハンズオン実践編
https://speakerdeck.com/mixi_engineers/2022-game-development-training-number-04-hands-on-practice

プログラミング教育LT編
https://speakerdeck.com/mixi_engineers/2022-game-development-training-number-05-lt

C#ハンドブック編
https://speakerdeck.com/mixi_engineers/2022-game-development-training-number-06-handbook-c-number

VS Codeセットアップ編
https://speakerdeck.com/mixi_engineers/2022-game-development-training-number-07-vs-code-setup

Unity実装テクニック編
https://speakerdeck.com/mixi_engineers/2022-game-development-training-number-08-unity-technic

アイテム取得課題 成功例
https://speakerdeck.com/mixi_engineers/2022-game-development-training-number-09-survival-athletic-answer

MIXI ENGINEERS

April 25, 2022
Tweet

More Decks by MIXI ENGINEERS

Transcript

  1. ジャンルによる制 約の違い 1. シミュレーション系:育成/防衛/ ADV/都市開発 a. 同期方法:(主に)HTTPサーバー b. 通信頻度:少(定点、タイマー)/同期精度:低くていい(アクション時に最新ならいい) c.

    データコスト:計算量/データ量は比較的大きくていい d. マッチング:不要/データサーバー単位/データサーバー内の全ユーザーにアクセス可能 2. ターン制:麻雀将棋囲碁トランプ/個人技スポーツ/ビリヤード/ a. 同期方法:(主に)リレーサーバー b. 通信頻度:少(アクション毎にリレー)/同期精度:低くていい(ターン切り替わり時に最新ならいい) c. データコスト:サーバーロジックは原則使用できない/データ量は少 d. マッチング:マッチングサーバーでグループ作成 3. バトル・アスレチックアクション:対戦スポーツ/対戦アクション/アスレチック a. 同期方法:(主に)リレーサーバー/ゲームサーバー(次項) b. 通信頻度:高(秒間n回)/同期精度:高(常時同期) c. データコスト:より小さい/1パケットサイズ以下( MTU=パケットサイズ、ヘッダー込み 1パケット 1500 bytes ) d. マッチング:マッチングサーバーでグループ作成( Unityでは、PhotonCloudで 8 人推奨、その他でも 64 人程度) 4. MMO・メタバース:<ここは専門ではないので省略> a. 同期方法:ゲームサーバー b. データコスト:より小さい/1パケットサイズ以下 c. マッチング:不要/データサーバー単位/データサーバー内の全ユーザーにアクセス可能
  2. 一般的な ゲームサーバーの 役割 1. HTTPサーバー a. 計算をサーバーで行い不正を排除 b. 他者と同期するデータが中央集権 2.

    リレーサーバー a. 接続ユーザー間での単純データ受け流し b. 原則はサーバーロジックなし 3. ゲームサーバー a. (近年あえてHTTPサーバーと区別している) b. クライアント処理相当の計算判定をサーバー側で一任し中央集権 (不可視で全ユーザー分) c. 計算をサーバーで行い不正を排除 d. UnityではBuldSettingに「ServerBuild」チェックがある e. コストは爆上がりするが同期性能と不正排除の銀の弾丸 4. マッチングサーバー a. リレーサーバー・ゲームサーバーの場合使用
  3. Photonの CustomProperty の活用 1. 活用例 a. 小さな共有データストレージとしての利用 b. update properties通知の同期イベントとしての利用

    c. propertiesListedInLobbyを用いたルーム参加前の概要情報として の利用 i. 全ての例> stage設定、stage進捗情報、userバフ、user テータス 、参加者list 2. Code a. PhotonPlayer i. Hashtable CustomProperties [get] /PhotonPlayer.SetCustomPropertiesから設定 b. RoomInfo i. Hashtable CustomProperties [get] /Room.SetCustomPropertiesから設定 ii. string [] propertiesListedInLobby
  4. Photonの InterestGroup の活用 1. 活用例 a. 並列する個別グループチャット b. エリア/シーン別同期情報の分割 c.

    個別通信 2. Code a. PhotonNetwork.SetInterestGroups() i. 傍受グループIDの指定(複数指定可、 0は未指定全域) ii. PhotonNetwork.Instantiate() / group引数で指定 iii. PhotonNetwork.RaiseEvent() /sendoption引数で指定
  5. Unityの scene活用 1. 活用例 a. フィールド環境objectをmain scene、gamesystem / ui をそれぞれ追加

    scene Loadして合成する i. フィールドsceneを別々に設け単独 Loadではgamesystem component を均一の状態に維持できない ii. componentの付与仕様が不要なため分業し専念しやすくなる iii. 別のunity project /maya projectでasset作成importしやすくなる iv. OccousionやBakeLightingまわりが参照できる(後述) 2. Code a. using UnityEngine.SceneManagement; i. SceneManager.LoadSceneAsync(name, LoadSceneMode.Single) ii. SceneManager.LoadSceneAsync(name, LoadSceneMode.Additive) 3. Hierarchy以外の情報/MainScene時に参照 a. Lighting(LightSetting/Enviroment/BakedLightmap) b. Occlusion Culling(不可視領域を演算しない処理) c. など
  6. ifdef (イフデフ) の活用 1. 条件コンパイル( ifdef、#define #if )を積極的に活用する a. Platform別処理(win/mac/android/ios/webgl)

    b. DevelopBuild用処理/Releaseビルドから開発機能排除 c. 同リポジトリ(バージョン)で複数種別 Build出力 i. 商用機能付加・削減版/過去機能の置き換え/
  7. bit演算 結構使う 1. 確認 a. 1 << 0 // 1

       0000 0001 (byte) b. 1 << 1 // 2    0000 0010 (byte) c. 1 << 2 // 4    0000 0100 (byte) d. 1 << 3 // 8    0000 1000 (byte) e. 1 << 4 // 16    0001 0000 (byte) f. 1 << 5 // 32    0010 0000 (byte) g. 1 << 6 // 64    0100 0000 (byte) h. 1 << 7 // 128    1000 0000 (byte) i. 1 << 8 // 256 0001 0000 0000 (short) … j. 1<<15 // 32,768 1000 0000 0000 0000 (int) 2. Unityの (int) layermask の指定 a. 対象のみ LayerMask layerMask = 1 << LayerMask.NameToLayer("layer 1"); // 左シフト b. 対象以外 LayerMask layerMask = ~(1 << LayerMask.NameToLayer("layer 1") ); // 反転 c. and  LayerMask layerMask = 1 << 0 | 1 << 1; 3. enumの[Flags]attribute付加+enum値bit指定によってbit化し複数選択Statusを簡単に作る
  8. テクニック集 (別紙 Unityテクニック集.pdf にて) 1. 距離の測り方 2. 対象への振り向き方 3. 対象から見た固定位置の取り方

    4. 速度の保ち方 5. 遅延追従 6. クリック2D座標の3D座標変換 7. 3d座標の2D座標変換 8. 2つの3Dオブジェクトをカメラ表示領域に自動で納めるカメラviewport.rect 9. エディタ拡張、スライダー、テキストエリア、インスペクター変更、ウィンドウ 作成 10. ランパラメータの取り出しコンテキストメニュー 11. テキスト保存 12. エディタ拡張