JackMasaki’s blog

掲載した記事ネタや作ったアプリ、参加したイベントレポートなどを掲載します

UnityとiOSでSmtpを叩くと怒られる奴の解決方法

iPhone XsMaxがなんとか手に入りました。

諸事情でsmtpiPhoneから叩こうということになり、UnityからビルドしてXcodeでデプロイし、実機でテスト!という段階でエラーが発生しました。

発生したエラーは次の通りです。

MissingMethodException: Method not found: 'Default constructor not found...ctor() of System.Net.Configuration.MailSettingsSectionGroup'. at System.Activator.CreateInstance (System.Type type, Boolean nonPublic) [0x00000] in :0 at System.Configuration.Configuration.GetSectionGroupInstance (System.Configuration.SectionGroupInfo group) [0x00000] in :0 at System.Configuration.ConfigurationSectionGroupCollection.get_Item (System.String name) [0x00000] in :0 at System.Configuration.Configuration.GetSection (System.String path) [0x00000] in :0 at System.Configuration.ClientConfigurationSystem.System.Configuration.Internal.IInternalConfigSystem.GetSection (System.String configKey) [0x00000] in :0 at System.Configuration.ConfigurationManager.GetSection (System.String sectionName) [0x00000] in :0 at System.Net.Mail.SmtpClient..ctor (System.String host, Int32 port) [0x00000] in :0 at EmailHandler.SendEmail (System.String from, System.String password, System.String to, System.String subject, System.String body) [0x00000] in :0 at UnityEngine.Events.UnityEvent.Invoke () [0x00000] in :0 at UnityEngine.EventSystems.ExecuteEvents.Execute[T] (UnityEngine.GameObject target, UnityEngine.EventSystems.BaseEventData eventData, UnityEngine.EventSystems.EventFunction1 functor) [0x00000] in <filename unknown>:0 at UnityEngine.EventSystems.StandaloneInputModule.ProcessTouchPress (UnityEngine.EventSystems.PointerEventData pointerEvent, Boolean pressed, Boolean released) [0x00000] in <filename unknown>:0 at UnityEngine.EventSystems.StandaloneInputModule.ProcessTouchEvents () [0x00000] in <filename unknown>:0 at UnityEngine.EventSystems.StandaloneInputModule.Process () [0x00000] in <filename unknown>:0 UnityEngine.EventSystems.ExecuteEvents:Execute(GameObject, BaseEventData, EventFunction1) UnityEngine.EventSystems.StandaloneInputModule:ProcessTouchPress(PointerEventData, Boolean, Boolean) UnityEngine.EventSystems.StandaloneInputModule:ProcessTouchEvents() UnityEngine.EventSystems.StandaloneInputModule:Process() (Filename: currently not available on il2cpp Line: -1)

どうやらIL2CPPのバグのようです。

解決法としてはlink.xmlに以下のものを追加、もしくはlink.xmlがない場合にはAssetフォルダに作成し以下のものを記述し、再度UnityからiOS向けにビルドすることで解決します。

<linker>
<assembly fullname="System">
<type fullname="System.Net.Configuration.MailSettingsSectionGroup" preserve="all"/>
<type fullname="System.Net.Configuration.SmtpSection" preserve="all"/>
<type fullname="System.Net.Configuration.SmtpNetworkElement" preserve="all"/>
<type fullname="System.Net.Configuration.SmtpSpecifiedPickupDirectoryElement" preserve="all"/>
</assembly>
</linker>

参考になったQ&A

stackoverflow.com

PlayFabでEmailとPasswordを使ってログインする

今回はUnityでのEmailとPasswordを使ったPlayFabへのログイン方法について書きます。

PlayFabの導入部分はこちら

jackmasaki.hatenablog.com


PlayFabのログインについて

PlayFabには様々なログイン方法があります。

ログインの種類
LoginWithAndroidDeviceID AndroidバイスのIDを仕様してログイン
LoginWithCustomID Titleごとに生成した文字列を使用してログイン
LoginWithEmailAddress Emailアドレスとパスワードを使用してログイン
LoginWithFacebook Facebookのアクセストークンを使用してログイン
LoginWithFacebookInstantGamesId FacebookインスタントゲームIDでログイン
LoginWithGameCenter iOS Game CenterのIDを使用してログイン
LoginWithGoogleAccount Googleアカウントを使用してログイン
LoginWithIOSDeviceID iOSのデバイスIDを使用してログイン
LoginWithKongregate Kongregateアカウントを使用してログイン
LoginWithNintendoSwitchDeviceId Nintendo SwitchのデバイスIDを使用してログイン
LoginWithPlayFab PlayFabのアカウントでログイン
LoginWithSteam Steamのアカウントでログイン
LoginWithTwitch Twitchのアクセストークンを使用してログイン
LoginWithWindowsHello WindowsHelloを介して署名しログイン
LoginWithXbox Xbox Liveトークンを使用してログイン

