tanaka's Programming Memo

プログラミングについてのメモ。

【Windows】Re:VIEWの校正環境を構築する

この記事でRe:VIEWでPDFを作成できる環境を作りました。

am1tanaka.hatenablog.com

せっかくなので校正環境も動かしてみます。textlintとprhの校正をWindowsに導入した時の手順です。

目次

前提

次のものを使います。

書籍フォルダーをVSCodeで開く

作業はVSCodeでできます。

  • VSCodeを開きます
  • 書籍用のワークスペースが開いていなければ、FileメニューからOpen Workspace from File...を選択して、書籍用フォルダー内のワークスペースファイルを選択します
  • TERMINALタブが開いていない場合は、ViewメニューからTerminalを選択して開きます

TERMINALを開く

  • 画面下のTERMINALタブで以下を実行して、textlint本体、textlintのRe:VIEW用のプラグイン、校正ルール各種をインストールします
npm i --save-dev textlint textlint-plugin-review
npm i --save-dev textlint-rule-preset-ja-technical-writing
npm i --save-dev textlint-rule-preset-ja-spacing textlint-rule-prh
npm i --save-dev textlint-rule-preset-jtf-style

インストールが完了して、VSCodeの右下にExtensionのrecommendedが表示されたら歯車アイコンをクリックしてDon't show againをクリックします。エラーはxをクリックして閉じて構いません。

パッケージがインストールできたら続けて設定をします。

New File

  • ファイル名を.textlintrc.jsonにします
  • 次の内容を入力します
{
  "plugins": [
    "review"
  ],
  "rules": {
    "preset-ja-technical-writing": true,
    "preset-ja-spacing": true,
    "preset-jtf-style": true,
    "prh": {
      "rulePaths": [
        "./articles/prh.yml"
      ]
    }
  }
}
  • VSCodeに貼り付けた時にインデントがズレるかも知れません。その場合は例の通りインデント1つ分を半角スペース2文字にしてください
  • 上書き保存します

ルールにTechBoosterさんのものを加えるためにrulePathに./articles/prh.ymlを指定しています。これでprhの校正もtextlintで実行できます。

これでコマンドラインで以下を実行するとtextlintで校正が実行できます。

