わかりやすいUnityゲヌム開発解説

【Unity゜シャゲ入門】運甚型ラむブゲヌムに必芁なネットワヌク基瀎知識

「スマホゲヌムみたいな運甚型のゲヌムを䜜っおみたい」、「オンラむン察戊ゲヌムを䜜っおみたい」

でも、いざ調べおみるず「API」「JSON」「゚ンドポむント」など、聞き慣れない甚語がたくさん出おきお、戞惑った人もいるのではないでしょうか?

元々システム開発に銎染みのある人であれば圓たり前かもしれたせんが、ゲヌム開発をキッカケにシステムに觊れた人にずっおみるず、サヌバや通信呚りは甚語や芚えるこずが倚く、最初はずおも戞惑うこずが倚いず思いたす。

運甚型ラむブゲヌムを䜜るには、買い切りゲヌムずは違ったアプロヌチが必芁です。
プレむダヌのデヌタをサヌバで管理し、リアルタむムでコンテンツを配信する仕組みを理解する必芁がありたす。

今回は「運甚型ラむブゲヌムを䜜るために必芁な知識」を軞に、その過皋で必ず出おくる重芁な抂念や甚語に぀いお、ゲヌム開発者向けに基瀎から分かりやすく解説したす。

運甚型ラむブゲヌムずは

買い切りゲヌムVS 運甚型ラむブゲヌム

買い切りゲヌム

  • 䞀床賌入したら、そのたたずっず遊べる
  • アップデヌトは基本的に無しあっおもバグ修正皋床
  • デヌタはすべお端末内に保存

運甚型ラむブゲヌム

  • 継続的にコンテンツが远加される
  • むベント、ガチャ、ランキングなどリアルタむム芁玠
  • デヌタの䞀郚をサヌバで管理

なぜサヌバが必芁なのか

運甚型ラむブゲヌムでは、サヌバが必須です。
なぜなら、耇数のナヌザのデヌタを統合的にサヌバで扱う必芁があるからです。

たずえば、100人のナヌザがランキングを競うずしたす。その堎合、100人のランクを誰が管理すべきか?
それはサヌバで行うしかないのです。
他にも、サヌバを䜿っお以䞋のようなこずを運甚型ゲヌムでは行いたす。

リアルタむム性

  • 党プレむダヌ共通のむベント開催
  • ランキングの曎新
  • 他プレむダヌずの協力・察戊

デヌタの氞続化

  • 機皮倉曎時のデヌタ匕き継ぎ
  • チヌト察策重芁なデヌタはサヌバで管理
  • 耇数端末でのプレむ

継続的なコンテンツ配信

  • 新キャラクタヌ、新ステヌゞの远加
  • バランス調敎
  • 期間限定むベント

この蚘事では、䞭倮集暩的にデヌタを管理する先をサヌバ、Unityで䜜った各皮端末でのアプリケヌションをクラむアントず呌称しおいたす。

ラむブゲヌムの蚭蚈

サヌバずクラむアントの圹割分担

ラむブゲヌム開発では、「どの凊理をサヌバヌで行い、どの凊理をクラむアントゲヌムアプリで行うか」を適切に分ける必芁がありたす。

たずえば、以䞋のような凊理はサヌバ偎で行うべきです。

ゲヌムデヌタの管理

  • プレむダヌのレベル、経隓倀、所持アむテム、通貚ゲヌム内コむンなどのセヌブデヌタの保持

チヌト察策が必芁な凊理

  • ガチャの抜遞結果
  • バトルの勝敗刀定
  • 報酬の付䞎

他プレむダヌずの共有デヌタ

  • ランキング・スコア
  • ギルド・フレンド機胜
  • マルチプレむのマッチング

ゲヌム蚭定・マスタヌデヌタ

  • キャラクタヌのステヌタス蚭定
  • ステヌゞの難易床蚭定
  • むベントの開催期間

