予めUniVCIがインポートされているUnityプロジェクトへRankingVCI.unitypackageをUnityのへドラッグ&ドロップして、ランキングVCIに必要なファイルをインポートします。
するとプロジェクトのAssetsフォルダ内に「VirtualCast/RankingVCI」フォルダが生成されます。
サンプルシーン
Assets/VirtualCast/RankingVCI/Templateのシーンを開くと、ランキングVCIのテンプレートが設置してあります。
テンプレートは3種類のテクスチャパターンがあり、これをベースにオブジェクトを追加、または中のオブジェクトを制作している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
---ランクイン処理 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 --ランキングのスコアタイプ(上記から選択) ---(以下のランキングスクリプト省略)---
---ランクイン処理 if(ゲーム終了条件) then RankingStartEnteringTimespan(timespan) end ---ランキングスクリプトの設定 local RANKING_TYPE = RANKING_TYPE_TIMEATTACK
また、持久戦等でタイムの長さを競う場合はRANKING_TYPEをRANKING_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_SCORE | 9桁の数値スコアで表記します。スコアが高い順に並びます。 |
RANKING_TYPE_TIMEATTACK | MM:SS.000で表記します。タイムアタック形式でタイムが短い順に並びます。 |
RANKING_TYPE_ENDURANCE | MM: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を返します。 |