リファレンス

アプリを作るための一覧です。コードから書き出したもので、説明の章(1〜8章)と食い違ったときは、こちらが正です。

Chapter 9

この章は、コードから書き出した一覧です。手で書いた説明(1〜8章)と食い違ったときは、こちらが正です(コードと食い違ったときは、コードが正)。


9.1 マニフェスト(ulexite-app.json)

アプリのパッケージの直下(package.json の隣)に置きます。version と作者は package.json が正です(VCC が読むのは package.json だけ)。テレビを作り直すときに読み、決まりに合わないところは Console にエラーで出ます(UlexiteAppManifest.Check)。

{
  "manifestVersion": 1,
  "id": "weather",
  "name": { "ja": "天気", "en": "Weather" },
  "version": "0.2.0",
  "publisher": { "name": "Ulexite Technologies", "url": "https://example.com" },
  "kind": "declarative",
  "runtimes": { "world": { "os": 1, "appServices": 4, "screens": "app.screens.json" } },
  "profiles": ["tv"],
  "permissions": [],
  "data": [],
  "settings": [],
  "budget": { "saveKB": 4, "imagesPerOpen": 1, "syncBytes": 256 },
  "releaseNotes": { "ja": "最初のバージョン", "en": "First version" },
  "icon": "Textures/icon.png",
  "category": "info"
}

トップレベル

