Urwigoを使った Wherigo作成講座 atsu_7, Event Cache GCB4ZFQ , 2025/4/12 1
この資料について ダウンロード https://x.gd/EnaFg 筆者 質問等メッセージセンターからご連絡ください! 2
目次 1. Wherigoとは? 2. Urwigo ハンズオン初級編 …ツアー式Wherigoを一緒に作る 3. Urwigoハンズオン中級編 …Timer、Item、Variablesなどを追加する 4. 資料:上級者向けTips 5. 資料:超上級者向けTips…Luaスクリプト 3
Wherigo • Groundspeak社が開発したカートリッジとGPS端末を使った ゲーム。位置ゲーが作れる! • 2008年リリースだが、あまりメンテナンスされていないのでバ グが多い。気楽にやることが大事。 • ウェアリゴ?ウェアイゴ?ウェリゴ? 4
どんなゲームが作れる?AdventureLabと違う? Adventure Labのようなツアー型だけでなく、アイデア次第で何 でも作れる!(インターネットを介した通信はできないと思います) • ツアー:Chushingura / 忠臣蔵 GCAFECR(10ttlさん)、Modern Architectures in Tokyo GC1A5BB(ij_nekさ ん) • Reverse(距離からキャッシュを探す):ジャイアントパンダからのお散歩 panda GCATD0R(clamchamponさん) A walk from the giant • 制限時間がある:Hongo Walk Rally Day2 GCAXM7Z • 隠しゾーンを探す:I Tokyo GCAXZCY • どこからでもプレイできるクイズ:Geocaching 25 Years History Museum GCB4PCX • ランダムに行き先が変わる:谷中七福神みくじ/Yanaka Seven Lucky Gods omikuji GCAZFRC • キャラクターが登場するゲーム:Sakura bridge game GCB599G 5
Wherigo Player(遊ぶ側) • Android • WhereYouGo…老朽化によりc:geoに統合された。 • c:geo (beta) • Geooh GO • iOS • Wherigo…GroundSpeak公式。安定しているらしい。 6
Wherigo Builder(作る側) アプリ名 プラットフォーム 作れるもの 筆者動作確認 (win 11) Wherigo Builder(公式) Windows 何でも Earwigo web 何でも Urwigo Windows 何でも 〇 何でも △ Luaスクリプトを書く Wherigo//kit web ツアー形式のみ 〇 Reverse wherigo カートリッジ上 Reverse wherigoのみ 〇 Lovewigo web I ♡ place 形式のみ 〇 7
おすすめBuilder「Urwigo」 • https://www.urwigo.cz/?page_id=6 • GUIでブロックを操作しながらプログラミング • 何でも作れる(上級者はLuaスクリプトブロックも 使える) • 日本語入力もok(UTF-8対応) • コンパイラ、エミュレータ付属 • チェコのGCer「yourself」さんが作った 8
Wherigoカートリッジの構成 (興味ある人向け) Lua スクリプト zip圧縮 メディア (画像音声) パッケージ .gwz Groundspeak wherigo zipと いう拡張子だが、ただのzip。 拡張子を変えてコードを展 開できる。 Urwigoはプログラミング・パッケージ作成をGUIで操作できる コンパイル Wherigo.comにアップロードする とコンパイルされる (テスト用にUrwigo上でコンパイ ルすることも可能) カートリッジ .gwc 遊ぶ際はこれをダウンロード。 特別に逆コンパイルしない限り コードは読めない。 9
Urwigoハンズオン初級編 簡単なカートリッジを、画面を見せながら一緒に作っていきます 10
作るもの • JR神田駅からスタートし、JR秋葉 原駅まで歩く ゾーン2 • それぞれの駅でクイズに答える • 秋葉原駅でのクイズに正解すると 最終座標が表示される。 ゾーン1 11
イベント駆動 • Wherigoはすべてイベント駆動。 • たとえば、 「カートリッジが起動されると…メッセージ表示」 「ゾーンAに入ると…質問を表示」 「回答入力があると…正誤判定」 12
オブジェクト • Zones, Inputsなどを最初にまとめて作成しておく • Zones…「神田駅」「秋葉原駅」「最終GZ」 • Inputs(質問の入力と回答)…「神田駅クイズ」「秋葉原駅クイズ」 • それぞれの設定で、イベントを設定する • 例「神田駅」のOn enterイベントに、「『神田駅クイズ』を表示する」を設定 • (Zonesクラス、Inputsクラスなどのインスタンスを作成し、プロパティ とイベントハンドラを設定しておくイメージ。) 13
今回設定するイベント カートリッジ起動 Zone「神田駅」に入る Input「神田駅クイズ」の入 力を受付 メッセージ表示 Input「神田駅クイズ」を表示 正誤判定 メッセージ表示 zone「秋葉原駅」をアクティブ化 zone「神田駅」を非アクティブ化 Input「神田駅クイズ」を表示 14
今回設定するイベント(続き) Zone「秋葉原駅」に入る Input「秋葉原駅クイズ」の 入力を受付 Input「秋葉原駅クイズ」を表示 正誤判定 メッセージ表示 Zone「秋葉原駅」を非アクティブ化 zone「最終GZ」をアクティブ化 Input「秋葉原駅クイズ」を表示 15
画面の見方 用意された プログラミング用 ブロック 選択した オブジェクトの プロパティなど (↑関数、↓式) メイン画面(タブ) ドラッグ&ドロップしてプログラミングする 自分が作成した オブジェクト 16
手順1 カートリッジ設定 1. Cartridgeタブを開く 2. General>Name, Description、Display>Image、Icon、 Cartridge>Activity type、Start、Authorなどを適当に設定。 • Description、Activity type、Authorはwherigo.comに表示され る情報。あまり重要ではないと思う。 • StartはEdit in mapで設定できる。空欄にするとPlay Anywhere。 17
18
手順2 Zones作成 1. 左下からZonesをダブルクリックしZones一覧タブを開く 2. New itemをクリック 3. 右パネルでNameを設定(神田駅) 4. 右パネルでBorder PointsをEdit in Mapで設定(三角形以上) 5. 神田駅はDisplay=True, Active=True, 秋葉駅、最終GZは Display=True, Active=Falseに設定。(✓がTrue) 6. 秋葉原駅、最終GZも同様に作成 19
ZoneのDisplayとActiveについて • Displayは、プレイ画面に表示されるかどうか • Activeは、イベントが発生するかどうか • ただしActive=FalseのときDisplayにかかわらず非表示になる • つまり基本的には、Display=TrueにしておきActiveを切り替えればOK • 最初に行くゾーンはどちらもTrueにする • 二つ目以降に行くゾーンはActiveをFalseにしておく • I♡Tokyoの隠しゾーンはDisplay=False、Active=True 20
ZoneのDisplayとActiveについて Display Active 使い道 Locations表示 イベント発生 Urwigoエミュ レータでの表 示 True True 普通のゾーン 〇 〇 青色 False True I♡Tokyoの 隠しゾーン 〇 赤色 True False (後でActive化し て使う) False False (後でActive化し て使う) (注意) 灰色 灰色 エミュレータでは全てのゾーンが見えるが、色で状態が示されている↑ 21
22
手順3 Inputs作成 1. 左下からInputsをダブルクリックしInputs一覧タブを開く 2. New itemをクリック 3. 右パネルでNameを設定(神田駅クイズ) 4. Questionに問題文を入力(「JR神田駅のスリーレターコード は?」) 5. 秋葉原駅クイズ同様に作成 23
24
Inputsの補足とバグについて • Choice(選択式)は、Input choicesに改行区切りで選択肢を入 力しておく。全角文字を入れると正誤判定できないことがある。 • True/Falseは、正誤判定できないことがある。ChoiceでTrue, Falseの選択肢を自作する方が安全。 25
手順4 カートリッジ起動イベントの設定 カートリッジ起動 1. Cartridgeタブ>Events>on startをクリック 2. 左パネル >Actions>Messageをド ラッグ 3. “”に右パネルでメッセージ を設定 「神田散歩へようこそ。ま ずは神田駅に行きましょ う」 メッセージ表示 26
エミュレーターで確認してみましょう! • Build>Run>UTF-8 Encoding 27
手順5 ゾーンに入った時のイベントの設定 Zone「神田駅」に入る 1. Zonesタブ>神田駅>Events>on enterをクリック 2. 左上パネル>Actions>Inputをド ラッグ 3. Input内に左下パネル>Inputs>神田 駅クイズをドラッグ Input「神田駅クイズ」を表示 28
手順6 Inputの回答受付イベントの設定 Input「神田駅クイズ」の入力を受付 Inputs>神田駅クイズ>on get input 正誤判定 を設定 正解 ★条件分岐はif/else - メッセージ表示 zone「神田駅」を 非アクティブ化 zone「秋葉原駅」 をアクティブ化 Input「神田駅 クイズ」を表示 ★ゾーンのアクティブ化は Setに秋葉原駅>Activeを ドラッグし、=Trueに。 29
手順7 秋葉原駅も同様に Zone「秋葉原駅」に入る Input「秋葉原駅クイズ」を表示 30
手順8 秋葉原駅クイズも同様に Input「神田駅クイズ」の入力を受付 正誤判定 正解 - メッセージ表示 zone「秋葉原駅」 を非アクティブ化 zone「最終GZ」を アクティブ化 Input「秋葉原駅クイズ」 を表示 31
手順9 画像を入れる Mediaに追加してから、それぞれのプロパティで画像を選択する 32
手順10 エミュレータでテスト&ビルド! • 色々なパターンでテストしましょう。 • Build>Build package(gwz)>UTF-8 encodingでgwzをエクス ポート。 • 実機・実地でもテストしましょう(次の手順)。 33
手順11 Wherigo.comにアップロード テスト時はinactiveにしておけば、リンクを知っている人だけが ダウンロードできます。スマホでダウンロードしてテスト。 テストが完了したらGeocaching.comから申請。Wherigoのダウ ンロードリンクを貼るのを忘れずに。 34
番外編:Description書き専用chatGPT • Geocacheのディスクリプションを書くことに特化したカスタ ムGPTを作りました。色々なキャッシュタイプに対応してます。 • 適当に情報を与えると、日英両言語のHTMLを出力してくれま す。 • 画像も生成できます • https://chatgpt.com/g/g67f74fad1f2c8191960bdf6280846bff-geocaching-descriptionraita 35
Urwigoハンズオン中級編 他のオブジェクトの使い方を紹介。 ここが一番知りたいところかもしれません。 文章では概要だけを書いているため、urwigoを触りながら確認してください。 36
Variables…例:点数管理を追加 1. Variablesに変数「Points」を作成 2. 正解判定時にIncrementでPointsを+1する 3. 適当なタイミング(最後or毎回)で、If, CompareでPointsを 判定する 4. 点数を文字列中に表示したいときはconcatenateで変数と文 字列を結合する • n問中m問正解などの判定に使える(例:25 history museum) • ゾーンイベントでIncrementをすれば、順不同にnゾーン巡ると きの判定に使える(例:Sumida river, I♡Tokyo) 37
タイマーを追加 1. Timerに「Timer1」を作成。Countdownの秒数を設定。 2. 何らかのイベントで、Start Timer(Timer1)を実行 3. Timer1のOn elapseイベントに割り込みたい関数を設定 1. たとえば、「クイズ1を表示」「ゴールゾーンを非アクティブ化」 などを設定すれば、ペナルティとしてゲームの流れをリセットする ことができる。 2. 課題をクリアしたときなどはOn elapse前にStop Timer(Timer1)を実 行することでペナルティ発動を回避 • Timerは不安定になりがちなので短時間・単一で使うのが良い • バックグラウンドで動くかは不明。長時間の経過時間判定は時 刻を使うのが良いか 38
Hongo walk rally の仕組み イベント 処理 Startゾーンに入る Goalをアクティブ Startを非アクティブ Timer1をStart Timer1がelapse Goalを非アクティブ Startをアクティブ タイムリミット経過 Goalゾーンに入る こうなると、プレイヤーは スタートに戻らなければいけない Goalを非アクティブ Timer1をStop 39
itemを追加(characterも同様) 1. Itmesに「Item1」を作成。 2. ItemのLocationを設定 1. PlayerにするとInventoryに入る 2. ZoneにするとそのZoneに入った時にI seeに入る 3. Descriptionに最終座標を書いたり、コマンドを設定したりし て使う 4. 移動させる時はmoveを使う 40
item, characterのcommand それぞれにcommandを設定でき、アクションを実行できます。 41
最終座標の表示方法のプラクティス • メッセージを出す(消えるので下記の方法も併用すると良い) • 最終GZのゾーンを作り、最後にDisplay=Trueにする。 • Itemに「最終座標」を作り、最後にinventoryに入れる。 42
Functions 1. Functionsに関数を追加しておくと、繰り返し使うことができ る。関数を使う際には、Call Functionを使う。 43
Tasks ユーザーに指示を与えるTodoリストを作成できます。 1. Tasksを追加 2. set(task1.complete) で完了/未完了を設定できます。 44
乱数や時間での条件分岐 • Random decisionで分岐 • 時間とif文で分岐 • 例えば Hourの剰余で分岐すると時間毎に結果が変わる 45
Distance to a zone Reverse wherigoなどで使う 右パネルをValueにすると距離の値が返される。 その他はゾーン内かどうかのTrue or Falseが返る。 46
資料:上級者向けTips 上級者向けに、UrwigoやWherigoの細かい設定について記載しておきま す。 47
関数やゾーンのグローバル設定 • Cartridge>Global Eventsを使えば、全てのゾーンに共通したイ ベントを設定可能。各ゾーンのイベントハンドラの最初にこの 関数が実行される仕様のよう。 • 左下パネルから「Current Objects」を引数に渡せば、自身のイ ンスタンス変数を使える(self) 48
Zoneのproximity, distant ZoneにはBorderのほかに proximityとdistant(range)とい う概念があり、そこでもイベン トを発火できる。 zone Distantはvisibilityの範囲になる。 デフォルト設定では無限大に proximity distant なっているため気にしなくても 良い。 49
ZoneのActive, Display管理のプラクティス ActiveにするとDisplayにかかわらず非表示になってしまう。 イベント発生は終了しても表示はさせておきたい場合、Activeに しておきつつ、訪問済のフラグをTaskで管理しておき、イベン トハンドラ内で条件分岐するとよい。 50
資料:超上級者向けTips Luaスクリプトを組み込む方法などについて。 よくテストしてから使ってください。 51
Urwigoが出力するlua • wherigoライブラリを使いつつ、チートを防ぐためのメッセージや 座標の暗号化関数が追加されている。 • 上手く解読して真似すれば手書きできるはず。 実際、webアプリ「wigolove」はこの形式のluaコードをjavascript で生成しているよう。 • luaからgwzを作成する際、zipの作り方によってコンパイルエラーに なるので注意。 52
Urwigoのluaコードブロック • Luaブロックを使うと、左パネルにない関数を実行できる。 • gwzを書き出して中のluaを見ると見通しが良い。グローバルで宣言 されている変数が使える。Wherigoライブラリのdocsはこちら。 • たとえばプレイヤー座標は、Player.ObjectLocation.latitude等で取得。 • GUIでインスタンスのidentifier欄を入力すると、その変数名になる。 • たとえばzone1というidentifierを設定したゾーンがある場合、luaブロックで zone1.points(zone1の境界座標の集合)を参照/書き換えできる。 53
RandomDecisionのシード値設定について デフォルトでmath.randomseed(os.time())に なっています。 たとえばシードを1時間ごとに変えたい場合は 左図。乱数引き直し対策に使える。 と思いましたが、Androidでは上手く動きまし たがiOSではシードが固定されませんでした。 54
Reverse wherigoのような汎用カートリッジの作り方 • CreateとPlayのモードを準備しておく。 • Createでは、ユーザが入力した最終座標を何らかの暗号化関数*でパ スコードに変換する。 • Playでは、プレイヤーが入力したパスコードを復号して内部で最終 座標を保持し、ゲームに使う。 • *暗号化関数は、あまり複雑ではないが、一見した限りでは推測され ないような“良い感じ”になっていると思われる。 55