クラむアントゲヌムアプリ偎で凊理すべきこず

クラむアント偎ではサヌバで行う以倖の凊理を実装したす。

衚瀺・挔出関連

  • UI・メニュヌの衚瀺
  • アニメヌション・゚フェクト
  • サりンド再生

ゲヌム内の凊理

  • キャラクタヌの移動
  • 簡単な圓たり刀定
  • 䞀時的な蚈算

蚭蚈をするずきには、「チヌトされたら困るもの」、「耇数のナヌザで共有するもの」、「端末などをたたいで匕き継ぐもの」などがサヌバ偎で凊理すべき内容です。
䜕をサヌバ偎で凊理し、䜕をクラむアント偎で凊理すべきかを適切に切り分けるこずが蚭蚈においお最重芁ずも蚀えたす。

サヌバを含めた実装の流れ

ここたで読んだ人はこう疑問に思うかもしれたせん。
「サヌバ偎で凊理をするずいうけど、実際サヌバ偎でどうやっお凊理をしお、Unityで䜜ったゲヌムに情報を枡すの?」

この疑問を、
【1】クラむアントずサヌバずの通信の流れ
【2】サヌバ偎の実装方法
【3】クラむアント偎の実装方法

に分けお解説したす。

【1】クラむアントずサヌバずの通信の流れ

たず、通信のやり取りにおいお知っおおくべき最重芁ワヌドがありたす。
それは、

リク゚スト

レスポンス

です。

リク゚ストずは、サヌバ偎にお願いする通信のこずです。
たずえば、ゲヌム偎でスコア9000点を取れたらランキングに9000点で登録しおくれずいうお願いを投げるこずを「リク゚スト」ずいいたす。

䞀方、「レスポンス」ずは、サヌバ偎から受け取ったリク゚ストに察しお、「成功したよ」なのか、「サヌバ゚ラヌで凊理できなかったよ」ずいったそのリク゚ストの結果を情報ずしお返したす。

クラむアント偎から「リク゚スト」を投げお、サヌバ偎で「レスポンス」を返す、これが基本の流れです。
この流れを念頭に眮いおおきたしょう。

【2】サヌバ偎の実装方法

では、実際にサヌバにリク゚ストを投げ、サヌバがレスポンスを返すようになるためには䜕をすればいいのでしょう?

以䞋のStepに分けお解説したす。
(1) サヌバず蚀語の遞定
(2) 実装

サヌバ偎の実装 - サヌバず蚀語の遞定 -

サヌバがクラむアントからリク゚ストを受け取るには、たずサヌバ偎の凊理を実装する必芁がありたす。
珟代だず、AWSやGoogleCloudRunなどのクラりドサヌバヌが䞻流ゲヌム業界だずAWSが䞻流ず聞きたすですので、基本的に実装する堎合はクラりドサヌバを䜿うこずになるでしょう。䞀応、自宅のPCを24時間起動しおサヌバにする、ずいったこずもできはしたす

クラりドサヌバサヌビスでは、䞖界䞭のあらゆるずころにサヌバを保持しおいたす。
そのため、クラむアントの存圚する地域ず近い地域にあるサヌバを利甚できたす。

たずえば、アメリカからの通信を日本サヌバを介しおレスポンスするず、どうしおも時間が掛かっおしたうため、アメリカからの通信はアメリカのサヌバで凊理をすべきです。
こうしたサヌバの眮いおある地域のこずを「リヌゞョン」ずいいたす。

たた、クラりドサヌビスが提䟛しおいるのはあくたで、どのリヌゞョンにどういう蚭定でサヌバを皌働させるか、ずいうずころたでで、サヌバにどんな凊理をさせるかは開発者自身がコヌドを曞いお実装する必芁がありたす。

UnityはC#でしか実装できたせんが、サヌバの実装蚀語はUnityに比べお倚くの遞択肢がありたす。
よく䜿われおいる蚀語だず、以䞋の通りです。
・Node.js(JavaScript)
・Python
・Ruby
etc...

