/// <summary> /// 指定されたシーン名を用いて、コメントシーンを切り替えます。 /// </summary> /// <param name="sceneName">切り替えるコメントシーン名。ただし、最大64文字のASCII文字列でなければなりません。さらに文字列の先頭にはアンダースコア2つをつけることは許されていません。</param> /// <param name="reset">コメントシーンの状態をリセットする場合は true</param> /// <exception cref="ArgumentException">シーン名が null または 空文字列 です</exception> /// <exception cref="ArgumentException">シーン名は{MaxAllowSceneNameLength}文字を超えることは出来ません Name={sceneName} Length={sceneName.Length}</exception> /// <exception cref="ArgumentException">シーン名にアンダースコア2つから始めることは出来ません Name={sceneName}</exception> /// <exception cref="ArgumentException">シーン名に使えない文字が含まれています Name={sceneName} Invalid={chara}</exception> public virtual void ChangeScene(string sceneName, bool reset) { // 例外判定を入れる ThrowIfInvalidSceneName(sceneName); // リセットする場合は if (reset) { // リセットしながらシーンを切り替えるネイティブプラグイン関数を叩く RpgAtsumaruNativeApi.ResetAndChangeScene(sceneName); } else { // そのままシーンを切り替えるネイティブプラグイン関数を叩く RpgAtsumaruNativeApi.ChangeScene(sceneName); } }
/// <summary> /// RPGアツマール上に指定されたスコアボードを非同期に表示します。 /// RPGアツマールの仕様上、既定は 1 ~ 10 までです。10個以上の場合は管理ページから上限を指定できます。 /// </summary> /// <param name="boardId">表示したいスコアボードID</param> /// <returns>スコアボードを表示する操作タスクを返します</returns> public virtual async Task <(bool isError, string message)> ShowScoreboardAsync(int boardId) { // もし、シグナル状態なら if (scoreboardShowAwaitable.IsCompleted) { // 非シグナル状態にしてネイティブプラグイン関数を叩く scoreboardShowAwaitable.Reset(); RpgAtsumaruNativeApi.ShowScoreBoard(boardId); } // シグナル状態になるまで待って結果を受け取る var jsonData = await scoreboardShowAwaitable; var result = JsonUtility.FromJson <RpgAtsumaruBasicResult>(jsonData); // 結果を返す return(result.ErrorOccured, result.Error.message); }
/// <summary> /// RPGアツマールの指定されたスコアボードにスコアを非同期に送信します /// </summary> /// <param name="boardId">送信する先のスコアボードID</param> /// <param name="score">送信するスコア</param> /// <returns>スコアを送信する操作タスクを返します</returns> /// <exception cref="ArgumentOutOfRangeException">score が {MinLimitScoreValue} - {MaxLimitScoreValue} の範囲外です Value={score}</exception> public virtual async Task <(bool isError, string message)> SendScoreAsync(int boardId, long score) { // 例外判定を処理する ThrowIfOutOfRangeScore(score); // もし、シグナル状態なら if (scoreboardSendAwaitable.IsCompleted) { // 非シグナル状態にしてネイティブプラグイン関数を叩く scoreboardSendAwaitable.Reset(); RpgAtsumaruNativeApi.SendScoreRecord(boardId, score); } // シグナル状態になるまで待って結果を受け取る var jsonData = await scoreboardSendAwaitable; var result = JsonUtility.FromJson <RpgAtsumaruBasicResult>(jsonData); // 結果を返す return(result.ErrorOccured, result.Error.message); }
/// <summary> /// RPGアツマールの現在のマスター音量を取得します /// </summary> /// <returns>マスター音量を(OFF 0.0 ~ 1.0 ON)の値で返します</returns> public virtual float GetCurrentVolume() { // プラグインから音量の取得をする return(RpgAtsumaruNativeApi.GetCurrentVolume()); }
/// <summary> /// RPGアツマールの音量調整バーの監視を停止します。 /// 監視を停止しても一度表示された音量調整バーは非表示にはなりません。 /// </summary> public virtual void StopVolumeChangeListen() { // プラグインの音量監視停止APIを叩く RpgAtsumaruNativeApi.StopVolumeListen(); }
/// <summary> /// 現在のコンテキストが特定コンテキストファクタの状態におけるマイナーコンテキストを進めます /// </summary> public virtual void PushMinorContext() { // ネイティブプラグイン関数を叩く RpgAtsumaruNativeApi.PushMinorContext(); }
/// <summary> /// 現在のコンテキストに対して状態を進めます /// </summary> /// <param name="factor">現在のコンテキストに対して状態の内容を示す文字列</param> /// <exception cref="ArgumentException">コンテキストファクタが null または 空文字列 です</exception> public virtual void PushContextFactor(string factor) { // 例外判定を入れてからネイティブプラグイン関数を叩く ThrowIfInvalidFactor(factor); RpgAtsumaruNativeApi.PushContextFactor(factor); }
/// <summary> /// コメントのシーン内で特定のコンテキストを設定します /// </summary> /// <param name="context">設定するコンテキストの文字列。ただし、最大64文字のASCII文字列でなければなりません。</param> /// <exception cref="ArgumentException">コンテキストが null または 空文字列 です</exception> /// <exception cref="ArgumentException">コンテキストは{MaxAllowContextNameLength}文字を超えることは出来ません Name={context} Length={context.Length}</exception> /// <exception cref="ArgumentException">コンテキストに使えない文字が含まれています Name={context} Invalid={chara}</exception> public virtual void SetContext(string context) { // 例外判定を入れてからネイティブプラグイン関数を叩く ThrowIfInvalidContextName(context); RpgAtsumaruNativeApi.SetContext(context); }
/// <summary> /// RPGアツマールのサーバーストレージとセーブデータの同期を非同期で行います。 /// ゲーム側が設定したセーブデータが書き込まれた後、サーバーのセーブデータがロードされます。 /// また、実際のセーブデータの削除の同期もこのタイミングで行われます。 /// </summary> /// <returns>セーブデータの同期操作を行っているタスクを返します</returns> public virtual async Task SyncSaveDataAsync() { // もし同期待機オブジェクトが完了状態なら if (syncItemsAwaitable.IsCompleted) { // 同期待機オブジェクトをリセットする syncItemsAwaitable.Reset(); // ダーティデータのリストと削除するべきリストの用意 List <CachedData> dirtyDataList = new List <CachedData>(); List <CachedData> removeDataList = new List <CachedData>(); // セーブデータの数分ループ foreach (var saveData in saveDataTable.Values) { // セーブデータがダーティなら if (saveData.Dirty) { // セーブデータがnullなら if (saveData.SaveData == null) { // nullの場合は削除対象 removeDataList.Add(saveData); } else { // 汚れリストに追加 dirtyDataList.Add(saveData); } } } // 削除データの件数が1件以上あるなら if (removeDataList.Count >= 1) { // 削除データの件数分ループ foreach (var removeSaveData in removeDataList) { // 削除待機オブジェクトをリセットしてRPGアツマールのサーバーストレージから削除をする removeItemAwaitable.Reset(); RpgAtsumaruNativeApi.RemoveStorageItem(removeSaveData.Key); await removeItemAwaitable; } } // ダーティなデータの件数が1件以上あるなら if (dirtyDataList.Count >= 1) { // サーバーに同期するためのデータを生成する var syncSaveData = new RpgAtsumaruSaveData(); syncSaveData.SaveDataItems = new RpgAtsumaruDataRecord[dirtyDataList.Count]; // 同期用データにダーティなデータを渡す for (int i = 0; i < dirtyDataList.Count; ++i) { // ダーティなデータを受け取ってダーティをリセット syncSaveData.SaveDataItems[i] = new RpgAtsumaruDataRecord() { key = dirtyDataList[i].Key, value = dirtyDataList[i].SaveData }; dirtyDataList[i].ClearDirty(); } // 同期セーブデータをJSONシリアライズしてRPGアツマールサーバーへ送って待機する setItemsAwaitable.Reset(); var saveDataJson = JsonUtility.ToJson(syncSaveData); RpgAtsumaruNativeApi.SetStorageItems(saveDataJson); await setItemsAwaitable; } // こんどはRPGアツマールサーバーから最新のデータを受け取る getItemsAwaitable.Reset(); RpgAtsumaruNativeApi.GetStorageItems(); await getItemsAwaitable; // 同期が完了したことをシグナルで設定 syncItemsAwaitable.Set(); } // 同期待機オブジェクトを待機する await syncItemsAwaitable; }