導入方法で利用したログイン方法はLoginWithCustomIDです。

var request = new LoginWithCustomIDRequest { CustomId = "GettingStartedGuide", CreateAccount = true};
PlayFabClientAPI.LoginWithCustomID(request, OnLoginSuccess, OnLoginFailure);

導入方法で紹介したコードでは"GettingStartedGuide"という文字列をCustomIdとして指定しログインしていたというわけです。

試しにCustomIdを任意の文字列に変更し、CreateAccountをtrueにして実行すると新しくPlayerが作成されることが確認できるはずです。

Playersの該当Player内、Overviewの中にあるIdentitiesを見ると、正しくCustomIdが任意の文字列でLinkされていることがわかります。

f:id:JackMasaki:20180914160343p:plain


UnityでPlayFabにEmailとPasswordでログインする

Emailでログインする際にはまずPlayFab用のアカウントを作成させる必要があります。 理由としては、LoginWithEmailAddress()だとCreateAccountが反映されずアカウントが作成されないためです。

PlayFabClientAPI.RegisterPlayFabUser()を使用しアカウントを作成、登録します。

using PlayFab;
public void PressRegisterButton()
{
    var RegisterData = new RegisterPlayFabUserRequest()
    {
        TitleId = "****",
        Email = "*******@****",
        Password = "********",
        Username = "******"
    };

    PlayFabClientAPI.RegisterPlayFabUser(RegisterData, result => 
    {
        Debug.Log("Congratulations, you made your PlayFab account!");
    }, error => Debug.Log(error.GenerateErrorReport()));
}

TitleIdにはTitleIdを、Email,Password,Usernameには任意のString型を設定します。

RegisterPlayFabUserRequestには次の項目を設定することができます。

RegisterPlayFabUserRequest
DisplayName 対象TitleでのPlayerの表示名(3~25文字)
Email 登録する際のEmailアドレス
EncryptedRequest Titleの公開RSAキーで暗号かされたBase64エンコードされたBody
InfoRequestParameters ユーザーに返す情報のフラグ
Password PlayFabのパスワード(6~100文字)
PlayerSecret APIリクエスシグネチャの検証用
RequireBothUsernameAndEmail usernameパラメータとemailパラメータの両方を必要とするかどうかのフラグ
TitleId* 該当するTitleID
Username PlayFabのアカウントユーザー名(3~20文)

レスポンスでは次のものが返ってきます。

RegisterPlayFabUserResult
EntityToken ログインフラグがtrueの場合、ログインして返ります
PlayFabId 新規作成されたアカウントのPlayFabのID
SessionTicket 現在のセッションでのPlayerトーク
SettingForUser ユーザー固有の設定
Username PlayFabでのユーザー名

これで、アカウントの作成ができました。

次にEmailとPasswordでログインする方法を紹介します。

using PlayFab;

public void PressLoginButton()
{
    var LoginData = new LoginWithEmailAddressRequest()
    {
        TitleId = "****",
        Email = "********@********",
        Password = "******",
    };
    PlayFabClientAPI.LoginWithEmailAddress(LoginData, result => 
    {
        Debug.Log("Congratulations, you made your first successful API call!");
    }, error => Debug.Log(error.GenerateErrorReport()));
}

RegisterしたTitleId,Email,Passwordを入れてリクエストすることでログインすることができます。

PlayFabでVirtual Currencyを使用してCatalogから買い物をする

今回はUnityでのVirtual Currencyを使用してCatalogからの買い物について書きます。

PlayFabの導入部分はこちら

jackmasaki.hatenablog.com

Virtual Currencyの取得方法はこちら

jackmasaki.hatenablog.com


PlayFabのCatalogとは

PlayFab内の仮想アイテムを定義するもので、PlayerがItemを購入するために必要になります。

CatalogにはItemの購入(Virtual Currency/Real Money)、セールス機能が付いたItemショップStores、ランダムな結果を出力するDrop Tablesなど様々な機能があります。

詳しくは公式のCatalogsドキュメントをみると何ができるかが書いてあります。