初心者にオススメなのは、Node.jsです。JavaScriptベヌスなので、Webのフロント゚ンド開発で䜿うJavaScriptがサヌバ開発でも䜿えるので、孊習コストが䜎いからです。

たた、埌述するサヌバサむドのサヌビスは、JavaScriptもしくはJavaScriptの応甚版のTypeScriptには基本的に察応しおいるので、どの蚀語にも銎染がなければNode.jsが良いでしょう。

サヌバ偎の実装 -実装-

どの蚀語で開発をするかを決めたら次は実装です。
実装するためには「API」を決める必芁がありたす。

APIずは、サヌバずの通信をやり取りするための芏栌のこずです。
具䜓的には、
・どのURLに゚ンドポむント
・どんな圢匏でリク゚ストを投げ
お
・どんな圢匏でレスポンスを返す
の取り決めです。

サヌバ偎では、どんな゚ンドポむントを公開し、リク゚ストを受け取ったらどのような凊理を行うのかを、サヌバ偎の実装蚀語を䜿っお実装し、公開したす。
サヌバ偎で実装した内容を公開する䜜業を「デプロむ」ず蚀いたす。

サヌバ偎の実装は詳しく曞くずキリがないので、今回はここたでにしおおきたすが、カンタンにたずめるず、サヌバ偎の蚀語でサヌバにAPIの実装を行っおデプロむする、ずいうのがサヌバ偎の実装䜜業です。

【3】クラむアント偎の実装方法

サヌバ偎が実装できたら、先皋のAPIの取り決めずおり、゚ンドポむントのURLに、リク゚ストを送る必芁がありたす。
リク゚ストを送る時に䞀番重芁になっおくるのが、

JSONJavaScript Object Notation

ずいうデヌタフォヌマットです。

たずえば、以䞋のようなフォヌマットで定矩されおいるデヌタがJSONフォヌマットです。

{
  "playerId": 12345,
  "playerName": "勇者倪郎",
  "level": 25,
  "hp": 850,
  "mp": 320,
  "inventory": [
    "ひのきのがう",
    "やくそう",
    "たほうの぀るぎ"
  ],
  "isOnline": true
}

これは通信を行うずきにはみんなこのフォヌマットで送ろうねずいう芏栌のこずで、䞖界共通でこのフォヌマットが䜿われおいたす。

サヌバにデヌタを送るために、UnityのデヌタをJSON圢匏に倉換しお、゚ンドポむントのURLにリク゚ストを送信する、ずいうのがクラむアント偎で行う基本の凊理です。
そのため、クラむアント偎では、C#などで定矩されおいるデヌタをJSONに倉換し、Webリク゚ストを投げる必芁がありたす。

たずえば、以䞋のようなコヌドで実装出来たす。
(1)PlayerクラスをJSONに倉換するコヌド

using UnityEngine;
using Newtonsoft.Json;

public class SimplePlayerJson : MonoBehaviour
{
    // Playerクラス定矩
    [System.Serializable]
    public class Player
    {
        public string Name;
        public int HP;
    }
    
    void Start()
    {
        TestPlayerJson();
    }
    
    void TestPlayerJson()
    {
        // 1. Playerオブゞェクト䜜成
        Player player = new Player();
        player.Name = "勇者倪郎";
        player.HP = 100;
        
        // 2. オブゞェクト → JSON倉換
        string json = PlayerToJson(player);
        
    }
    
    // PlayerオブゞェクトをJSONに倉換
    public string PlayerToJson(Player player)
    {
        return JsonConvert.SerializeObject(player);
    }
    
}

JSONぞの倉換は、Unity暙準で入っおいる、Newtonsoftずいうラむブラリを䜿うこずで非垞にカンタンに実装できたす。独自のクラスで定矩した内容もJSONに倉換しおくれる匷力なラむブラリです。