npx textlint ./articles/*

以下のような感じであれこれ指摘してきたら実行成功です。

実効例

もしno ruleのように表示されて何もそれらしい指摘が表示されなかったら、.textlintrc.jsonのファイル名や内容にスペルミスがないか探してみてください。

VSCodeのExtensionをインストールする

コマンドラインで確認するのは面倒です。VSCodeで随時チェックするようにtextlint用のExtensionをインストールします。

  • VSCodeの左のメニューからExtensionsをクリックします

Extensions

  • Search Extensions in Marketplace欄にatsushienoと入力します
  • Re:VIEWが表示されたらINSTALLします
  • インストールが完了したら次はtextlintと入力します
  • vscode-textlintをINSTALLします

機能拡張

  • vscode-textlintの歯車アイコンをクリックして、Extension Settingsをクリックします

vscode-textlintの設定

  • Workspaceタブをクリックして、Textlint: Languages欄のEdit in settings.jsonをクリックします

Textlint: Language

  • 次のように言語にreviewを書き込みます
{
    "textlint.languages": [        
        "review"
    ]
}
  • Ctrl+Sキーで保存します

以上でインストールと設定完了です。

設定が正しく初期化されるようにVSCodeを閉じます。数秒待ったらVSCodeを起動し直してください。

検証の確認

VSCodeエディター上での動作を確認してみましょう。

  • EXPLORERに切り替えて、articlesフォルダー内のarticle.reをクリックして開きます。

article.reを開く

  • 以下の文章を入力、あるいは、コピペします
Re:VIEW で書くのである。

それは良いことです。

(括弧)
  • Ctrl+Sキーで保存します

保存して、以下のようにあちこちに警告が表示されればtextlintの動作確認完了です。prhのルールも適用されています。

問題個所を指摘!

動かない場合はこれまでの設定を確認したり、VSCodeの再起動などしてみてください。

Re:VIEWファイルのプレビューを表示する

インストールしたRe:VIEWのExtensionでプレビューの表示をしてくれます。

  • article.reを開きます
  • 右上に表示されるShow previewをクリックします

Show preview

プレビューを見ながら執筆できます。

エラーが出る場合はVSCodeを閉じます。少し時間をおいたらVSCodeを開いて再操作してみてください。

articlesフォルダーの全チェック

TERMINALから以下を実行すると、articlesフォルダー内の全てのファイルを校正チェックします。

npx textlint ./articles/*

textlint側の問題があれば表示されます。

textlintのエラー

Macについて補足

自分のMac上ではvscode-textlintがエディター上で動作しませんでした。そこで、prh-languageserverをnpmでインストールして、prh - ProofReadingHelper機能拡張プラグインをインストールしてprhで動かしました。

まとめ

以上でVSCodeRe:VIEWの執筆環境の構築ができました。当初はtextlintとprhを個別に動かすのかと勘違いしていて、prhしか動かずに混乱していました。prhの校正も含めてtextlintでチェックさせるのが正解でした。もう一点引っかかったのが、vscode-textlintにreファイルを認識させる方法でした。設定の書き方が分からず、手探りで"review"と書けば動くことにたどり着きました。

やや苦戦しましたが、環境が構築できればあれこれ自動で文章チェックしてくれるのは大いに助かります。不要な校正があれば、各種ドキュメントを読んで設定をオフにするなどしてカスタマイズするとよさそうです。

関連URL

【Windows】Re:VIEWで書籍用のPDFを作成する

  • このやり方で生成したPDFファイルを日光企画さんに入稿して印刷までできました!(2023/11/13 追記)
  • TechBoosterさんのReVIEW-TemplateのmasterブランチがRe:VIEW5.8に対応したので修正(2024/3/11)

TechBoosterさんのReVIEW-Templateを拝借して、WindowsRe:VIEWで書籍用のPDFを作成する環境を構築する手順です。

目次

前提

次のものを使います。

Docker Desktop

Docker Desktopがインストールされていない場合はvvakame氏のdocker-reviewgithub.comの「Dockerのセットアップ」を参照してインストールしてください。

Re:VIEW image for Dockerの展開」以降の作業は、Re:VIEW-Templateに含まれていてあとでやるのでここでは不要です。

Visual Studio Code

Visual Studio Codeがインストーされていない場合は、次の公式サイトに従ってインストールしてください。

azure.microsoft.com

書籍用のフォルダーを作成する

書籍用のプロジェクトフォルダーはTechBoosterさんが公開しているGitHub - TechBooster/ReVIEW-Template: TechBoosterで利用しているRe:VIEWのテンプレート(B5/A5/電子書籍)を公開していますをダウンロードして使います。書籍などではC89-FirstStepReVIEW-v2が紹介されていますが諸々情報が古いのでTemplateを使った方がよさそうです。

  • Codeボタンをクリックして、Localタブに切り替えて、Download ZIPを選択します

ダウンロード

  • ダウンロードが完了したら、ダウンロードしたフォルダーを開きます
  • ReVIEW-Template-<ブランチ名>.zipファイルを作業用フォルダーに移動します
  • zipファイルを展開します
  • フォルダー名を書籍のタイトルにちなんだものにします(例えばMyBookなど)

展開して名前を設定したフォルダーがRe:VIEWの書籍用フォルダーになります。このフォルダーにRe:VIEWの各種環境を設定します。

書籍フォルダーをVSCodeワークスペースとして開く

最初に書籍用のフォルダーをワークスペースにして、Re:VIEW用の設定ファイルを作成します。

  • Visual Studio Codeを起動します
  • FileメニューからOpen Folder...をクリックします

フォルダーを開く

  • ZIPファイルを展開して名前を付けたフォルダーを開きます
  • 「Do you trust the authors…」と表示されたら、Yesのボタンをクリックします

Yes!

  • 右下に推奨のExtensionが表示されたら不要なので歯車をクリックしてDon’t show againを選択して消します

コンテナは開発しないので不要

  • FileメニューからSave workspace As…をクリックします
  • 名前はそのままで構わないのでSaveボタンをクリックします

これでこのプロジェクト用のワークスペースファイルが作成されました。設定はこのファイルに保存していきます。

PDFを作成する

Docker用の設定ファイルを作成して、テンプレートのPDFを作成してみましょう。まずは環境設定をします。

Re:VIEW用の設定ファイルを作成する

New File

  • ファイル名をDockerfileにします
  • 次の内容を入力します
FROM vvakame/review
  • 上書き保存します
  • 同様にNew Fileを作成して、名前をdocker-compose.ymlにします
  • 次の内容を入力します
version: '3'
services:
  review:
    volumes:
      - ./articles:/book
    build: .
    working_dir: /book
    ports:
      - "127.0.0.1:18000:18000"
  • 上書き保存します

PDFを作成する

Re:VIEWを使ってPDFを生成するために必要なものは揃いました。実際に生成してみましょう。

  • Docker Desktopを起動します
  • VSCodeに切り替えます
  • TerminalメニューからNew Terminalを選択します

VSCodeでターミナルを開く

画面下にTERMINALが表示されます。ここでコマンドを実行できます。

次のコマンドでPDFが生成されます。

docker-compose run --rm review rake pdf

しばらく待つと「SCCESS」と表示されて生成完了です。書籍用のフォルダー内のarticlesフォルダーの中にReVIEW-Template.pdfが生成されます。ダブルクリックなどして開くとテンプレートのサンプルが確認できます。

サンプルのPDF

まとめ

Docker DesktopとVisual Studio Codeをインストールして、TechBoosterさんのRe:VIEW-Templateリポジトリから書籍用フォルダーのひな形を作成しました。Docker用の設定ファイルを作成したらDocker Desktopを開き、docker-compose run --rm review rake pdfのコマンドでPDFが作成できます。docker-compose.ymlが公式サンプルのままだと動かなかったので、テンプレートにあわせたものを掲載しました。

articlesフォルダー内のドキュメントを読んだり、各種設定ファイルを編集することで書籍用のPDFファイルを作成することができます。技術書の書き方はTechBoosterさんの以下のリポジトリや、そこで紹介されている書籍をお求めいただくと分かりやすい解説が手に入ります。

github.com

冒頭にも追記しましたが、この方法で作成したPDFファイルを日光企画さんに入稿して無事に印刷ができました!トンボやノンブルの設定もRe:VIEW-Templateのままで大丈夫でした。表紙のデータも日光企画さんならオンデマンドの平とじのフルカラーセットのデフォルトの印刷ならRGB入稿ができます。今回はライセンスがあったのでクリスタで最終的な表紙データは作成しましたが、GIMPやpaint.netでもいけそうです。条件があるので保証はできませんし自己責任になりますが、ひとまず無料ツールで入稿に必要なデータは作れました。(2023/11/13追記)

これでPDFは作成できるようになりましたが、校正ツールをWindowsで動かすのに苦戦しました。それについては以下のブログにまとめました。

am1tanaka.hatenablog.com

関連URL

Windowsのアプリ管理ツールScoopでnodeをインストール

技術書典向けの書籍の執筆環境としてRe:VIEWを構築しました。その際に必要なnodeとnpmを管理するためにScoopを利用したので備忘録で調べたことをメモしておきます。

Scoop

目次

Scoopとは

MacのHomebrewに該当する環境構築のためのツールです。Windowsには同様のものでChocolateyがありましたが、現在はScoopの方が管理者権限が必要がない場合が多いなどの理由で推奨されているようです。

https://scoop.sh/

以下、ざっくり情報です。

  • Scoopに関連するデータは~/scoopフォルダーにまとめられています
  • Scoopはターミナル操作のために~/scoop/shimsフォルダーにショートカットを作成します。このフォルダーにはパスが通してあるのでユーザー環境を汚すことなくツールの追加や削除が行えます
  • Scoopが管理するアプリは、bucketsとよばれるGitリポジトリーにより構成されています。bucketsから使いたいアプリを検索してインストールできます

Scoopのインストール

まずはインストール済みか調べてみます。

  1. PowerShell7を起動します
  2. 以下のコマンドを実行します
scoop --version

見つからないとエラーが表示されたら、公式サイトのQuickstartに従ってコマンドを入力してインストールしてください。2023/9/14現在、以下のコマンドです。

はじめてremoteスクリプトを実行する時には以下を実行します。

Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

続けて、以下を実行します。

irm get.scoop.sh | iex

実行が完了したらあらためてscoop --versionを実行してインストールの完了を確認します。

更新

久しぶりにScoopを利用する際には更新をしておきます。

scoop update
scoop update *

nodeのインストール例

nodeをインストールする例です。まずはnodeがインストールされているかを確認します。

node --version

バージョンが確認できたら何らかのnodeがインストールされています。以下でScoopでnodeをインストールしたかどうかを確認します。

scoop list node

nodeが一覧にあればscoop update *で更新すれば完了です。

一覧にない場合はインストーラーなどでインストールしたものです。あとで混乱の元になりかねないのでアンインストールしてください。アンインストールが完了したらnode --versionを実行して、nodeが見つからないことを確認してください。

nodeのバージョンはversions bucketsのものを使います。どのbucketsにアプリがあるかはScoopのサイトのSearch an app欄にnodejsのようにアプリ名を入力すると検索できます。

登録済みのbucketsはバージョンを表示すれば確認できます。

scoop --version

bucketを確認

versionsがなければ次のコマンドで追加します。

scoop bucket add versions

追加したら、次のコマンドでnodejsを検索します。

scoop search nodejs

nodejsを検索

上の例ではmainとversionsの両方にnodejsのbucketがあります。versionsの方が多くのバージョンが含まれています。mainは主要なバージョンのみです。今回はLTSのnodejs18をversionsでインストールしてみます。

scoop install nodejs18

これでインストール完了です。以下のコマンドでインストールが成功していて、バージョンが表示されることを確認してください。

node --version

まとめ

Scoopを使うと、Windowsで管理者権限なしで様々なバージョンのアプリをクリーンにインストールしたり、アンインストールしたりできます。Scoopの公式サイトでアプリがあるかを確認して、必要ならアプリが含まれるbucketを加えてインストールします。

更新はscoop updatescoop update *で実行できるのでこれも便利です。

関連URL

Mac+DockerでJekyllを動かす(おすすめせず)

以下のブログを書いてみたのですが、チュートリアルとかをいじっているうちにDocker版だと古かったりパッケージがあれだったりとチュートリアルでそのままだとエラーが出たりとあれこれ起きるので、公式通りにchrubyなどでRubyを入れて普通に動かした方が良さげでした^^;


WordPressプラグインが多くて面倒だし、大して記事を更新してないし。ということでJekyllを試してみようとMacに環境を構築してみました。DockerもJekyllも普段は使ってないのであれこれ備忘録として。

目次

実行環境

  • MBP Intelのやつ
  • macOS 13.2
  • Docker 4.16.2
  • Jekyll 4.2.2

RubyかDockerか

Jekyllの公式ページではchrubyでRubyをインストールすると良さげなことが書いてありました。

jekyllrb.com

Jekyllに必要なものはRubyだけなので、Homebrewでchrubyをインストールして対応版のRuby 2.5以降を入れるだけです。ただ、つい最近Laravelの環境構築でDockerを使ってDocker用のJekyllの設定もあったのでなんとなくDockerで構築してみました。

DockerとJekyllのDocker Imageを取得

  1. Dockerが入っていなければ以下でDocker Desktopをダウンロードしてインストールします

www.docker.com

  1. Docker Desktopを起動します
  2. ターミナルを開きます
  3. 以下のコマンドでJekyll用のDocker Imageを取得します。Jekyll用のDocker ImageはDocker Hubで見つかります
docker pull jekyll/jekyll

これでjekyll/jekyll:latestがDocker Desktopに加わります。

Jekyllサイトを新規作成

JekyllのDocker ImageのGitHubリポジトリページに使い方があるので、それに従ってJekyllサイトのフォルダーを新規に作成します。

  1. ターミナルでサイト用のフォルダーを作成したい場所へ移動します。例えば~/Documents/JekyllSitesなど
  2. 以下のコマンドを実行します。最初の行の`my-blog'の部分は、作りたいサイトの名前にします
export site_name="my-blog" && export MSYS_NO_PATHCONV=1
docker run --rm --volume="$PWD:/srv/jekyll" -it jekyll/jekyll sh -c "chown -R jekyll /usr/gem/ && jekyll new $site_name"
cd $site_name

必要なファイルがダウンロードされて、指定の名前のフォルダー内にJekyll用のファイルが準備されます。

Jekyllサービスの開始

作成したフォルダーの中で以下を実行することで、JekyllでサンプルのWebページが作成されて、ローカルサーバーでホストを始めます。

docker run --rm --volume="$PWD:/srv/jekyll:Z" --publish 4000:4000 jekyll/jekyll jekyll serve

以上で以下のようなメッセージが表示されて待機状態になれば成功です。

  Auto-regeneration: enabled for '/srv/jekyll'
    Server address: http://0.0.0.0:4000/
  Server running... press ctrl-c to stop.

http://localhost:4000 を開くとWelcome to Jekyll!というようなサイトが確認できます。

Jekyllのサンプルページ

しかし、このブログを書いた時点では上記は失敗します!!

ということで対処方法です。

webrickを加える

2023/2/12現在、JekyllのGemfileはRuby2.5の設定になっていてRuby3だとエラーが発生していまします。https://jekyllrb.com/docs/の下の方に以下のようなことが書いてあります。

Ruby3ではエラーが出るという説明

ターミナルのJekyllサイトのフォルダー内で以下を実行してwebrickを追加します。

bundle add webrick

かなり待ちましたが上記でwebrickを組み込めました。上のJekyllサービスの開始に戻って改めてサービスを開始してみてください。

bundleのバージョンなどの問題で上記で成功しない場合は以下の方法もあります。

  1. 作成したフォルダー内のGemfileVisual Studio Codeなどのエディターで開きます
  2. 最後の行に以下を追加します
gem "webrick", "~> 1.8.1"
  1. 上書き保存します
  2. Gemfile.lockを開きます
  3. DEPENDENCIESの最後に以下を追加します
  webrick (~> 1.8.1)
  1. 上書き保存します
  2. ターミナルに切り替えます
  3. 以下を実行して、設定を更新します
docker run --rm --volume="$PWD:/srv/jekyll:Z" -it jekyll/jekyll:latest bundle update

以上でwebrickがインストールされます。上のJekyllサービスの開始に戻って改めてサービスを開始してみてください。

サイトの更新、終わり方

serveコマンドを実行しているので、_postフォルダーにある記事を書き換えると自動的にリビルドされます。サンプルページをリロードすれば更新が確認できます。

serveの後ろに--livereloadをつけて起動すればリロードも自動的にやってくれるようです。が、手元の環境だとリロードはしてくれませんでした。リロード押すだけなので別にいいのですが。

作業が終了したら、Jekyllを起動したターミナルで control + C キーを押せば停止します。

チュートリアルを進めるときの注意

上記の手順でブログを作成すると、あらかじめサンプルが作成されることに起因するエラーが公式のStep by Step Tutorialsで発生しました。

jekyllrb.com

Step7 Assetsでmain.scssを作ろうとするとエラーになります。これはサンプルがすでにmain.cssを加えていたからで、以下を参考にファイル名をmainからbaseなど別の名前に変更すれば動きました。

Error in Step by Step Tutorial - Help - Jekyll Talk

まとめ

MacにDockerでJekyllを動かす手順をまとめました。まとめましたが、チュートリアルでエラーが出たり、Jekyll自体の更新の頻度が低めな上、Docker Imageの更新がさらに遅いです。Dockerで扱えると楽なのですが、新しい機能が入った場合などを考えると公式のやり方がやはり正解っぽいと思い始めてます^^;

参考URL

InputSystemを使ったらWebGLのEditorとPCとスマホそれぞれで苦労した話

この記事はQiita Unity Advent Calendar 2022 カレンダー2 の9日目の記事です。

qiita.com

◆前日は chroske さんの 【Unity】ワープポータル転送演出の作り方【AdventCalendar2022】 - かつて代官山らへんで働いてたengineerのUnityブログ でした。

◆次の日は nkjzm - Qiita さんの「なんかかく」です。


ちょくちょくハマる Input System ですが、またも今年のデジゲー博の準備中にWebGLビルド時に操作できなくなる症状にぶつかりました。その原因と解決策です。

目次

問題が発生した状況

デジゲー博2022に出展したVoxelorer BirdのWebGL版の開発中に問題が発生しました。Unityエディター上では問題なく操作できていたのですが、WebGLでビルドしたものをiPadで動かすと最初は問題なく操作できていたのにステージ選択シーンに移動してからゲームに戻ると操作できなくなりました。

以下のバージョンで問題が起きることを確認しています。

  • Unity2021.3.14f1
  • Input System 1.4.4

原因

Voxelorer BirdはスマホではTouchscreen、PCではマウス入力を使います。ゲーム中は移動先や押すブロックなどの指定。

ゲーム画面

ステージ選択では洞窟のスクロール操作なので役割が違います。

ステージ選択画面

操作できなくなるのはゲームシーンのみでCanvas上のUIは操作できます。問題はPlayer Inputのようです。Player Inputはゲームシーンとステージ選択シーンそれぞれにアタッチしてあり、各シーン用のアクションを設定しています。

テストプロジェクトを作ってあれこれ試したところ、シーンを非同期で先読みして切り替える時にTouchscreenとKeyboard&MouseのSchemeが切り替わることが分かりました。

不具合の再現

シーンの切り替えにSceneManager.LoadSceneAsync()を使い、かつ、AsyncOperationのallowSceneActivationをfalseにして次のシーンを非同期に先読みすることで、古いシーンと非アクティブ状態の新しいシーンが混在することで問題が発生していました。

普通にシーンを切り替える場合は古いシーンのPlayer Inputが破棄された後に新しいシーンが読み込まれるので問題は起きません。Voxelorer Birdではシーン切り替えの待ち時間を減らすために画面を覆う演出の開始と同時に裏で次のシーンを非同期に読み込んでいます。古いシーンのPlayer Inputがデフォルトの入力デバイス保有したままだと新しいシーンのPlayer Inputが同じ入力デバイスを選択できないらしく、他の入力デバイスを選んでしまうのが原因でした。

解決策

原因が分かれば対策は簡単です。シーン切り替えで入力が不要になり次第、Player Inputがアタッチされているゲームオブジェクト上で以下のような処理を実行して、有効なPlayer Inputを無効にすることで解決しました。

        foreach (var pi in PlayerInput.all)
        {
            pi.enabled = false;
        }

といいつつ、この解決策にたどり着いたのはデジゲー博後、このブログのための調査をしている時でした。デジゲー博では実行環境を調査して手動でSchemeを割り当てるプログラムで回避していました。アドカレ万歳!

まとめ

Voxelorer Birdで採用していた特殊なシーン切り替え方法と、Player Inputに全てを委ねて手抜きしたことが招いた問題でした。分かってみれば解決策はシンプルで、シーンの切り替え前にPlayer Inputを無効にするだけでした。状態切り替え時の余計な入力による不具合を防げるのでこの解決策は筋が良さそうです。

Input Systemは、一人用の非リアルタイムゲームのような環境だとオーバースペックで使いにくい印象があります。一人用の場合はどの入力デバイスでも操作できた方が楽です。システム設計も密結合で手を加えにくく、もう一段階の進化を願ってます。

以上、Unity Advent Calendar 2022 カレンダー2 の9日目の記事でした!

qiita.com

◆前日は chroske さんの 【Unity】ワープポータル転送演出の作り方【AdventCalendar2022】 - かつて代官山らへんで働いてたengineerのUnityブログ でした。

◆次の日は nkjzm - Qiita さんの「なんかかく」です。

クリスマスまであと16日!

関連・参考URL

GAMEJAMで作ったイノシシのギミックの作り方

この記事は Cluster Creator #1 Advent Calendar 2022 の6日目の記事です。

adventar.org

◆前の日は Sha-la /歌詠しゃら🧸Vシンガー🌷本垢凍結で一時避難中。 さんの clusterで音楽イベントを開いてみたいアーティストの方へ。

◆次の日は さな さんの 会話ロボ in cluster です。


先日開催されたCluster GAMEJAM 2022 in AUTUMNに参加しました。三回目にして初空振りだったと思ってたのですが(毎回自主トレやにぎやかし目的で参加してるので空振りでいいんですけど)、奨励賞をいただけてました!!手広く色々な賞を用意してくださっていて参加して楽しいゲームジャムです。

奨励賞!!

GAMEJAMでは前回の春の時は「天翔ける腕輪」で空飛ぶ腕輪とクマ。

cluster.mu

今回は「イノシシ★ダッシュ!!」で直進しかできないイノシシを作りました。

cluster.mu

Cluster Creator Kitを使えば様々な仕掛けが作れます。公式のテンプレートワールドはどのようなことができるのかや実装テクニックを知ることができる宝の山です。 上記の乗り物もテンプレートワールドのHorseをもとに作りました。この記事ではHorseを観察しながら機能を理解して、イノシシに改造するまでをご紹介します。 Cluster Creator Kit(以降、CCK)を使えるようにするための一助になれば幸いです。

目次

動作環境

  • Unity2021.3.4f1
  • 2022/12/1現在のCCKとCluster

乗り物作りの環境構築

自由にいじりまわせるUnityプロジェクトを作成して、そこに公式のテンプレートワールドを読み込みます(サンプルプロジェクトではありません)。以下の公式サイトの「すぐにワールド制作したい──テンプレートワールドを導入する」を参考にテンプレートワールドをUnityで開いてください。

creator.cluster.mu

テンプレートワールドは、「プロジェクトに含まれるアセットは cluster にアップロードする場合には、すべてクレジット表示不要で自由に使う」ことができるとても有難いものです。活用しない手はありません。

ダウンロードしたClusterCreatorKitTemplate-master.zipを展開して、フォルダーの名前を変更すれば(例えばNorimonoRensyuなど)複数のテンプレートワールドのプロジェクトを扱えるので便利です。

テンプレートワールドをUnityで開いたら以下のガイドに進みます。

creator.cluster.mu

「テンプレートワールド『乗り物』について」を参考にVehicleシーンを開きます。Playして用意されている乗り物を乗り回してみてください。ぱっと思い浮かぶ乗り物は一通り揃っていると思います。使えるようならそのまま利用してもいいですし、仕組みを観察すればCCKの活用方法を学ぶことができます。

イノシシの能力

イノシシは以下のようにします。

  • スペースキーで一定速度まで加速
  • スペースキーを離すと急停止
  • 加減速は着地時のみ
  • 左右旋回はできない

秋のゲームジャムでは上キーで等速で前進させていましたが、せっかくなのでイノシシらしく(?)加速させたいと思います。

既存の乗り物を観察する

一通り乗り物に乗ってみてイノシシに近いのはHorseなのでこれをベースにします。

Horseの階層

階層はこんな感じです。

Horseの階層

  • Horse...Character Controllerやトリガーなどの制御系のコンポーネントで構成
    • Horse...ウマのモデルオブジェクト。アニメもここ。grip_Lとgrip_Rが手の位置
    • Seat...腰掛ける位置を表すオブジェクト
    • Exit...降りた時の位置を表すオブジェクト
    • Sounds...乗り(GetOnSound)降り(GetOffSound)、着地(LandSound)を鳴らすためのオブジェクト

動きに関するコンポーネントを親オブジェクトにまとめて、モデルデータが子になっています。モデルの差し替えがしやすいUnityのオススメ構造になっていて助かります。

Horseのコンポーネント

ご覧の通りなかなかの量ですが頑張って確認していきます。

Horseのコンポーネント

Character Controllerで動くキャラクタの設定

Character Controllerで動くキャラクタの設定

Character Controllerで制御するキャラクターにするためのコンポーネントです。 パラメータは殆どなく、着地位置や当たる範囲を調整したい時にCharacter Controllerをいじるぐらいです。

乗り物の設定と旋回、移動

乗り物の設定と旋回、移動

Ridable Itemで乗り降りや腰掛ける位置、手の位置、下りる位置、乗った時のアニメを設定できます。

Steer Item Triggerは乗り物の操作入力のためのトリガーで、前後左右操作に加えて、スペースキーなどのAdditionalキーに変化があった時のシグナルと、入力値をトリガーとして送信することができます。

Set Angular Velocity Character ItemGimmickは操作入力で旋回させるギミック、Set Velocity Character Item Gimmickは同様に移動させるギミックです。

間に挟まってるItem Logicは移動を前後に制限するためのものです。入力したmoveInputをそのまま速度に設定すると左右キーでHorseが横移動してしまいます。Item Logicで上下入力だけmove.yに設定することで左右キーの影響を除外しています。

着地とジャンプ

着地とジャンプ

Horseで一番参考になったのがこの辺りでした。着地を確認するIs Grounded Character Item Triggerですが、地面のわずかなデコボコの影響で一瞬だけ空中にいると判定されることがしばしば発生します。そのまま使うとジャンプボタンを押してもジャンプしないことが頻発して操作性が落ちてしまいます。

そこで下から3番目の位置にあるItem Timerを使って、空中にいるかを表すisInAirへの着地状態の反映を0.15秒遅らせる仕組みになっています。ジャンプできるかどうかはisInAirがfalseかどうかで判定しているので、空中に浮いても0.15秒間はジャンプ可能で、その間に着地すれば空中に浮いていたことはチャラになります。ジャンプ開始時にisInAirをtrueにしているのでこの処理によって連続ジャンプすることもありません。

0.15秒後のチェック時に運悪く空中にいる可能性もありますが、ジャンプができなかったと感じることはないので対策として十分だと思います。

イノシシでも加速は着地時にしたいのでこの処理は活用します。

その他

残りは以下のような処理です。

  • 乗った時の演出のためのシグナル送信
  • 降りた時の演出と操作をリセットするためのシグナル送信
  • オーナーが変わった時に操作をリセットするためのシグナル送信
  • 操作のリセット処理

操作や状態を一括してリセットするItem Logicは便利で、作り方の参考になりました。

イノシシへの改造

Horseの機能は一通り把握できました。改造の方針は以下の通りです。

  • モデルをイノシシに差し替え
  • 前後左右操作、ジャンプは不要なので削除
  • Additionalキー(スペースキー)による加減速
  • 加速は着地時のみ

一つずつ手順をまとめます。

モデルをイノシシに差し替え

イノシシは3月のウクライナアセットバンドルで入手したLowPoly Wild Animalsのものを利用しました。前回のシロクマもこれだったと思います。

assetstore.unity.com

Horseのプレハブを複製してBoarに名前を変更します。SeatとExitの位置をモデルに併せて調整して、左右の手の置き場を表すLeftHandRightHandをモデルに追加しました。

イノシシモデルを設定

アニメーション関連は、HorseのモデルからAnimatorやギミックを手作業で移植しました。Animator Controllerは Animator Override Controller を作成してHorseのAnimatorを参照して、イノシシの該当するAnimationを設定しました。Set Animator Value Gimmickは、InspectorウィンドウからHorseのコンポーネントをドラッグしてHierarchyウィンドウのBoarモデルにドロップするのを片っ端からやりました。

おおよそ以上でモデルの対応完了です。Horseを非表示にするなどして動作確認をします。

イノシシに差し替え完了

前後左右操作、ジャンプの削除

Horseの構造から不要なものを削除していきます。ここに書いてないものは後で利用予定なので手を加えないようにします。

  • 上下左右キーでの操作はいらないのでSteer Item TriggerMove Input Triggersを消します。

移動に関する設定を-を押して削除

  • 旋回動作はないのでSet Angular Velocity Character Item GimmickコンポーネントをRemoveします
  • ジャンプは不要なので、Jump Character Item GimmickコンポーネントをRemoveします

以上で、乗っても移動やジャンプができなくなりました。

Additionalキー(スペースキー)での加減速

このブログの本丸である加減速を実装します。RigidbodyならAdd Force系のギミックで加速できるのですが、HorseはCharactor Controllerなので自前で実装する必要があります。

移動速度はSet Velocity Character Item Gimmickにおいてmoveキーで設定しています。Additionalキーが押されていたらmove.yに加速値を足し、離されていたら減速させれば加減速ができます。またmove.yに空気抵抗に見立てた値を掛ければ最高速度の制限ができます。

この処理は物理更新と似たような頻度で実行したいので、やや無理やりですがItem Timerを0.02秒ごとに呼び出し続けて処理することにします。

関連変数の初期化

  • KeyがResetInputItem Logicを探して開きます
  • moveInputは不要になったので削除します
  • ロジックを追加して、VelocityTimerという名前で型はSignalにして、式は=Constant, Boolを選んでチェックします
  • もう一つロジックを追加して、accelという名前で型はFloatにして、式は=Constant, Floatを選んで値を0にします

パラメータの初期化

速度を更新するためのタイマーを設定

  • 新規にItem Timerを追加します
  • TargetはThis, KeyはVelocityTimer, Delay Time Secondsは0.02にします
  • ロジックを追加して、TargetをCheckVelocityValueSignalにします

ItemTimerの始動

Additionalキーの変更時にaccelの値を設定

  • 新規にItem Logicを追加します
  • TargetをThis, KeyをOnAdditionalInputChangedにします
  • ロジックを追加して、Additionalキーの入力が0より大きかったらisAccelがtrueになるように設定します
    • 最初の行はThis, isAccel, Boolを設定します
    • 式は=GreaterThanにします
    • 1つ目をRoomState, Float, This, additionalInputにします
    • 2つ目をConstant, Float, 0にします
  • さらにロジックを追加して、先に設定したisAccelがtrueならaccelに加速値、falseなら減速値を設定します
    • 最初の行はThis, accel, Floatを設定します
    • 式は=Conditionにします
    • 1つ目をRoomState, Bool, This, isAccelにします
    • 2つ目をConstant, Float, 0.13にします
    • 3つ目をConstant, Float, -0.5にします

加減速をaccelに設定

タイマーで0.02秒ごとに呼び出される速度管理の処理

  • 新規にItem Logicを追加します
  • TargetをThis, KeyをCheckVelocityにします
  • ロジックを追加して、速度管理を持続させるためにタイマーを開始するVelocityTimerシグナルを送信します
    • ThisでKeyはVelocityTimerにして型はSignal
    • 式は=ConstantBoolでチェックします
  • ロジックを追加して、着地時のみに加減速するための設定をします
    • ThisでKeyはcurrentAccel、型はFloatにします
    • 式は=Conditionにします
    • 1つ目の設定の条件式はRoomState, Bool, This, isInAirとして、空中かどうかで判定します
    • 2つ目の設定はConstant, Float, 0を設定して、isInAirがtrueの時は空中なので加速しないようにします
    • 3つ目の設定はRoomState, Float, This, accelにします。これでisInAirがfalseで着地時にはcurrentAccelaccelが代入されるので加速か減速をします
  • ロジックを追加して、currentAccelをmove.yに加算します
    • ThisでKeyはmove.y, 型はFloatにします
    • 式は=Addにします
    • 1つ目の設定はRoomState, Float, This, move.yにします
    • 2つ目の設定はRoomState, Float, This, currentAccelにします
  • ロジックを追加して、減速しすぎてバックしないようにします
    • ThisでKeyはmove.y、型はFloatにします
    • 式は=Maxにして、move.yと0のうちの大きい方をmove.yの値にすることで、値が0より小さくなることを防ぎます
    • 1つ目の設定はRoomState, Float, This, move.yにします
    • 2つ目の設定はConstant, Float, 0にします
  • ロジックを追加して、move.yに空気抵抗がわりの定数をかけます
    • ThisでKeyはmove.y, 型はFloatにします
    • 式は=Multiplyにして掛け算をします
    • 1つ目の設定はRoomState, Float, This, move.yにします
    • 2つ目の設定はConstant, Float, 0.95にします

速度管理のItem Logic

以上で完了です。スペースキーなどのAdditionalキーに該当する操作でイノシシが加速するようになりました。

成果物は以下でご確認いただけます。こちらはもう少し改造して、上キーでも加速するようにしています。

cluster.mu

まとめ

公式テンプレートから実装したいものに近いものを探して観察し、改造することで独自の乗り物や仕掛けを作る手順をご紹介しました。Character Controllerはそのまま使うと等速移動になりますが、自前で速度計算をして加減速に対応させました。またサンプルテンプレートの着地判定を利用することで、苦労せずに着地時のみに加減速する動きが実装できました。

実装している中で機能として欲しいと思ったのは以下の2つでした。

  • Set Animator Value Gimmickに別のゲームオブジェクトのアニメーターを設定したい - これによりアニメギミックを親オブジェクトなどのモデル以外のオブジェクトに構築することで、モデルの差し替えがより簡単にできるようになるのではと思います
  • Is Grounded Character Item Triggerの不安定さをトリガーコンポーネント自体で吸収して欲しい

以上、Cluster Creator #1 Advent Calendar 2022 の6日目の記事でした。創作の一助になれば幸いです。

adventar.org

◆前の日は Sha-la /歌詠しゃら🧸Vシンガー🌷本垢凍結で一時避難中。 さんの clusterで音楽イベントを開いてみたいアーティストの方へ。

◆次の日は さな さんの 会話ロボ in cluster です。

関連・参考URL

デジゲー博2022出展してきました&5年間の感謝

まずはデジゲー博10周年、おめでとうございます。自分は2018年から参加をはじめた中途組ですが、毎年当選という幸運に恵まれてデジゲー博の歴史の半分である出展5周年(?)を迎えました。デジゲー博は自分にとって年末年始のようなイベントになりました。

11/13(日)に秋葉原UDXにて開催されたデジゲー博2022の展示が完了したので簡単な振り返りです。

目次

展示ブースと設営

去年一昨年と1机1ブースで贅沢に使えましたが例年に戻りました。

といっても2ブース分の時も密を避けるために1ブース分の幅で展示してたので特に変わりなし。去年、撤収で苦戦したので今年はイメージトレーニングをして荷造りや出す順番を考えて設営にあたりました。

前日

前日はPCなどは持ち込まずに展示台や小物の設置をしました。

  1. 展示台(タンスの整理用の棚)の袋から小物を全て出して机の上に並べて置く
  2. 展示台を組み立てて机の上に設置
  3. 布を被せて洗濯ばさみで固定
  4. 机に並べていた小物類の設置開始
  5. 展示台の上に名刺入れ、スマホスタンド、イーゼル、粘土細工、マウスパッドを並べる
  6. これ以降、空き箱や袋は中身を取り出し次第、元の入れ物に戻す
  7. イーゼルにB4のちらしを立てかけ
  8. ポスター立てを組み立ててポスター設置
  9. 最後に展示台入れの袋を縛るための紐類を袋の一番手前にしまう

以上で前日設営終わり。おおよそ30分程度でした。

自分のブースの前にProject ICKXのどデカ筐体が設営されててめちゃくちゃ楽しそうでテンション上がりました!

当日

展示当日は9時半過ぎに会場に到着しました。

9時45分ぐらいから設営を始めたと思います。

  1. 机でルキグラの箱を開けてケーブルを取り出して中敷きをしまい、本体をケースから出す
  2. ケースを箱に戻して机の下に片付け
  3. ルキグラを展示台上で組み立ててケーブル接続
  4. AndroidiPadを取り出してスマホスタンドに設置
  5. PCを取り出して机に設置
  6. 電源ケーブルを机の上のよき位置に置いて給電
  7. ルキグラ、スマホのケーブルをPCに接続
  8. Voxelorer Bird起動

以上で40分程度で設営完了。

sketchfab.com

雑にフォトグラメトリした展示ブース。

ルキグラとAndroidiPadのケーブルが全てType-Cで、ノートPCのType-Cが2口だったので口が足りないと当日気づきました。念のために持って行っていた手持ちのiPhone用の給電セットが役に立ちました。備えあれば患いなし!しかし改めて考えるとルキグラに電源コネクタが付属してたのでそれ使えばよかったのでした。

当日設営は忘れ物が怖いので避けてますが、どうしても当日となった時は9時半着ぐらいなら間に合わせられそうな手応えでした。

入場開始前

入場が始まれば終わるまでほぼブースに詰めっきりになるので、少しご近所の作品を遊んだり、ご挨拶に回ったりしました。ご挨拶に来て下さった皆様、ありがとうございました!!

展示本番

自分のブースは比較的静かな感じでした。これまでは缶バッジくじをやったり、WebGLのお持ち帰り版を配ったり、テスト招待を配ったりしてきましたが、今年はリリース方針の検討中で新しいことがあまりなかったので積極的にお声掛けしたりカードを配ることはせず。気づいて足を止めて下さった方に遊んでいただきました。

お昼過ぎに体調不良で一時ブースを離脱。周りの方やスタッフの皆様にはご心配とご迷惑をおかけしました。14時半ぐらいに復帰して後半戦へ。

体調不良の原因は、準備の疲労が溜まっていたところに当日のハイテンション+ルキグラの画面を覗き込むために無理な体制で前かがみを続けていたことの合わせ技だろうと考えてます。次の日はふくらはぎが筋肉痛になってました^^; 例年はUnity上で実行したものをルキグラに映していたのでプレイの様子は手元のPCで確認できました。今年はシーンの切り替え中に画面が乱れる症状があったことと、そこそこしっかりとまとめられていたので滑らかに動作するビルド版で展示をしたのですが、ブース裏から様子を確認することができなくなりました。無理な姿勢でルキグラを長時間覗き込むことで体の疲労が一気に押し寄せてきた感じでした。

ということで復帰後は無理をしないようにUnity上でルキグラ版を動かして覗き込まなくて済むようにしました。やや画面が乱れたり操作の反応が悪くはなりましたが、運用はとても楽になりました。ビルド版でも手元で画面を見れるようにするという課題が見つかりました。

現場復帰後は体調が悪化することはなく、ご挨拶に来て下さった方々と情報交換をしたりして楽しく展示を終えました。

撤収

撤収手順を検討してきていたのでそこそこのペースで片付けが済みました。今回はスーツケースなしで、展示台袋、ルキグラ袋、PCリュックにまとめられたのがよかったです。

展示台袋の下に滑車を付けたら楽かなと思ってつけてみたのですが、小さすぎて袋を引きずってしまうので殆ど役に立たず。袋の下面を保護するパーツと大きめの滑車にして確実に滑車で転がせるようになると楽になるかも、というのを考えています。

いただいたコメント、展示での気づき

展示していていただいたコメントや気付いたことなど。

  • スクロール操作が誤って発動してタップ操作がうまくいかないことがしばしば発生。スクロールは殆ど不要なので操作の割り当てを変えることや設定項目を作るなど遊びにきてくれたO関君とあれこれ検討しました
  • 去年のもので十分にリリースして大丈夫、というご意見を頂戴しました。ありがとうございます!
  • ルキグラと相性の良い、かわいい、そこにある感がよい

かわいいかわいいと連呼しながらクリアしていただいたのが印象的でした。この世界を広げていきたいと実感しました。

以下、気付いたことなど。

  • ステージが多すぎた。試遊版は3ステージ程度の軽いものにして、その先はお持ち帰り版やアプリで、とするのがよさそう
  • ルキグラ版はミラーリングで手元で画面を確認できるようにする
  • 自動デモはとてもよかった
  • しばらく操作がなかったらタイトルに自動的に戻す機能を入れる
  • Undoやブロックの移動バグは発生しなかった
  • ブロックの色やデザインを一新していたが操作に迷ったりする方はいなかったので問題なさそう
  • 氷の仕掛けに気づけない方がいらっしゃった。滑って失敗した時のヒントメッセージは必要
  • ルキグラの給電は電源からできる
  • ポスターが応対の邪魔かも

おおよそこんな感じでした。カードの配布枚数は40枚ほど。途中離脱があったり積極的にお声掛けしなかったこともあり例年の2/3ぐらいでした。

次回に向けて

去年までは広告付きのリリースを目指していたのですが、世界中で変わる法律への対応やSDK変更によるメンテの手間や遊ぶ前の規約の煩わしさ、低年齢層の方に遊んでもらいにくくなるというデメリットがどうにも気になりました。そこで6月ぐらいにリリースの方針を以下のように見直すことにしました。

  1. パズル部分のみで構成した教材用プロジェクトをGitHubで公開し、広告もアナリティクスもなしの無料版をアプリストアで配信。これなら面倒なしにお子さんに遊んでもらえます
  2. 無料版の設計やプログラムの解説書籍を販売する
  3. 仕掛けやストーリーを追加した有料版を出す。買い切りで広告もアナリティクスもなしで規約をシンプルに

無料版を書籍や有料版への呼び水にすることで腑に落とすことができました。

デジゲー博への応募の時点では無料版の公開はできそうかなと考えていたのですが、公開に向けた諸々の技術調査やシステムの見直し、8,9月にやったゲームジャムマラソンなどで大幅に作業が遅れて今回の展示になりました。来年も幸運に恵まれて当選できた暁には本来の今年の目標であった無料版の公開を目指しつつ、あわよくば書籍や有料版も間に合えばと考えています。

いただきものなど

今回は10周年ということでデジゲー博パーカーをゲット!ご挨拶でいただいたパンフなどを添えて。

最後に

改めて、デジゲー博10周年おめでとうございます。年に1度、対外的に発表する機会が持てたことは活動に大いにプラスでした。Voxelorer Birdはデジゲー博の当選がきっかけで生まれた企画なので成長を今後も展示していきたいです。1年の節目になるイベントとして今後もますますの発展を祈念しております。

ブースに遊びに来て下さった皆様、ありがとうございました。もくもく会での縁を確認できたり、チュートリアルを活用していたお礼をお伝えできたり、何年か分からないぐらいぶりにお話できたり、毎年学校の学園祭で後輩を叱咤激励した上にこちらにも遊びに来てくれたりと刺激を得られました。

設営と撤収は手順も固まって落ち着いてできるようになりました。それと同時に、手元で進行を確認できるようにしたり、自動的にタイトルに戻すなどもう一工夫の部分が見つかったのは収穫でした。

近くのブースの皆様やデジゲー博のスタッフの皆様には体調不良でご心配とご迷惑をおかけしました。良くしていただいて大変助かりました。基本的に座ってお客様対応ができるような対策を検討して再発防止に努めます。

来年は当選できるのか、何が展示できるのか、或いは会場に遊びに行くのか今は分かりませんが、何らかの形で参加したいと考えております。