Catalogs


Catalogの作成とItemの作成

PlayFabのEconomyからCatalogsのタブを選択し、NEW CATALOGを選択します。

f:id:JackMasaki:20180912235939p:plain

入力する項目は2つです。

New Catalog
Catalog version* Catalogの名前
Make Primary catalog チェックボックス

Make Primary catalogはTrueにすることで、作成するCatalogを主要なバージョンのCatalogとして設定することができます。 これは後で変更することもできます。

次にItemを作成しCatalogに追加します。

PlayFabのEconomyからCatalogsのタブを選択し、先ほど作成したCatalogの名前を選択します。その後NEW ITEMを選択することでItemを新規で作成することができます。

f:id:JackMasaki:20180913000542p:plain

Itemには次の項目を設定することができます。

New Catalog Item
Item ID* Itemの内部ID
Item class Catalog管理用の識別子
Tags Catalog管理用のタグ
Item image URL Itemの画像URL
Display name Itemの表示名
Description Itemの説明
Is stackble ItemがInventoryに1つのみ登録され数量が増える
Is tradable Trade APIでItemの交換を可能にする
is a token for character crearion GrantCharacterToUserなどで使用するTokenかどうか
CONSUMABLE 下で説明
PRICES 使用するVirtual Currency(RM)と価格を設定
CUSTOM DATA 自由に設定できるData

CONSUMABLEは”Consumable”を選択することでItemを消費する設定になり、また次のように設定できます。

Consumable
By count 使用できる個数
By time 使用期間
Time group name 消費時間を共有するグループ

UnityでCatalogを取得する

UnityではPlayFabClientAPI.GetCatalogItems()を使用することでCatalogを取得することができます。 例えば次のようなコードです。

using PlayFab;

public void GetCatalogItems()
{
    PlayFabClientAPI.GetCatalogItems(new GetCatalogItemsRequest(), result => 
    {
        var itemList = result.Catalog;
    }, error => Debug.Log(error.GenerateErrorReport()));
}

GetCatalogItems()を使用してGetCatalogItemsRequest()に何も指定しない場合にはPrimaryのCatalogが呼ばれます。 指定したCatalogを呼びたい場合はGetCatalogItemsRequest()のCatalogVersionを指定してあげることで呼ぶことができます。


UnityでVirtual Currencyを使用してCatalogから買い物をする

UnityではPlayFabClientAPI.PurchaseItem()を使用することでCatalogからItemを購入することができます。 例えば次のようなコードです。

public void BuyItem()
{
    PlayFabClientAPI.PurchaseItem(new PurchaseItemRequest
    {
        ItemId = "itemID",
        VirtualCurrency = "**",
        Price = ***           
    },result => { },error => Debug.Log(error.GenerateErrorReport()));
}

PurchaseItemRequest内のItemIDには作成したItem IDを、VirtualCurrencyには購入するために使うVirtualCurrencyの通貨コードを、Priceには価格を入れることで買い物が行われます。

GetCatalogItems()と同様でCatalogVersionを指定しなければ最新のPrimaryのCatalogが呼ばれます。

PlayFabでVirtual Currencyの取得や増減をする

今回はUnityでのVirtual Currencyの取得について書きます。

PlayFabの導入部分はこちら

jackmasaki.hatenablog.com


PlayFabのVirtual Currencyとは

Virtual Currency、翻訳すると"仮想通貨"になりますが、マイニングをしたりするわけではありません。

PlayFabを使用したTitle上で使用することができる通貨になります。

Virtual Currencyは主にCatalog上にあるItemの購入や特定の行動に対するコストとして支払うなどのことができます。

ただし、現在のPlayFabのバージョンではItemとVirtual Currencyの直接のTradeは不可能となっています。

※ドキュメントにはTradeがβ機能であるため今後追加の予定はあるとの記述があります


Virtual Currencyの発行

PlayFabのEconomy内にあるタブからCurrencyを選択後、NEW CURRENCYを選択します。

f:id:JackMasaki:20180911191859p:plain

New Currencyでは次の項目を設定します。*マークは必須項目です。

New Currency
Currency code* 半角英大文字の通貨コード
Display name* 通貨の表示名
Initial deposit 初期に配布される通貨量
Recharge rate 自動で配布される通貨レート
Recharge maximum 自動で配布される通貨の最大値

Currency codeにおいて"RM"はリアルマネー用に予約されているため使用することができません。