項目型必須既定決まり・例
manifestVersionint必須—1 だけ
idstring必須—英小文字・数字・- で32文字まで(^[a-z0-9][a-z0-9-]{0,31}$)。アプリの appId と同じにします(例:weather)
nameobject必須—{ "ja": "...", "en": "..." }。両方書きます(片方でも欠けるとエラー)
versionstring必須—1.2.3 の形。package.json の version と同じにします
publisherobject必須—{ "name": "...", "url": "..." }。name は package.json の author.name(または Ulexite Technologies)と同じ
kindstring必須—native(U# で書く)か declarative(データで書く)
runtimes.worldobject必須—下の表。無いとワールドでは使えません
profilesstring[]必須—出す端末。今は tv だけです。tv が無いとテレビに出ません
permissionsstring[]任意[]ワールドでは空にします(入れるとエラー)
preinstalledbool任意false同梱(プリインストール)のアプリか。アプリ情報のラベルが「プリインストール」になります
iconstring任意""パッケージからの相対パス(例:Textures/icon.png)
categorystring任意""アプリストアの分類(例:media・info・tools)

runtimes.world

項目型必須既定決まり・例
osint必須—必要な Ulexite OS(ワールド)の版。1 以上。今は 1
appServicesint任意0必要な App Services の版。今は 4 まで。足りないとアプリストアが「本体の更新が必要です」と出します
entrystringnative は必須—画面を作る UlexiteAppBuilder のクラス名(例:UlexiteClockBuilder)
screensstringdeclarative は必須—画面の定義のファイル名(例:app.screens.json)

data(読むファイル)

マニフェストの data は、URL を直接指定するデータ(時差の表など)に使います。データで書くアプリの画面のデータは、定義のファイル(9.3)の assets・data に書きます。

項目型必須既定決まり・例
idstringurl を書くとき必須—英小文字・数字・- で32文字まで。焼き込みの名前は「アプリID-データの id」
feedstring任意—共通の feed の名前を読むとき(古い形。新しいアプリは url を使います)
urlstring任意—https の信頼済みドメインだけ:*.github.io・gist.githubusercontent.com・pastebin.com・*.vrcdn.cloud・*.disbridge.com
everystring任意—読む間隔(例:10m・6h・24h)

settings(アプリの設定項目)

アプリの画面から開く共通のパネルに出ます。最大 8 件。

項目型必須既定決まり・例
idstring必須—英小文字・数字・-・_ で32文字まで。重複不可
typestring必須—choice(選択)・toggle(オン/オフ)・order(選んで並べる)・time(時刻)
scopestring必須—local(各自。PlayerData)・global(全員共通。共有データ)・creator(制作者が焼き込む。変更不可)
choicesstringchoice・order は必須—選択肢の表の名前(Packages/vrc.ulexite.tv/Data/choices/<名前>.json。例:jma-areas)
defaultstring[]任意nullchoice は1つ、order は max 以下、toggle は true/false。@region で OS の地域になる
maxint任意3order の上限。1〜10
stepint任意5time の刻み(分)。1〜60
labelstring必須—翻訳キー(例:Ulexite.Clock.Setting.Alarm)
notestring任意—補足の翻訳キー

翻訳キーの書き方:マニフェストに書く label・note はキーそのもの(t: を付けない)です。データで書くアプリの定義(9.3)では t: を付けます。

budget(予算)

項目型既定上限決まり
saveKBint416自分の保存データ(PlayerData)の割り当て。Ulexite 全体で 60KB(うちシステムが 16KB)
imagesPerOpenint0—1回開く間に読む画像の枚数の目安(ワールド全体で5秒に1枚の枠を分け合います)
syncBytesint2561024共有データ(全員に同期する小さな値)の量。標準より小さく書いても標準(256)になります

releaseNotes

{ "ja": "...", "en": "..." }。アプリ情報に出ます。

足すだけの欄(今は読みません)

項目型決まり
pricingobject有料アプリ。type は free・paid・freemium。有料なら seller(販売元)と url(購入ページ)が必須。Ulexite はお金を扱いません
licenseobject有料アプリの確かめ方。type は key(ライセンスキー)・account(販売元のアカウント)、verify は確かめる先

9.2 App Services(services)

アプリは launcher ではなく services(App Services) を通して Ulexite TV の仕組みを使います。UlexiteApp の services フィールドに、ランチャーが Start で入れます(アプリ側で探す必要はありません)。

9.2.1 版と自分

窓口型説明
UlexiteAppServices.Versionconst int = 4窓口の版。マニフェストの runtimes.world.appServices と比べます
servicesVersionint実行中の窓口の版(Version と同じ)
LocalNamestring自分の表示名
IsCreatorbool自分がワールドの制作者か(設定ウィンドウの「制作者の表示名」と比べます)
IsOperatorbool自分が操作する人か(リモコンを持っている人。誰も持っていなければ UI のオーナー)
IsJapanesebool表示が日本語か
JstNowDateTime日本時間の現在時刻
TerminalNumberint端末の番号(1から。2台目は別の保存・別の feed になります)

9.2.2 翻訳と操作音

窓口戻り値説明
L(string key)string翻訳表から引く(無ければキーをそのまま返す)
_PlayCursor() / _PlayDecide() / _PlayNotify() / _PlayError()—操作音(テレビの位置から全員に聞こえます)
_PlaySound(AudioClip clip)—好きな音をテレビの位置から鳴らす

9.2.3 ループ再生

窓口戻り値説明
_PlayLoopLocal(UlexiteApp app, AudioClip clip, float seconds)—自分の手元だけのループ(時計のアラーム)。seconds で自動停止(0 は止めるまで)。アプリを閉じると止まります
_StopLoopLocal()—ローカルのループを止める
_PlayLoop(UlexiteApp app, AudioClip clip)bool全員向けのループ。操作する人だけが使えます(false なら断られています)
_StopLoop()—全員向けのループを止める

9.2.4 テーマ

窓口戻り値説明
_Theme(string name)Color色の名前(9.4)で引く。知らない名前は白

9.2.5 通知とトースト

窓口戻り値説明
_Notify(string appId, string id, int kind, int icon, string title, string body, float progress, int priority, bool canDismiss)—通知ウィンドウに出す。同じ id は書き換え。kind=UlexiteNotifications.KindSimple・KindProgress・KindAlert、icon=9.5、progress=0〜1(使わないなら負)、priority は 0〜89。通知を選ぶと appId のアプリが開きます
_NotifyButton(string appId, string id, int slot, string label, UdonSharpBehaviour target, string eventName)—通知にボタンを付ける(slot は 0〜1)。押した人の手元で target の eventName が呼ばれます
_RemoveNotify(string appId, string id)—通知を消す
_Toast(string title, string body, int icon, bool warn)—右上のお知らせ(ローカル)。同じ見出しは通知ウィンドウに1件だけ残ります

9.2.6 メディア(再生)

窓口戻り値説明
PlaybackAvailablebool再生できる状態か(再生アダプターが生きているか)
MediaStateint0 停止・1 読み込み中・2 エラー・3 準備完了・4 再生中・5 一時停止
MediaTime / MediaDurationfloat秒。ライブでは MediaDuration が無限
MediaIsLiveboolライブ配信か
MediaTitlestring再生中のタイトル
_Play(VRCUrl url, string title)—今すぐ再生(再生中なら割り込む)
_Queue(VRCUrl url, string title)—キューの末尾に足す
_TogglePlay() / _Stop() / _Next() / _Previous()—再生・一時停止/停止/次/前
_Seek(float seconds)—秒へ移動(ライブでは効きません)

注意:VRCUrl は焼き込んだものだけ渡せます(Udon は文字列から URL を作れません)。URL はマニフェストか定義の assets に書いてください。

9.2.7 画像

窓口戻り値説明
_RequestImage(VRCUrl url, UdonSharpBehaviour receiver, bool reload)—順番待ちで読む(ワールド全体で5秒に1枚を Ulexite TV がまとめます)。届いたら receiver の _OnImageLoaded/_OnImageError
_GetImage(VRCUrl url)Texture2D置き場にあれば返す(無ければ null。一度頼んだら二度と頼まない作りにしない:無ければ _RequestImage)
_ReleaseImage(VRCUrl url)—使い終わった大きい画像(地図に重ねる画像など)を捨てる

9.2.8 データ(feed)

アプリ ID の feed(マニフェスト/定義の data で id を書いたもの)

窓口戻り値説明
_RegisterFeed(string appId, int mode, float interval)bool取り方を登録(_Init で)。mode=UlexiteFeedLoader.ModeOnOpen・ModeBackground・ModeAlways、interval は秒
_ReloadFeed(string appId)—今すぐ読み直す
_FeedKey(string appId)stringfeed のキー(<端末の番号>/<アプリID>)
_FeedText(string appId)string届いた文字列(無ければ null)
_FeedJson(string appId)DataDictionaryJSON として読んだもの(読めなければ null)
_FeedStatus(string appId)intStatusNone(0)・StatusLoading(1)・StatusFresh(2)・StatusStale(3)・StatusFailed(4)
_FeedLoadedAt(string appId)int読めた時刻(サーバー時刻のミリ秒)
_CommonFeed()DataDictionary共通の feed(地震・津波・警報・注意報・お知らせ・最新バージョン)

URL を直接指定するデータ(マニフェストの data.url。時差の表など。名前は「アプリID-データの id」。App Services 3 以降=Ulexite TV 0.4.0 から)

窓口戻り値
_RegisterDataFeed(string appId, string dataId, int mode, float interval)bool
_ReloadDataFeed(string appId, string dataId)—
_DataFeedText(string appId, string dataId)string
_DataFeedJson(string appId, string dataId)DataDictionary
_DataFeedStatus(string appId, string dataId)int
_DataFeedLoadedAt(string appId, string dataId)int

9.2.9 保存(PlayerData)

窓口戻り値説明
StorageReadybool保存が読めるようになったか。OnPlayerRestored の前は読み書きしない(書いても false)
_SaveString(string appId, string key, string value)bool自分の保存に書く(キーは自動で ulexite_t<端末>_<アプリID>_<key>)
_SaveInt(string appId, string key, int value)bool同上(整数)
_LoadString(string appId, string key, string fallback)string読む(無ければ fallback)
_LoadInt(string appId, string key, int fallback)int同上(整数)
_LoadPlayerString(VRCPlayerApi player, UlexiteApp app, string key, string fallback)stringほかの人の保存を読む(書けるのは本人だけ)
_LoadPlayerInt(VRCPlayerApi player, UlexiteApp app, string key, int fallback)int同上
_LoadPlayerStringId(VRCPlayerApi player, string appId, string key, string fallback)stringappId を文字列で渡す版

注意:他人の PlayerData は読めますが、書けるのは本人だけです。1つのキーが変わると全員の PlayerData が送られるので、キーは少数にまとめ、よく変わるものは共有データへ。

9.2.10 共有データ(全員に同期・インスタンスの間だけ)

窓口戻り値説明
_SharedSetInt / _SharedSetFloat / _SharedSetBool / _SharedSetString (string appId, string key, T value)bool書く。書けるのは操作する人(ほかの人はオーナーへの依頼。0.5秒に1回まで)
_SharedInt / _SharedFloat / _SharedBool / _SharedString (string appId, string key, T fallback)T読む(無ければ fallback)

注意:文字は 128 字まで(長いものは切られます)。< は全角になります(外部の文字でリッチテキストを使わせないため)。保存はされません(インスタンスの間だけ)。

9.2.11 確認ダイアログ

窓口戻り値説明
_Confirm(UlexiteApp app, string eventName, string title, string body, string yes, string no, bool danger)bool開けたら true。操作する人でなければ開かずに false。答えは答えた人の手元で app の eventName に届き、DialogAccepted を読みます
DialogAcceptedbool答え(イベントの中で読む)。「いいえ」・閉じた・操作する人がいなくなった・ほかのアプリに移った、は false

9.2.12 文字入力

窓口戻り値説明
_RequestText(UlexiteApp app, string eventName, int kind, string title, string example, string hint, int maxLength)bool開けたら true。kind=UlexiteTextInput.KindText・KindNumber、maxLength は 64 まで
TextAccepted / TextResultbool / string答え(イベントの中で読む)

注意:URL はここでは受け付けません(Udon は文字から URL を作れないため)。URL は VRCUrlInputField を自分で置いてください。

9.2.13 地域・設定・そのほか

窓口戻り値説明
_Region()stringOS の地域(jma-areas の6桁コード)。テレビの全員で同じ・無ければ 130000(東京都)
_SetRegion(string code)bool地域を変える(6桁の数字だけ・操作する人だけ)
_SettingString(UlexiteApp app, string id, string fallback) / _SettingInt / _SettingBoolstring / int / bool設定の値(宣言が無ければ fallback)。@region は地域に置き換わります
_SettingOrderCount(UlexiteApp app, string id) / _SettingOrderKey(UlexiteApp app, string id, int index)int / stringorder の件数・i 番目(空の項目は数えません)
_SetSettingInt(UlexiteApp app, string id, int value) / _SetSettingString(UlexiteApp app, string id, string value)bool設定を書く(操作する人だけ。creator は書けません)
_ClearAppData(UlexiteApp app)—アプリの保存を空にする(アプリ固有のキーは _OnServicesClearData で消す)
_OpenSettings(UlexiteApp app)boolアプリの設定パネルを開く
_ProvideScreensaver(UlexiteApp app, VRCUrl image, string caption)boolスクリーンセーバーに出す画像とひとことを登録(「裏でも取る」アプリだけ)
_LoadingBegin(UlexiteApp app, bool hasData) / _LoadingEnd(UlexiteApp app)—読み込みの表示(hasData が true なら右上に小さく「更新中…」、false なら中央に「読み込み中…」)
_OpenApp(string appId, string action, string arg)bool別のアプリを開く(action・arg は開いたアプリの _OnServicesAction に届く。呼んだ人の手元だけ)

9.2.14 アプリに届くイベント

必要なものだけ書けばよいです(書かなければ何も起きません)。

イベントいつ
_Init()作られたとき(1回)。feed の登録はここで
_OnOpen() / _OnClose()開いた/閉じた
_OnRender()フォーカスやタブが変わった
_OnServicesFeed()自分のデータが届いた/状態が変わった
_OnServicesCommonFeed()共通の feed が届いた
_OnServicesStorageReady()保存データが読めるようになった
_OnServicesStorageChanged()保存データが変わった(ほかのテレビで書いたときも)
_OnServicesSharedChanged()共有データが変わった
_OnServicesSettingsChanged()設定が変わった
_OnServicesMinute() / _OnServicesDayChanged()毎分/日本時間で日付が変わった
_OnServicesRegionChanged()OS の地域が変わった
_OnServicesAction()ほかのアプリから動作を指定して開かれた(ActionName・ActionArg)
_OnServicesLoadRetry()読み込みに失敗して「再試行」が押された
_OnImageLoaded() / _OnImageError()_RequestImage の答え
_OnServicesClearData()_ClearAppData でアプリ固有のキーを消す

9.2.15 呼ぶ順と気をつけること

  1. _Init で feed を登録(_RegisterFeed/_RegisterDataFeed)。開いたときに読み直すのは _OnOpen で _ReloadFeed
  2. 保存は StorageReady が true になってから。_Save* が false を返すときは、まだ読めていないか、ID の形が違います
  3. 確認と文字入力は「操作する人」だけ。false が返ったら開けていません(操作していない人から呼ばれた)
  4. 答えはイベントで受ける。_Confirm の戻り値は「開けたか」だけで、はい/いいえは DialogAccepted
  5. 通知の id はアプリの中で一意に。同じ id で書き換えます。消すときは _RemoveNotify
  6. _OpenApp の動作と引数は同期しません(開くことだけ全員にそろう)。開いたアプリが結果を自分で同期してください
  7. Udon の制約:List は使えません(配列か DataList)。例外が出た UdonBehaviour はそのセッション止まるので、重い処理は分けます(3章)

9.3 データで書くアプリ(定義のファイル)

runtimes.world.screens に書いたファイル(app.screens.json)の中身です。書き方は 4章。

9.3.1 トップレベル

項目型必須説明
formatint必須1
langstring任意翻訳表のファイル名(例:lang.json)
settingsarray任意アプリの設定項目(9.1 の settings と同じ形。label は t: 付き)
assetsobject任意{ "files": { "<名前>": { "url": "...", "each": "<選択肢の表>" } }, "images": { ... } }。URL を焼き込みます
dataarray任意{ "id": "...", "file": "...", "every": "10m", "when": "screen:map", "background": true }
mapsobject任意値 → 文字・色・アイコンの対応表
tileobject任意ホームのタイル({ "icon": "...", "text": "..." })
screensaverobject任意スクリーンセーバーに出すもの
screenobject必須画面(下)

9.3.2 画面の型

型状態中の項目
tabs使えるtabs[](id・label・width・screen)
dashboard使えるcards[](size=wide・when・style・parts[])
list-detail使えるlist(items・row・columns・title・max・select・footer)・detail・banner・note
map使えるbase(world・japan)・layers[](image・frames・points・marker)
gridまだタイルの格子(ライブカメラ用)

9.3.3 部品

cards[].parts[] に書きます。

部品状態主な項目
text使えるtext・style(caption・title・strong・mono)・lines・when
value使えるvalue・label・unit・icon(大きな数値の横にアイコン)・when
note使えるnote(出典・注意書き)
icon使えるicon(名前は 9.5)・size(hero)・when
badge使えるbadge(text・color)・size(hero)・when
badges使えるbadges(値の道筋)・badge(1件の形)・max(既定 6)
strip使えるstrip(値の道筋)・heading・card(parts[])・max
list使えるlist(値の道筋)・max・row(parts[])
imageまだassets の画像(写真・QR)
chartまだ折れ線・棒(点は12まで)
buttonまだ動作を呼ぶボタン
customまだU# で書いた部品をはめる

9.3.4 値のはめ込みと整形

{{ 道筋 }} で値をはめ、| でつないで整形します。

関数例結果
num:<桁>{{ 18.44 | num:1 }}18.4
unit:<単位>{{ 18 | unit:℃ }}18℃
time / time:dayAware{{ "2026-10-18T21:20:00+09:00" | time }}21:20
date / date:weekday / date:short10月19日/月/10/19
ago3分前
map:<表>{{ "100" | map:wxIcon }}表の値
choice:<選択肢の表>{{ "130000" | choice:jma-areas }}東京都
scale:<名前>{{ 31 | scale:temp }}temp は色の名前(下記)。それ以外は muted
localized:<欄>{{ area.current.wxText | localized:wxTextEn }}英語の欄(欄に . が無ければ値と同じ道筋の欄)
t:<キー>{{ "weather.now" | t }}翻訳
fallback:<値>{{ x.wx.code | fallback:t:metar.noWx }}値が無いときに使う

scale:temp は 0 未満が #7fb0e8、10 未満が #a8c7fa、20 未満が #e3e3e6、30 未満が #f2d16b、それ以上が #ff8a65 です。


9.4 テーマの色

アプリは色を直接書かず、名前で引きます(native は services._Theme("surface")、データで書くアプリは maps の色の名前)。値はテレビの既定のテーマです。

名前既定の色使いどころ
background#101214画面の地
surface#24272bカード・ボタンの地
surface2#1b1e22一段暗い地(帯・入れ子)
dialog#2a2e34ダイアログの地
dialogItem#33373dダイアログの項目
text1#e3e3e6本文
text2#c4c6cc一段弱い文字
text3#a0a4ab補足
text4#8c9097いちばん弱い文字(出典など)
divider#3a3e44区切り線
accent#a8c7fa強調(リンク・選択)
focus#ffffffフォーカスの枠
live#ff6b6bLIVE・録画の印
track#4a4e55スライダーの溝

札(badge)の色

札の色は意味の名前で書きます(maps や badge.color)。文字の色と、level5 の囲み線は OS が決めます。

名前地の色文字用途
danger#ff6b6b暗い危険
warning#f7a35c暗い注意
caution#f2d16b暗い注意報
info#a8c7fa暗い情報
muted#8c9097暗い弱い
level5#0b0b0c白+囲み線特別警報
level4#7a3fc2白危険警報
level3#d8383a白警報
level2#f2c230暗い注意報
int1〜int7int1 #4a5260・int2 #2f6fd0・int3 #24865a・int4 #f2c230・int5l #f59a3c・int5u #bf4e1c・int6l #d8383a・int6u #9e1f2c・int7 #7a3fc2震度ごとに白/暗い震度(int5l・int5u・int6l・int6u は「5弱」など)
vfr・mvfr・ifr・lifr#5fd18b・#6fa8ff・#ff7a7a・#d68cff暗いMETAR の飛行区分

防災のレベルと震度、飛行区分はテーマで変わりません(気象庁の色に合わせています)。


9.5 アイコン

通知・トーストのアイコン(_Notify・_Toast の icon)

UlexiteAlerts の定数です。

値定数絵
0UlexiteAlerts.IconInfoinfo
1UlexiteAlerts.IconWarnwarn
2UlexiteAlerts.IconRetryretry
3UlexiteAlerts.IconAddadd
4UlexiteAlerts.IconSleepsleep
5UlexiteAlerts.IconClockclock
6UlexiteAlerts.IconAlarmalarm
7UlexiteAlerts.IconCitycity

部品のアイコン(icon 部品・value の icon・K.Icon の名前)

add・alarm・alert・back・city・clock・cloud・dot・epicenter・gear・home・info・info-circle・link・media・moon-0〜moon-7・next・pause・play・power・previous・rain・recall・remote・retry・services・sleep・snow・spinner・stop・store・sun・tv・warn


9.6 画面のコード例

実際に動いているアプリから読むのがいちばん確かです。

見たいことファイル
U# のアプリの全体(時計)Packages/vrc.ulexite.app.clock/Runtime/UlexiteClockApp.cs
画面の組み立て(UlexiteAppBuilder・K.*)Packages/vrc.ulexite.app.clock/Editor/UlexiteClockBuilder.cs
マニフェストと翻訳表Packages/vrc.ulexite.app.clock/ulexite-app.json・Localization/ulexite-clock-lang.json
ホームのタイル(ライブタイル)Packages/vrc.ulexite.app.clock/tile.json・UlexiteClockApp.GetTileWidget
データで書くアプリの見本天気アプリ(app.screens.json・lang.json・*.sample.json)
開発キットの「新しいアプリ」のひな形Packages/vrc.ulexite.devkit/Editor/UlexiteNewApp.cs

時計アプリで分かること:_Init での feed 登録、_SettingString/_SettingOrderKey での設定の読み方、_SaveString での保存、_PlayLoopLocal でのアラーム、GetTileWidget でのライブタイル、UlexiteBuildKit(K.CreateApp・K.Rect・K.Tmp・K.Focus)での画面の組み立て。


9.7 版

もの値
Ulexite TV0.3.0(Packages/vrc.ulexite.tv/package.json)
Ulexite OS(ワールド)1(UlexiteSystem.OsVersion)
App Services4(UlexiteAppServices.Version)・1.1.0(Release)

目次に戻る