目次

ランキング

このデータは「UniVCI0.23以降」で動作します。

自分のVCIにランキング機能を追加する

unitypackage:RankingVCI.zip


unitypackageのインポート

予めUniVCIがインポートされているUnityプロジェクトへRankingVCI.unitypackageをUnityのへドラッグ&ドロップして、ランキングVCIに必要なファイルをインポートします。
するとプロジェクトのAssetsフォルダ内に「VirtualCast/RankingVCI」フォルダが生成されます。

サンプルシーン
Assets/VirtualCast/RankingVCI/Templateのシーンを開くと、ランキングVCIのテンプレートが設置してあります。
テンプレートは3種類のテクスチャパターンがあり、これをベースにオブジェクトを追加、または中のオブジェクトを制作しているVCIに組み込みます。

RankingScriptDefRankingScriptPopRankingScriptCyber

オブジェクトデータ
オブジェクトの構成は次のようになっています。

オブジェクト名説明
Ranking_ControllerBackランキング入力パネルの戻るボタンです。アイテムを使うと前の文字になります。
Ranking_ControllerNextランキング入力パネルの進むボタンです。アイテムを使うと次の文字になります。
Ranking_ControllerEnterランキング入力パネルの決定ボタンです。アイテムを使うと文字入力や決定等を行います。
Ranking_PanelSetランキング入力パネルのボタンのスナップ情報・入力制限時間の表記がまとめらたオブジェクトです。
Ranking_Backgroundランキングの一覧を表示するオブジェクトです。

テンプレートから新規作成

テンプレートをベースにオブジェクトを追加していきます。
VCIデータに必要なコードも記述しているので、このまま出力できます。


既存のVCIに組み込む

テンプレート内にある5つのオブジェクトを作成中のVCIへ移動します。


またAssets/VirtualCast/RankingVCI/Prefabの中にも、同様のテンプレートオブジェクトがあるので、こちらを使用することも可能です。
prefabの中身を移動する場合ロックが掛かっているので、prefabオブジェクトを右クリック→Unpack Prefabを選択してロックを解除してください。


ランキングスクリプトの追加方法

ランキングの処理を追加するため、main.luaに専用のコードを追加する必要があります。
テンプレートから新規にランキングVCIを作成する場合は、VCIデータに必要なコードが既に記述されているので省略します。

1.function.luaをコピー
Assets/VirtualCast/RankingVCI/Lua/function.luaのコードを、作成中のmain.luaの文末にコピーします。
最初から作る場合はtemplate.luaのコードをmain.luaへコピーして、文末にfunction.luaのコードをコピーしてください。


2.ランキング専用の処理を追加
updateAllにRankingScriptUpdate()、onUseにRankingScriptOnUse(use)を追加します。
これらはランキングスクリプトを動かすための処理一式が入っています。

---全ユーザーで毎フレーム呼ばれる
function updateAll()
    ---ランキングスクリプトのUpdate処理
    RankingScriptUpdate()
end
 
---[SubItemの所有権&Use状態]アイテムをつかんで使うと呼ばれる。
---@param use string @押されたアイテムのSubItem名
function onUse(use)
    ---ランキングスクリプトのOnUse処理
    RankingScriptOnUse(use)
end

整数型のスコアランキングを作る手順

  1. ランキングスクリプトのRANKING_TYPERANKING_TYPE_SCOREに変更
  2. ランクインするタイミング(ゲームが終了後スコアが確定する時)にRankingStartEnteringScore(score)を追加
---ランクイン処理
if(ゲーム終了条件) then
    RankingStartEnteringScore(score)
end
 
---ランキングスクリプトの設定
local RANKING_TYPE = RANKING_TYPE_SCORE


以下ではスイッチを押した後、10秒間にスイッチを押した数だけスコアが加算される例です。
このサンプルシーンはAssets/VirtualCast/RankingVCI/ScoreSampleにあります。

local startTime = vci.me.Time  --ゲーム開始時の時刻
local nowGame = false  --現在ゲームかの判定(false:ゲーム前  true:ゲーム中)
local switch = vci.assets.GetTransform("Switch")  --スイッチのゲームオブジェクト
local score = 0 --ゲームスコア
 
function updateAll()
    ---計測中のタイマー表記
    if(nowGame == true)and(switch.IsMine) then
        local nowTime = vci.me.Time
        --制限時間(10秒)を切っている場合は、ゲーム終了
        if(10 - (nowTime - startTime).TotalSeconds < 0) then
            RankingStartEnteringScore(score)
            nowGame = false
        else
            vci.assets._ALL_SetText("ScoreText","Score : "..score.."\nTime : "..math.floor(10 - (nowTime - startTime).TotalSeconds))
        end
    end
    ---ランキングのUpdate処理セット
    RankingScriptUpdate()
end
 
function onUse(use)
    --スイッチを使った時の処理
    if(use == "Switch") then
        if(nowGame == true) then
            --ゲーム中に押した場合 スコア加算
            score = score + 100
        elseif(nowGame == false)and(IsInputtingRanking() == false) then
            --ゲーム前 かつ ランキングの入力が終了している時 に押した場合はゲーム開始
            nowGame = true
            score = 0
            startTime = vci.me.Time  --開始時刻を取得
        end
    end
    ---ランキングの入力ボタン処理
    RankingScriptOnUse(use)