Recharge rateは設定されたレートを24時間かけて均等に分割され配布されます。

Recharge rateとRecharge maximumは0に設定することで通貨の自動配布をオフにすることができます。

必要な項目を入力後、SAVE CURRENCYを選択し、作成した通貨を保存します。


Virtual Currencyの手動設定

Virtual Currencyは手動で設定し、特定Playerの所持している量を変更することもできます。

PlayFabのPlayersからVirtual Currencyを配布したいPlayerを選択し、上部タブからVirtual Currencyを選択。配布するVirtual Currencyを選択します。

ここでは次の項目を入力します。

MODIFY VIRTUAL CURRENCY
Amout* 変更後の通貨量
Reason 変更理由
Comment コメント

所持通貨の変更をした場合はSAVE VIRTUAL CURRENCYを選択し保存します。

変更された記録はPlayerの上部タブにあるPlayStreamに記録されます。

f:id:JackMasaki:20180911193543p:plain


UnityでVirtual Currencyの取得

Virtual Currencyを取得するにはPlayFabClientAPI.GetUserInventory()を使用します。

PlayFabClientAPI.GetUserInventory()のレスポンスにはItemなど様々な項目がありますが、今回はVirtual Currencyの取得をするコードの例を記載します。

using PlayFab;
public void GetVirtualCurrency()
{
    PlayFabClientAPI.GetUserInventory(new GetUserInventoryRequest(), result => 
    {
        var virtualCurrency = result.VirtualCurrency["**"];
    },error => Debug.Log(error.GenerateErrorReport()));
}

現在ログインしているPlayerの所持金を取得する例になります。

VirtualCurrencyはDictionary型になっているためKeyとなる"**"に通貨コードを指定します。


UnityでVirtual Currencyの増加

Unity上でPlayerのVirtual Currencyを増加させるにはPlayFabClientAPI.AddUserVirtualCurrency()を使用します。

※AddUserVirtualCurrency()を使用するには設定で有効にする必要があります。デフォルトでは無効となっています。

設定はPlayFabのSettings→API Features内にある"Allow client to add virtual currency"のチェックボックスをTrueにすることで有効にできます。

using PlayFab;
public void AddVirtualCurrency()
{
    PlayFabClientAPI.AddUserVirtualCurrency(new AddUserVirtualCurrencyRequest()
    {
        VirtualCurrency = "**",
        Amount = 100
    },result =>{},error => Debug.Log(error.GenerateErrorReport()));
}

VirtualCurrencyはKeyとなる"**"にString型で通貨コードを指定します。 Amountには増加させたい通貨量をint型で入れます。

レスポンス結果は次のようになります。

ModifyUserVirtualCurrencyResult
Balance 変更後の所持通貨量
BalanceChange 所持通貨の変化量
PlayFabId 通貨量を変更したPlayerのID
VirtualCurrency 通貨量を変更した通貨コード

UnityでVirtual Currencyの減少

Unity上でPlayerのVirtual Currencyを減少させるにはPlayFabClientAPI.SubtractUserVirtualCurrency()を使用します。

※SubtractUserVirtualCurrency()を使用するには設定で有効にする必要があります。デフォルトでは無効となっています。

設定はPlayFabのSettings→API Features内にある"Allow client to subtract virtual currency"のチェックボックスをTrueにすることで有効にできます。

using PlayFab;
public void SubVirtualCurrency()
{
    PlayFabClientAPI.SubtractUserVirtualCurrency(new SubtractUserVirtualCurrencyRequest()
    {
        VirtualCurrency = "**",
        Amount = 100
    },result =>{},error => Debug.Log(error.GenerateErrorReport()));
}

VirtualCurrencyはKeyとなる"**"にString型で通貨コードを指定します。 Amountには減少させたい通貨量をint型で入れます。

レスポンス結果は次のようになります。

ModifyUserVirtualCurrencyResult
Balance 変更後の所持通貨量
BalanceChange 所持通貨の変化量
PlayFabId 通貨量を変更したPlayerのID
VirtualCurrency 通貨量を変更した通貨コード

ModifyUserVirtualCurrencyResultのBalanceChangeはInt32型になっているため最大値は2,147,483,647となり、それを超える変化量は破棄されるため注意が必要です。

PlayFabでPlayerの情報やUserDataを取得する

今回はUnityでのPlayerの取得を書きます。

PlayFabの導入部分はこちら

jackmasaki.hatenablog.com


PlayFabにおけるPlayerとは

