====== ランキング ====== > このデータは「UniVCI0.23以降」で動作します。 自分のVCIにランキング機能を追加する unitypackage:{{ :vci:asset:rankingvci.zip |RankingVCI.zip}} \\ \\ {{:vci:asset:ranking_pv.mp4|}} ---- ===== unitypackageのインポート ===== 予め[[https://github.com/virtual-cast/VCI/releases|UniVCI]]がインポートされているUnityプロジェクトへRankingVCI.unitypackageをUnityのへドラッグ&ドロップして、ランキングVCIに必要なファイルをインポートします。\\ するとプロジェクトのAssetsフォルダ内に「VirtualCast/RankingVCI」フォルダが生成されます。 **__サンプルシーン__**\\ **Assets/VirtualCast/RankingVCI/Template**のシーンを開くと、ランキングVCIのテンプレートが設置してあります。\\ テンプレートは3種類のテクスチャパターンがあり、これをベースにオブジェクトを追加、または中のオブジェクトを制作しているVCIに組み込みます。\\ {{:vci:asset:ranking1.png?direct&600|}}\\ ^RankingScriptDef^RankingScriptPop^RankingScriptCyber^ |{{vci:asset:ranking_sample_def.png?direct&250}}|{{vci:asset:ranking_sample_pop.png?direct&250}}|{{vci:asset:ranking_sample_cyber.png?direct&250}}| **__オブジェクトデータ__**\\ オブジェクトの構成は次のようになっています。\\ ^オブジェクト名^説明^ |Ranking_ControllerBack|ランキング入力パネルの戻るボタンです。アイテムを使うと前の文字になります。|{{:vci:asset:ranking_obj1.png?direct&250|}}| |Ranking_ControllerNext|ランキング入力パネルの進むボタンです。アイテムを使うと次の文字になります。|{{:vci:asset:ranking_obj2.png?direct&250|}}| |Ranking_ControllerEnter|ランキング入力パネルの決定ボタンです。アイテムを使うと文字入力や決定等を行います。|{{:vci:asset:ranking_obj3.png?direct&250|}}| |Ranking_PanelSet|ランキング入力パネルのボタンのスナップ情報・入力制限時間の表記がまとめらたオブジェクトです。|{{:vci:asset:ranking_obj4.png?direct&250|}}| |Ranking_Background|ランキングの一覧を表示するオブジェクトです。|{{:vci:asset:ranking_sample_def.png?direct&250|}}| ---- ===== テンプレートから新規作成 ===== テンプレートをベースにオブジェクトを追加していきます。\\ VCIデータに必要なコードも記述しているので、このまま出力できます。\\ {{:vci:asset:ranking2.png?direct&400|}}\\ ---- ===== 既存のVCIに組み込む ===== テンプレート内にある5つのオブジェクトを作成中のVCIへ移動します。\\ {{:vci:asset:ranking3.png?direct&400|}}\\ \\ また**Assets/VirtualCast/RankingVCI/Prefab**の中にも、同様のテンプレートオブジェクトがあるので、こちらを使用することも可能です。\\ prefabの中身を移動する場合ロックが掛かっているので、prefabオブジェクトを右クリック→**Unpack Prefab**を選択してロックを解除してください。\\ {{:vci:asset:ranking4.png?direct&400|}} ---- ===== ランキングスクリプトの追加方法 ===== ランキングの処理を追加するため、main.luaに専用のコードを追加する必要があります。\\ [[vci:sample:ranking#テンプレートから新規作成|テンプレートから新規にランキングVCIを作成する場合]]は、VCIデータに必要なコードが既に記述されているので省略します。\\ **__1.function.luaをコピー__**\\ {{ :vci:asset:ranking5.png?direct&400|}} **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 ---- ===== 整数型のスコアランキングを作る手順 ===== {{ :vci:asset:ranking6.png?direct&240|}} - ランキングスクリプトの**RANKING_TYPE**を**RANKING_TYPE_SCORE**に変更 - ランクインするタイミング(ゲームが終了後スコアが確定する時)に**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 --ランキングのスコアタイプ(上記から選択) ---(以下のランキングスクリプト省略)--- ---- ===== タイムアタック形式のランキングを作る手順 ===== {{ :vci:asset:ranking7.png?direct&240|}} - ランキングスクリプトの**RANKING_TYPE**を**RANKING_TYPE_TIMEATTACK**に変更 - ランクインするタイミング(ゲームが終了後スコアが確定する時)に**RankingStartEnteringTimespan(timespan)**を追加 ---ランクイン処理 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() | ランキングの時間的処理が入っています。\\ [[vci:script:reference:eventfunction#イベント関数一覧|updateAll()]]に記述します。 | | RankingScriptOnUse(use) | ランキングボタンの処理が入っています。\\ [[vci:script:reference:eventfunction#イベント関数一覧|onUse(use)]]に記述します。 | | RankingStartEnteringScore(score) | ランキングにスコアを追加します。\\ 引数のスコアでランクインする場合は自動的に入力ボタンが出現します。 | | RankingStartEnteringTimespan(timer) | ランキングにタイムを追加します。\\ 引数のタイムでランクインする場合は自動的に入力ボタンが出現します。 | | RankingTimerToString(timer) | ランキングに表示するタイムを文字列型に変換します。\\ 表記は「MM:SS.000」となります。 | | RankingInputComplete() | ランキング入力を完了させます。 | | IsInputtingRanking() | ランキング入力中の場合trueを、そうでない場合はfalseを返します。 |