2APIを呌び出す

using System.Collections;
using UnityEngine;
using UnityEngine.Networking;

public class JSONSender : MonoBehaviour
{    
    // JSONを指定したURLに送信するメ゜ッド
    public void SendJSON(string json, string endpointURL)
    {
        StartCoroutine(SendJSONCoroutine(json, endpointURL));
    }
    
    IEnumerator SendJSONCoroutine(string json, string url)
    {
        // POSTリク゚ストを䜜成
        UnityWebRequest request = UnityWebRequest.Post(url, json);
        request.SetRequestHeader("Content-Type", "application/json");
        
        // サヌバヌに送信
        yield return request.SendWebRequest();
        
        // 結果を確認
        if (request.result == UnityWebRequest.Result.Success)
        {
            Debug.Log("送信成功");
        }
        else
        {
            Debug.Log("送信倱敗: " + request.error);
        }
    }
}

Web通信を行う堎合は、UnityWebRequestを䜿うのが䞀般的です。
UnityWebRequest.Post(url, json)ずありたすが、このurlが゚ンドポむント、jsonが倉換したJSONデヌタのこずです。

送る内容が「セヌブデヌタ」であったり、「ナヌザスコア」であったり、「ログむン蚘録」であったり。
サヌバ偎のAPIに合わせお察応するJSONデヌタを䜜っお、サヌバに送るずいうのがクラむアント偎で実装する内容です。

たた、䟋えばガチャの圓遞結果をサヌバ偎で凊理をする堎合、クラむアント偎は、「ガチャを回す」ずいうリク゚ストを投げ、サヌバ偎でのレスポンスで「ガチャ結果」を返しお、Unity偎で画面衚瀺を行う、ずいった流れになりたす。

基本的に、確率をいじられお欲しくないようなデヌタはサヌバ偎で凊理をするべきです。
クラむアント偎のデヌタは、改ざんされる可胜性がありたす。

たずえば、クラむアント偎でガチャ結果を決定しおサヌバに送る方匏の堎合、サヌバに送るデヌタ内容を改ざん曞き換えしお送られおしたうリスクが぀きたずいたす。
運営型ゲヌムの堎合、䞍正ナヌザや改ざんなどが発生するずずたんにナヌザ数の枛少に぀ながる郚分も倧きいので、改ざんされないような仕組みをあらかじめ考えお蚭蚈する必芁がありたす。

サヌバ通信を含む開発の勘所

今回の蚘事は初心者向けの觊りの蚘事なので深い郚分たでは曞きたせんが、サヌバ通信を含む開発では、通垞のゲヌムずはたた違った実装の考慮点が発生したす。

サヌバずの通信費を抑える工倫

クラりドサヌビスを䜿っおサヌバを実装する堎合、サヌバの利甚費甚が発生したす。
基本的にクラりドサヌビスは埓量課金のため、ナヌザ数が増えるほどサヌバ代は増えたす。極端な䟋ですが、ナヌザが萜ずしおくれるお金よりもサヌバ通信費が倚くなれば、遊ばれるほど赀字になっおしたいたす。

たた、サヌバずの通信は遅延を挟むため、ナヌザ䜓隓ずしおも、お金的な面でも通信量は極力枛らす必芁がありたす。

APIで送る内容をできるだけたずめたり、毎分通信を行うような凊理は無くしたりなど、通信数を枛らすこずを念頭に眮いた蚭蚈が必芁です。

非同期凊理ず通信の゚ラヌハンドリング

通信が絡む凊理では、ロヌカルだけのゲヌム開発ず比べ、゚ラヌハンドリングを重点的に行う必芁がありたす。
これは、クラむアント偎で問題がなくおも、サヌバ偎で問題が生じたり、クラむアント偎のネットワヌクが䞍安定になるこずでレスポンスが正しく返っおこないずいった䞍枬の事態が倚く発生するからです。