PlayFabを使用するうえで必要不可欠な仕組みです。 ログインやコミュニケーション機能があるほか、セグメンテーション、LiveOps、アナリティクスなどでデータを閲覧する主となるものになります。

FacebookやSteam、AndroidNintendo Switchなどの本体とリンクして簡易なログインを可能にする機能などもあります。 (個人的にはTwitterも欲しい…)


Playerの作成

PlayFabのPlayersからNEW PLAYERを選択します。 New playerを作成するにはCustom IDが自動で入力されます。

このCustom IDを使用することでログインするLoginWithCustomIDなどがあります。 もし任意のCustom IDを使用したい場合にはUNLOCKをクリックしCustom IDを入力してください。

作成したPlayerをクリックするとPlayerに関する様々なデータが閲覧できます。

f:id:JackMasaki:20180911012222p:plain


Playerの情報をUnityで取得する

Unityで先ほど作成したPlayerの情報を取得してみます。 例えば次のコードで取得することができます。

using PlayFab;

private void GetProfile(){
    PlayFabClientAPI.GetPlayerProfile(new GetPlayerProfileRequest()
    {
        PlayFabId = ""
    }, result =>
    {
             var playerProfile = result.PlayerProfile;
    }, error => Debug.Log(error.GenerateErrorReport()));
}

取得できるPlayerProfileはPlayFab.Client.Models.PlayerProfileModelとなっており次の要素を持っています。

PlayFab.Client.Models.PlayerProfileModel
AdCampaignAttributions Playerが要因となった広告キャンペーンのリスト
AvatarUrl Playerのアバター画像のURL
BannedUntil PlayerがBANされている場合の終了日付
ContactEmailAddresses Playerに紐づけられているEmailのリスト
Created Playerが作成された日時
DisplayName Playerの表示名
LastLogin Playerが最後に該当TitleにログインしたUTC時間
LinkedAccounts Plyerアカウントにリンクされている認証システムのリスト
Locations Playerがログインしている場所のリスト
Memberships PlayerのMembershipのリストと期限切れかどうか
Origination Playerの口座
PlayerId PlayerのPlayFabのユニークID
PublisherId Playerが所属するPublisherID
PushNotificationRegistrations Playerのプッシュ通知を送信するためのエンドポイントリスト
Statistics Playerのリーダーボードのリスト
Tags Playerのセグメンテーション上でのタグのリスト
TitleId PlayerのProfileが適応されるTitleID
TotalValueToDateInUSD いままで支払ったPlayerの現金の総額
ValuesToDate 現金を使用して支払ったPlayerの購入リスト

独自のPlayer Dataを設定し取得する

PlayerにはDataと呼ばれる変数を設定することができます。 PlayFabの特定Playerをクリックし、Player Data(Title)を選択します。 ここでDictionary型の設定をすることができ、これを取得することができます。

f:id:JackMasaki:20180911014258p:plain

Player Dataには次の三種類があります。

Player Data
PLAYER DATA Clientからも読み書きできるデータ
READ ONLY DATA Clientから読み込みのみできるデータ
INTERNAL DATA Playerの内部データ,Clientに公開しない

今回は例としてPLAYER DATAのKeyに"Age"、Valueに"25"と入れてみます。 右下にNew、Changes、Removeがあるので変更数が正しいことを確認したらSAVE PLAYER DATAを選択します。

次にこのデータをUintyで取得します。取得にはGetUserData()を使用します。