end
---(以下のコード省略)---
 
------------------------------------------------------------
-- ランキングスクリプト
------------------------------------------------------------
--カスタマイズ設定
local RANKING_TYPE_SCORE = 1            --9桁のスコア表記 スコアが高い順に表示されます
local RANKING_TYPE_TIMEATTACK = 2       --MM:SS.000のタイム表記 タイムアタック形式でタイムが短い順に表示されます
local RANKING_TYPE_ENDURANCE = 3        --MM:SS.000のタイム表記 持久戦形式でタイムが長い順に表示されます
local RANKING_TYPE = RANKING_TYPE_SCORE --ランキングのスコアタイプ(上記から選択)
---(以下のランキングスクリプト省略)---

タイムアタック形式のランキングを作る手順

  1. ランキングスクリプトのRANKING_TYPERANKING_TYPE_TIMEATTACKに変更
  2. ランクインするタイミング(ゲームが終了後スコアが確定する時)にRankingStartEnteringTimespan(timespan)を追加
---ランクイン処理
if(ゲーム終了条件) then
    RankingStartEnteringTimespan(timespan)
end
 
---ランキングスクリプトの設定
local RANKING_TYPE = RANKING_TYPE_TIMEATTACK

また、持久戦等でタイムの長さを競う場合はRANKING_TYPERANKING_TYPE_ENDURANCEに変更します。


以下はスイッチを押してからもう一度スイッチを押すまでのタイムを競う例です。
このサンプルシーンはAssets/RankingVCI/TimeAttackSampleにあります。

local startTime = vci.me.Time  --ゲーム開始時の時刻
local nowGame = false  --現在ゲームかの判定(false:ゲーム前  true:ゲーム中)
local switch = vci.assets.GetTransform("Switch")  --スイッチのゲームオブジェクト
 
function updateAll()
    ---計測中のタイマー表記
    if(nowGame == true)and(switch.IsMine) then
        vci.assets._ALL_SetText("TimeText",RankingTimerToString(vci.me.Time - startTime))
    end
    ---ランキングのUpdate処理セット
    RankingScriptUpdate()
end
 
function onUse(use)
    --スイッチを使った時の処理
    if(use == "Switch") then
        if(nowGame == true) then
            --ゲーム中に押した場合はゲーム終了判定
            nowGame = false
            RankingStartEnteringTimespan(vci.me.Time - startTime)
        else
            --ゲーム前に押した場合はゲーム開始
            nowGame = true
            startTime = vci.me.Time  --開始時刻を取得
        end
    end
    ---ランキングの入力ボタン処理
    RankingScriptOnUse(use)
end
---(以下のコード省略)---
 
------------------------------------------------------------
-- ランキングスクリプト
------------------------------------------------------------
--カスタマイズ設定
local RANKING_TYPE_SCORE = 1            --9桁のスコア表記 スコアが高い順に表示されます
local RANKING_TYPE_TIMEATTACK = 2       --MM:SS.000のタイム表記 タイムアタック形式でタイムが短い順に表示されます
local RANKING_TYPE_ENDURANCE = 3        --MM:SS.000のタイム表記 持久戦形式でタイムが長い順に表示されます
local RANKING_TYPE = RANKING_TYPE_TIMEATTACK --ランキングのスコアタイプ(上記から選択)
---(以下のランキングスクリプト省略)---

ランキングの設定変更

コードの中にはランキングスクリプトの設定をカスタマイズできる定義変数があり、これらを修正することでカスタマイズが可能です。

RANKING_TYPE
ランキングの表記タイプを設定します。
設定値は下記の3種類です。

変数名説明
RANKING_TYPE_SCORE9桁の数値スコアで表記します。スコアが高い順に並びます。
RANKING_TYPE_TIMEATTACKMM:SS.000で表記します。タイムアタック形式でタイムが短い順に並びます。
RANKING_TYPE_ENDURANCEMM:SS.000で表記します。持久戦形式でタイムが長い順に並びます。

RANKING_TIMER
ランキングの名前入力の制限時間です。
単位は秒で設定し、デフォルト値では60秒です。

RANKING_HAZARD_CYCLE
ランキングの名前入力の文字点滅のサイクル時間です。
単位は秒で設定し、デフォルト値は0.1秒です。


関数説明

ランキングスクリプトで使用できる関数一覧です。

関数名 説明
RankingScriptUpdate() ランキングの時間的処理が入っています。
updateAll()に記述します。
RankingScriptOnUse(use) ランキングボタンの処理が入っています。
onUse(use)に記述します。
RankingStartEnteringScore(score) ランキングにスコアを追加します。
引数のスコアでランクインする場合は自動的に入力ボタンが出現します。
RankingStartEnteringTimespan(timer) ランキングにタイムを追加します。
引数のタイムでランクインする場合は自動的に入力ボタンが出現します。
RankingTimerToString(timer) ランキングに表示するタイムを文字列型に変換します。
表記は「MM:SS.000」となります。
RankingInputComplete() ランキング入力を完了させます。
IsInputtingRanking() ランキング入力中の場合trueを、そうでない場合はfalseを返します。