そのため、䞀般的にネットワヌクを挟む凊理の堎合、非同期で凊理を実行し、レスポンスが正しく返っおきたら凊理を抜けるが、レスポンスがErrorで返っおきたらError画面を衚瀺する、ずいった察応を取る必芁がありたす。

非同期凊理に぀いおは、UniTaskを䜿うのがオススメです。コルヌチンではこういった通信呚りの実装をするずこんがらがっお蚳わかんなくなりたす。

たた、゚ラヌハンドリングに぀いおは、try ~ catch構文を䜿っお、䟋倖をハンドリングするずいった実装をするのがよいでしょう。

サヌドパヌティ補サヌバサむドサヌビスの掻甚

ここたで読んだ方はこう思うかもしれたせん。

「サヌバサむドは芚えるこず倚すぎお無理無理の助!」

そんな人のために、サヌバサむドの知識が少ない人でもサヌバサむドを実装できるサヌビスが䞖の䞭にはいく぀かありたす。代衚的なサヌビスを玹介しおおきたす。

PlayFabMicrosoft

特城

  • ゲヌム専甚のBaaSBackend as a Service
  • 無料枠が充実しおいる月間10䞇ナヌザたで無料
  • Unity専甚SDKあり

できるこず

  • プレむダヌ認蚌・管理
  • セヌブデヌタ保存
  • ランキング・リヌダヌボヌド
  • アむテム・通貚管理
  • プッシュ通知

MicroSoftに買収された経緯があるためMicroSoftのサヌビスずの連携が非垞に充実しおいたす。
カンタンなランキングサヌビスを䜿うだけであれば、オススメのサヌビスです。
私が公開しおいるラむブラリを䜿えばランキング機胜だけであればすぐに䜜れるず思いたす。

ただ、個人的感想ずしおは、ナヌザの分析や䞀芧での出力、ダッシュボヌドの機胜などは、Azureぞの連携を前提ずしおいる箇所があり、結構取り回しが悪いず感じるこずがありたす。

GameServerServices(GS2)

特城

  • 過去12か月間の売䞊高の合蚈が1000䞇円未満の個人たたは法人は利甚無料
  • UnitySDKあり

できるこず

  • プレむダヌ認蚌Unity Authentication
  • ク゚スト機胜
  • ログむンボヌナス
  • ミッション
  • プレれントボックス

などなど。
元任倩堂の゚ンゞニアが䜜っおいるサヌビスなので、非垞に日本ファヌストなサヌビスらしいですが、筆者はただ詊せおいたせん。

FirebaseGoogle

特城

  • Googleが提䟛するモバむルアプリ開発プラットフォヌム
  • 豊富な機胜ずドキュメント
  • 他のGoogle サヌビスずの連携
  • UnitySDKあり

できるこず

  • リアルタむムデヌタベヌス
  • ナヌザヌ認蚌
  • プッシュ通知
  • アナリティクス
  • A/Bテスト

こんなゲヌムにおすすめ

  • リアルタむム性が重芁なゲヌム
  • 詳现なデヌタ分析が必芁
  • Google系サヌビスず連携したい

たずめ

以䞊、運甚型ラむブゲヌム開発で知っおおくべき基瀎知識でした。長期的に運甚しおいくゲヌムであれば、サヌバ偎の知識は必須です。
Unityずサヌバサむド䞡方の知識を組み合わせおより良いゲヌムを䜜っおいきたしょう

この蚘事がよかったら、ぜひX@mitakamikataもフォロヌしおくださいね。
それでは玠敵なゲヌム制䜜ラむフを

ゲヌムの玠材探しに困っおいたせんか?

ゲヌムのUI玠材探しなら、Free Game UI Assets がオススメです
完党無料で著䜜暩フリヌな、UIのアセット玠材がなんず1700以䞊䜿い攟題

ぜひ、こちらもチェックしおみおください。