例えば次のようなコードで取得することができます。

    public void GetPlayerData()
    {
        PlayFabClientAPI.GetUserData(new GetUserDataRequest
        {
            PlayFabId = "*****************"
        }, result => 
        {
           Debug.Log(result.Data["Age"].Value);
        }, error => Debug.Log(error.GenerateErrorReport()));

返ってくるDataはDictionary型になるので"Age"のValueを見るようなコードになっています。 実行してConsoleに"25"と表示されれば成功です。

PlayFabでGroupの取得をする

今回はUnityでのGroupの取得について書きます。

PlayFabの導入部分はこちら

jackmasaki.hatenablog.com


PlayFabにおけるGroupとは

Group機能というものがPlayFabに実装されています。これはゲームなどでギルドやクランなどの”特定の仲間で集まったグループ”にあたるものです。 PlayFabではEntity Groupsというシステム上にギルドを構築します。

Groupには例えばグループの作成、メンバーの追加、削除、役職の設定、招待などの機能があります。

詳しくは公式のGroup APIのドキュメントをみると何ができるかが書いてあります。

PlayFab Groups API


Groupの作成

Unityで取得するためのGroupを作成します。 PlayFabのGroupsからNEW GROUPを選択します。

f:id:JackMasaki:20180911000159p:plain

New Group画面ではそれぞれ次のものを入力します。

New Group
Group name グループの名前
Entity type 管理者にするPlayerのType
Entity ID 管理者にするPlayerのEntity ID

CREATE GROUPをするためにはすべて入力する必要があります。 Entity IDを入力するためには最低でも一人のPlayerが必要になります。

Entity typeで"title_player_account"を選択し、Entity IDにはPlayersの中からPlayerを選択し、Overview内のTitle player accountにあるPlayer ID(title)を入力します。

入力後CREATE GROUPを選択することでGroupを作成することができます。


Groupの取得

例えばUnityでGroupの名前を取得するには次のようなコードで取得します。

using PlayFab;
private void GetGroupData(){
    PlayFabGroupsAPI.GetGroup(new GetGroupRequest
    {
        Group = new PlayFab.GroupsModels.EntityKey() { Id = "****************" },
    }, result => 
    {
        var groupName = result.GroupName;
    }, error => Debug.Log(error.GenerateErrorReport()));
}

Idには作成したGroupのIDを入れます。これで指定したIdのGroupのデータを取得できます。 Group関係のものはPlayFabClientAPIではなくPlayFabGroupsAPIにあることに注意です。

GetGroup()で取得できるデータは次の通りです。

GetGroup() Result
Group PlayFab.GroupsModels型、IdとTypeを格納
GroupName Groupの名前
MemberRoleeId メンバーの初期RoleのID
AdminRoleId 管理者のID
Roles Roleと名前のDictionary
Created Groupを作成したサーバー上の日時
ProfileVersion Groupのバージョン

ログインしているPlayerの所属しているGroup一覧の取得

ログイン中のPlayerが所属しているGroup一覧を取得するにはListMembership()を使用し、例えば次のようなコードで取得します。

using PlayFab;
private void GetGroupData(){
    PlayFabGroupsAPI.ListMembership(new ListMembershipRequest(), result => 
    {
        var groupList = result.Groups;
    }, error => Debug.Log(error.GenerateErrorReport()));
}

PlayFabで最新のNewsを取得したり取得件数を変更する

今回はUnityでのNewsの取得を書きます。

PlayFabの導入部分はこちら

jackmasaki.hatenablog.com


PlayFabの"Content"から"NEW TITLE NEWS"を押し新規でNewsを作成します。 f:id:JackMasaki:20180909183729p:plain

Newsの入力項目は次のようになっています。

Title content
Title Newsのタイトル
Timestamp Newsのタイムスタンプ
Status Newsの状態
Body Newsの本文

今回は公開するのでStatusを"Published"にし、TitleとBodyを入力後"Save Title News"を押します。

f:id:JackMasaki:20180909184103p:plain

基本的にPlayFabはHTTPをPOSTしリクエストすることでレスポンスを貰えますが、UnityにはClassicでメソッドが用意されています。

GetTitleNews()でNewsを取得できます。 リクエストすると下記のプロパティを持ったList型のNewsが返ってきます。

Newsのプロパティ
Body Newsの本文
NewqId NewsのユニークID
Timestamp Newsのタイムスタンプ
Title Newsのタイトル

例えば最新のNewsは次の方法で呼べます。

using PlayFab;

private void GetNews(){
    PlayFabClientAPI.GetTitleNews(new GetTitleNewsRequest(), result =>
    {
    Debug.Log("Got latest News!");
    var newsTitle =  result.News[0].Title;
    var newsBody = result.News[0].Body;
    }, error => Debug.LogError(error.GenerateErrorReport()));
}

GetTitleNews()は標準では10件のニュースを取得するようになっています。 もしそれ以上のニュースを取得したい場合はGetTitleNewsRequest()内でCountに入れてリクエストすることで件数を変更できます。

例えばNewsを25件取得したい場合は

using PlayFab;

private void GetNews(){
    PlayFabClientAPI.GetTitleNews(new GetTitleNewsRequest()
{
    Count = 25
}, result =>
    {
    Debug.Log("Got 25 News!");
    var newsTitle =  result.News[result.News.Count - 1].Title;
    var newsBody =  result.News[result.News.Count - 1].Body;
    }, error => Debug.LogError(error.GenerateErrorReport()));
}

このようなリクエストの書き方で取得することができます。