まゆたまガジェット開発逆引き辞典

電子工作やプログラミングのHowtoを逆引き形式で掲載しています。作りたいモノを決めて学んでいくスタイル。プログラマではないので、コードの汚さはお許しを。参照していないものに関しては、コピペ改変まったく問いません

clusterでステージをつくる(ギミックなし・カスタムシェーダなし編)

バーチャルイベント空間のclusterが背景ステージアップロード機能のアルファ版をリリースしました。
Unityで背景を作ってclusterにアップロードすることができるようになります。
ここではひとまずギミックなしの背景をアップロードする手順をメモりました。

f:id:prince9:20190706021357p:plain

もろもろインストール

必要なものは下記の点になります。それぞれダウンロードしてインストールや読み込みをします
・Unity 2018.3.14f1
unity3d.com

Macを使っているならWin、Winを使ってるならMacのビルドサポート
Macユーザーはこちら
https://download.unity3d.com/download_unity/d0e9f15437b1/MacEditorTargetInstaller/UnitySetup-Windows-Mono-Support-for-Editor-2018.3.14f1.pkg?_ga=2.42631904.494922156.1559807893-1032684572.1553475741

Winユーザーはこちら
https://download.unity3d.com/download_unity/d0e9f15437b1/TargetSupportInstaller/UnitySetup-Mac-Mono-Support-for-Editor-2018.3.14f1.exe?_ga=2.207826135.494922156.1559807893-1032684572.1553475741

・clusterのSDK(クリックでダウンロード注意)
https://update.cluster.mu/ClusterVRSDK.unitypackage

・最新版のclusterアプリ
cluster.mu

最小限のステージをつくる

0.clusterにログインして、あらかじめテスト用のルームを作成しておく。下書き状態でOK
1.clusterSDKをインストールするとAssetsフォルダに作られる「ClusterVR」→「Scenes」→「Venues」→「MinimalSample」シーンをダブルクリックして開く
2.別名でシーンを保存する
3.ランキングは必要なければ消してOKなので、ランキングが必要なければ「Hierarchy」の「Screens」→「RankingScreen」を消しておく

背景ステージデータを設置する

背景ステージデータでギミックを必要としないものについては、「Hierarchy」の「StaticObjects」に入れればOKのようです。
ただし床に必ずColliderをつけるのをお忘れなく!落下の無限ループになります(私はやらかした)

プレビューする

1.clusterにログインしている状態で、Uniityの「clusterSDK」メニュー→「VenueUpload」を選択する
2.APIのアクセストークンを持っている場合は「API Access token」に入力する。持っていない場合は「Get API access token」をクリックしてclusterのサイトへ飛び、「トークン作成」のボタンを押す。そうして出てきた文字列を 「API Access token」に入力する
3.「プレビュー」ボタンを押す
4.clusterアプリが立ち上がるので、左上の「PreviewVenue」をクリックしてテスト入場する

アップロードする

1.「会場一覧」の「新規会場追加」ボタンをクリックする
2.サムネ登録や説明などを入力する
3.「アップロード」をクリックし、しばらく待つ

バーチャルキャストで装着アイテムのアニメーションをOn/Offする

バーチャルキャストのバージョンアップに伴い、アイテムを装備(装着)できるようになりました。
そこでアイテム同士が接触した場合に、装着アイテムのアニメーションをOn/OffするVCIサンプルを作ってみました。
例が腕輪型なのは、装着した状態で接触してアニメーションを制御できないかなと思ったからでした・・・
(結論としては、装着した状態ではできませんでした。公式でもまだ「装着した」という状態を検出できない模様。タッチ検出用のアイテムを手に持ってにぎった状態ならOK)

サンプルは「ちょうちょを人差し指に止まらせて(装着すると)腕輪と接触すると、ちょうちょが羽ばたく」というものです。
動画はこちら。

アニメーションを設定する

1.VCIとVRMの最新バージョンをダウンロード&Unityに読み込む
2.必要なオブジェクトをUnityに読み込む
3.空のオブジェクトを作り、「root」など名前を変える。rootオブジェクトに対して、「VCIObject」コンポーネントを適用する。このときrootの位置が必ず0,0,0であること
4.空のオブジェクトを作り、適当な名前をつける(ここでは「SubOBJ」)
5.アニメーションさせたいオブジェクトをHierarchyにドラッグ&ドロップする。このとき位置は0,0,0にしておく
6.さらに5.を4.の「SubOBJ」にドラッグ&ドロップして親子関係にし、「SubOBJ」を好きな位置に移動させる。あまり下の方だとつかみにくいため
7.「SubOBJ」をrootにドラッグ&ドロップし、親子関係にする
8.アニメーションのトリガーとなるアイテム(オブジェクト、ここでは「Udewa」)をHierarchyにドラッグ&ドロップする
9.8.「Udewa」の位置を調整する
10.「Udewa」をrootにドラッグ&ドロップし、親子関係にする。ここまでの階層は下記のようになる
f:id:prince9:20190617055514p:plain
11.rootをクリックし、下記の「アイテムをつかんだり衝突判定ができるようにする→rootオブジェクトに対する設定」の1.~18.を参考にアニメーションを作成する。
prince9.hatenablog.com

今回は「Ageha_Blue」オブジェクトのアニメーションを設定する。

このとき下記の点の注意が必要。
・「VCI SubItem」「Box Collider」「VCI Attachable」といったアイテムの挙動の設定は「SubOBJ(空のオブジェクト)」に対して行う
・アニメーションは「root」に対してつける

12.rootに「Animation」コンポーネントを適用する。さらにインスペクタの「Animations」の「Size」を1にした上で、「Element 0」に11.でできた「.anim」形式のアニメーションをドラッグ&ドロップする
13.rootに対する設定は下記のようになる
f:id:prince9:20190617060507p:plain

アイテムの挙動を設定する

つかめるようにする・装着できるようにするなどのアイテムの挙動をコンポーネントで設定していきます。
1.「SubOBJ」をクリックし、「VCI SubItem」「Box Collider」コンポーネントを追加する。つかめる・重力無視で落下しない設定はこんな感じ
f:id:prince9:20190617061214p:plain
2.さらに「VCI Attachable」コンポーネントを追加し、「Attachable Human Body Bones」の「Size」に装着させたい人型アバターの部位(ボーン)の数を入力する。今回は左右の人差し指にちょうちょが止まって欲しかったので、こんな感じの設定にしました
f:id:prince9:20190617061520p:plain
3.装着させたい部位のボーンを設定する
4.「Attachable Distance」で装着の判定を行う範囲を決める。長さは半径m。画面上に緑色の立体で表示されるので、それを参考にする
f:id:prince9:20190617061748p:plain
5.一度「The Seed Online」にアップロードし、バーチャルキャストで一度呼び出してみる。この時点ではそれぞれのアイテムはつかめるが、アニメーションは再生されない

タッチしたらアニメーションが再生されるスクリプト

一度でもバーチャルキャストで呼び出したアイテムは隠しファイルの「AppData→LocalLow→infiniteloop Co,Ltd→VirtualCast→EmbeddedScriptWorkspace」にアイテム名のフォルダができているので、そこにスクリプトを保存します。
1.「AppData→LocalLow→infiniteloop Co,Ltd→VirtualCast→EmbeddedScriptWorkspace」にある「template.lua」をコピーする
2.1.を該当するアイテム名のフォルダにペーストする
3.ペーストした「template.lua」を「main.lua」に名前を変更する
4.「main.lua」をVSCodeで開き、スクリプトを入力する
5.4.を保存して、スクリプト全体をコピーする。スクリプトはこんな感じ

---アニメーションの状態を示す変数
local state = 0

---[SubItemの所有権]アイテムにCollider(not Trigger)が接触したときに呼ばれる。
---@param item string @SubItem名
---@param hit string @Collider名
---SubOBJ(アニメーションさせるオブジェクトが入った空のオブジェクト)と検出用アイテムが接触して、かつアニメーションの状態が0のとき(trueはループ再生)
function onCollisionEnter(item, hit)
    if (item == "SubOBJ" and hit == "Udewa") and state == 0 then
        vci.assets._ALL_PlayAnimationFromName("HaneAnim",true)
        print("アニメ開始")
---アニメーションの再生が始まったら、状態を1にしてアニメーションを停止する準備をする
        state = 1

---SubOBJ(アニメーションさせるオブジェクトが入った空のオブジェクト)と検出用アイテムが接触して、かつアニメーションの状態が1のとき
    elseif (item == "SubOBJ" and hit == "Udewa") and state == 1 then
        vci.assets._ALL_StopAnimation()
        print("アニメ停止")
---アニメーションの再生が止まったら、状態を0にしてアニメーションを再生する準備をする
        state = 0
    end
end

VCIスクリプトをオブジェクトに適用してアップロード

1.rootオブジェクトをクリックし「Inspector」→「Scripts」に下記を入力する
・Size → 1にする
・Name →「main.lua」と入力
・Source →「 タッチしたらアニメーションが再生されるスクリプト」項目の5.でコピーしたものをペーストする。必要なコード全体をここにコピペする形です
2.「Hierarchy」の「root」をクリックし、「VCI」メニュー→「UniVCI-バージョン」→「Export VCI」を選択する
3.ウィンドウが開くので、「新しいフォルダー」をクリックし、英語で名前をつける
4.3.で作ったフォルダを選択し、英語でファイル名をつけて「保存」を押す
5.「アイテムの挙動を設定する」5.でアップロードしたアイテムを選択して、「別のファイルを再アップロードする」をクリックする
6.4.で書き出した「.vci」ファイルを選択してアップロードする
7.バーチャルキャストで読み込み、再度使ってみる

バーチャルキャスト配信でVRを持ってないゲストさんが参加する場合

VR環境でないゲストさんがバーチャルキャスト配信に参加する方法のメモです。
ビデオチャット的ではなく、あくまでそこに「参加している」感を多少出すための方法です。

■使用するもの:
・バーチャルキャストとVCIアイテム
・DiscordやSkypeなど、音声の入出力を設定できるボイスチャットアプリ

■ゲスト環境
・マイク+PCはあるが、USBカメラはない
スマホ+タブレット端末、またはスマホ+PCのみ
※USBカメラを持っていれば、3tene等で対応可能。
上半身であればSHOWROOM Vなどスマホアプリで対応可能ですが、ワイプ(ビデオチャット)にしかならないので今回は使用せず。配信主も上半身のみの場合はスマホアプリで十分かも。

■オーナーがやること
・Discordから流れてくるゲストさん(VR環境なし)の声を聞きながら、その方の発話タイミングに合わせてアニメーションのOn/Offを行う

実際に私がオーナーのときにやっていたのが、下記の4つです。
f:id:prince9:20190603185816p:plain

ゲストをVCIアイテム化

こちらを参考に、タッチするとアニメーションが再生されるVCIスクリプトを書きます。
prince9.hatenablog.com

こちらの下部分の映像では、コントローラーでボタンにタッチするとアバターの色が変化します。ゲストさんの声に合わせてボタンのOn/Offを行い、「しゃべってるように」見せることができます。
prince9.hatenablog.com


1.ゲストのアバターをVCIアイテムとして作成する
2.1.のアニメーションをコントロールするVCIアイテムを作成する
3.2.で1.をコントロールするVCIスクリプトを書く

The Seed Onlineにアバターとコントロールアイテムをひとつの「VCIアイテム」としてポスト

4.1.2をひとつのVCIアイテムとして「The Seed Online」にポストする

声に合わせてオーナー(配信主)がコントロールする

5.ゲストの声に合わせてコントロール用VCIアイテムを操作する
6.ゲストがアニメーションして、声に合わせて動いたりしているように「見える」

音まわりの設定

こちらの「ボイスチェンジを使ったバーチャルキャスト+Discordでの配信の音まわり設定(VR機器使用者さんとスマホ使用者さんの共演)」を参考に。
prince9.hatenablog.com

バーチャルキャスト+VCIで色のアニメーションを行う

バーチャルキャスト+VCIでマテリアルの色を変化させてみました。
Animationを使って色が変化していくアニメーションを作りたかったのですが、バーチャルキャスト+VCIで扱えるのは「位置・大きさ・回転」のアニメーションのみ。現状マテリアルの色を変化させるなら、スクリプトを書くしかありませんでした。

使う用途があったので、簡単なサンプルを作ってみました。
オブジェクトを1回にぎると色の変化が始まり、2回目で止まります。色の変化は2秒かけて赤→青と変化するようにしました。
止まってから再度にぎると、途中からではなくリセットされた状態(赤にもどる)で変化します。

内容としてはこちらを参考にしました。
virtualcast.jp

下に色がループするバージョンを追記しました。

local state=0

--何秒かけて変化するか
local framevalue = vci.me.Time.TotalSeconds

--カウント開始
local framestart = 0

local moveflag = 0
local changeColor = 0
local red = Color.__new(1,0,0,1)
local blue = Color.__new(0,0,1,1)

function update()

--moveflagが1になったときに、updateの中身を実行
 if moveflag==1 then

  --print(vci.me.Time.TotalSeconds)

  --この場合は2秒かけて変化する
  framevalue = (vci.me.Time.TotalSeconds-framestart)/2

  --Color.Lerpで色を徐々に変えていく
   changeColor = Color.Lerp(red,blue,framevalue) 

   --マテリアルに色を設定
   vci.assets._ALL_SetMaterialColorFromName("testMat", changeColor)
 end


end

function onUse(use)

    --カウントスタート
    framestart = vci.me.Time.TotalSeconds

    --1のときにupdateの中身を動かす
    moveflag = 1

    if use == "Enn" and  state == 0 then
    print("1回目にぎった")
    state=1

    
elseif use == "Enn" and state == 1 then
    print("2回目にぎったよ")
    state=0

    --updateの中身を止める
    moveflag = 0

end
end


Unity(C#)で書かれた下記のスクリプトをVCI(Lua)用に書き直して、アイテムとアイテムが接触したとき(タッチしたとき)に色が変化して、再度タッチすると止まるものも作ってみました。
prince9.hatenablog.com

また下記のようにアイテムの中にボタンがある場合は、このようにすることで当たり判定をつけることができます。
1.タッチするアイテムとボタンに当たり判定をつける(下の場合はピンクの棒と黄色のボタン)
f:id:prince9:20190526204343p:plain
2.ボタンに「Fixed Joint」をつけて、「Connected Body」にアイテムを指定する(下記の場合は本)。
Fixed Jointをつけておけば、元のアイテム(下記の場合は本)を動かすと同時にボタンも動きます
f:id:prince9:20190526204407p:plain
f:id:prince9:20190526204557p:plain


■アイテムとアイテムが接触したとき(タッチしたとき)に色相が変化して、再度タッチすると止まるスクリプト

--アイテムの状態を示す変数
local state=0

--カウント開始
local moveflag = 0

--何秒で色が変わるか
local duration = 12

--HSVで色指定
local changeColor = 0

function update()
--moveflagが1になったときに、updateの中身を実行
 if moveflag==1 then

--durationの時間ごとに色が変わる
local phi = vci.me.Time.TotalSeconds / duration * 2 * math.pi
local amplitude = math.cos(phi)
print(amplitude)

--色相・彩度・明度のうち、色相のみ変化
 changeColor = Color.HSVToRGB(amplitude, 1,1);

--マテリアル指定
  vci.assets._ALL_SetMaterialColorFromName("testMat", changeColor)
   

end

end


function onCollisionEnter(item, hit)
    if item == "Bou" and hit == "Shikaku" and state == 0 then
         --カウントスタート
    moveflag = 1
    print("当たった")
    state=1
--アニメーションを再生させたいときは、ここに書く
-- vci.assets._ALL_PlayAnimationFromName("Animation1", false)

elseif item == "Bou" and hit == "Shikaku" and state == 1 then
    state=0
    --updateの中身を止める
    moveflag = 0
--アニメーションを再生させたいときは、ここに書く
-- vci.assets._ALL_PlayAnimationFromName("Animation1", false)


end
end

バーチャルキャスト+VCIで、ループとそうでないアニメーションを同一オブジェクトで使用する

バーチャルキャストでループアニメーションとそうでないアニメーションを同じオブジェクトに適用する場合の方法です。
複数アニメーションを設定するにあたり、VCI上の仕様でいくつか注意点があります。

今回のサンプルです。

VCIで複数のアニメーションをさせるときの注意点

1.アニメーションの作成の方法
アニメーションを設定するときは、まず「root」オブジェクトをクリックして、「Window」メニュー→「Animation」→「Animation」を選択→「Create」ボタンを押してアニメーションを作成する
2.「Animator」の無効化
1.を実行すると「root」に「Animator」が勝手にできているので、チェックを外して無効化しておく(アニメーションがひとつなら2.はやらなくてOK)
3.「Animation」コンポーネントをつける
複数アニメーションがある場合は、「root」に「Animation」コンポーネントをつけておき、「Animations」→「Size」を1以上にして(アニメーションの数だけ)該当する.animファイルをドラッグ&ドロップする
4.「Quaternion」にする
回転のアニメーションを含む場合は、「Animation」ウィンドウでアニメーションさせたいオブジェクトを右クリック→「Interpolation」→「Quaternion」を選択する
5.アニメーションさせるアイテムは複数オブジェクトから構成されててもOK
3Dアプリでアイテムを作成してグループ化した後にFBX化、それを使用してもOKです。
アニメーションさせるアイテムと空のオブジェクトを親子関係にして、親につかむ設定や衝突判定を設定します。
具体的には下記のような構成になります。青色部分がアニメーションさせるアイテム、その上の「AnimOBJ」がその親です。
f:id:prince9:20190508142923p:plain

一度アイテムをアップロードする

1.アイテムを作成後、スクリプトをつける前に、下記の方法で一度「The Seed Online」にアップロードしておく。
prince9.hatenablog.com
2.下記の「アイテムを用意して、初期位置を調整する」の1.から8.の方法で、アニメーションさせたいアイテムの親子関係を設定する
prince9.hatenablog.com
3.下記の「空のオブジェクト(ここでは「UsaAtari」オブジェクト)に対する設定」の1.から8.までの方法で、アニメーションさせたいアイテムの親に衝突判定とつかむ設定を行う
prince9.hatenablog.com

ひとつ目のアニメーションを作成する

1.下記の「アイテムを用意して、初期位置を調整する」と「アイテムをつかんだり衝突判定ができるようにする」の1.から14.まで行い、まずひとつ目のアニメーションを作成する
prince9.hatenablog.com

ふたつ目以降のアニメーションを作成する

1.「Hierarchy」の「root」をクリックした状態で、「Animation」ウィンドウを開く
2.「Preview」の下のアニメーションファイルを選択するタブをクリックし、(ここでは「ToOmoteAnim2」のところ)「Create New Clip」を選択して新しいアニメーションファイルを作成する
f:id:prince9:20190508043652p:plain
3.「Hierarchy」にあるアニメーションさせたいアイテムをクリックし、「Animation」ウィンドウをクリックする
4.「Animation」ウィンドウの赤い●をクリックして録画状態にする
5.「Add Property」をクリックし、「アニメーションさせたいアイテム(オブジェクト)の▶︎」→「Transformの▶︎」→「Position(またはRotationやScale)横の+」をクリックする
6.アニメーションさせたい時間のところに白い棒をドラッグし、移動・回転・拡大縮小をしてアニメーションを設定する
7.再生ボタンを押してアニメーションを確認する
8.赤い●をクリックして録画状態を解除する
9.必要であれば同様の方法で3つ目以降のアニメーションを作成する

「Animation」コンポーネントを設定する

1.すべてのアニメーションが設定できたら、「root」→「Inspector」→「Add Component」をクリックし、「Animation」コンポーネントを設定する
2.「Animations」→「Size」に使用するアニメーションの合計ファイル数を入力する(3パターンのアニメーションなら3)
3.使用する.animファイルをドラッグ&ドロップする
4.「root」→「Inspector」をみると、「Animator」コンポーネントが勝手にできているので、チェックを外して無効化しておく(removeはしないほうがいいっぽい)


VCIスクリプトを書く

1.Cドライブ→ユーザー→ユーザー名→AppData→LocalLow→infiniteloop Co,Ltd→VirtualCast→「EmbeddedScriptWorkspace」フォルダの中に「template.lua」があるので、それをコピーする
2.1.の「EmbeddedScriptWorkspace」フォルダの中に先ほどアップロードしたアイテムのフォルダがあるので、そのフォルダに1.をペーストする
3.2.のファイル名を「template.lua」から「main.lua」に変更する
4.3.をVSCodeで開く
5.下記のスクリプトを書く

下記のスクリプトでは、特定のアイテムをグリップした回数で表/裏切り替え+テクスチャ変更(UVスクロール)を行っています。
テクスチャ変更がなく単に表裏ひっくり返したいだけなら、「グリップ回数の変数%2」で奇数偶数判定してアニメーションをその度切り替えればOKです。
またアニメーションの状態を記録する変数として「state」を使用しています。これがないとループありとなしのアニメーションを切り替えることができません。現在のVCIの仕様では複数アニメーションを同時に再生することができないので、次のアニメーションが再生される前に必ず再生中のアニメーションを停止させておく必要があります。

--グリップ回数カウント用変数
local TouchCount1 = 0
local TouchCount2 = 0

--奇数偶数判定用変数
--local Hantei1 = 0
local Hantei2 = 0

--アニメーションの状態を記録する変数
local state=0


function onUse(use)
    
    --うさぎロッドをつかんだ場合
    if use=="UsaRod" then
    
    TouchCount1 = TouchCount1 + 1
    --Hantei1 =  TouchCount1 % 2
    
    -- うさぎロッドをグリップした(奇数)1回目、かつ状態が0
    if TouchCount1==1 and state == 0 then
        vci.assets._ALL_PlayAnimationFromIndex(0, false)
vci.assets._ALL_SetMaterialTextureOffsetFromName("FlipFrontMat",Vector2.__new(0.5,0))
        state=1
        print("1おもて")
      
--うさぎロッドをグリップした(偶数)2回目、かつ状態が1
    elseif TouchCount1==2 and state==1 then
        vci.assets._ALL_PlayAnimationFromIndex(1, false)
vci.assets._ALL_SetMaterialTextureOffsetFromName("FripBackMat",Vector2.__new(0.5,0))
        state=0
        print("1うら")
        
        -- うさぎロッドをグリップした(奇数)3回目、かつ状態が0
    elseif TouchCount1==3 and state==0 then
        vci.assets._ALL_PlayAnimationFromIndex(0, false)
       vci.assets._ALL_SetMaterialTextureOffsetFromName("FlipFrontMat",Vector2.__new(0,0.7))
        state=1
        print("2おもて")

        --うさぎロッドをグリップした(偶数)4回目、かつ状態が1
    elseif TouchCount1==4 and state==1 then
        vci.assets._ALL_PlayAnimationFromIndex(1, false)
      vci.assets._ALL_SetMaterialTextureOffsetFromName("FripBackMat",Vector2.__new(0,0.7))
        state=0
        print("2うら")

        
    end
       
    end
 
    --球体をつかんだ場合の処理-------------------------
    if use=="Tama" then
        print("玉だよ")
        TouchCount2 = TouchCount2 + 1
    Hantei2 =  TouchCount2 % 2

     -- 球体をグリップした(奇数回)、trueはループ
     if Hantei2==1 then
        vci.assets._ALL_PlayAnimationFromIndex(2, true)
        
      
--球体をグリップした(偶数回)
    elseif Hantei2==0 then
        vci.assets._ALL_StopAnimation()
        
        
    
    end
end


end
        

ORCAことはじめ(音出しまで)

ORCAサウンド系のライブコーディング環境に新たな刺客到来!なんだかレトロゲームを思わせるテンションがなかなか良いですね。


導入から音出しまでまとめてみました。
日本語チュートリアルではインストールのところが省かれていたので、個人的なメモとして。
大幅な仕様変更があったようで、YouTubeなどのチュートリアル動画の通りでは一部動かないものがあります。ご注意を!

ORCAのインストールの準備

1.下記からnode.jsをダウンロード&インストールする(私は推奨版の方にしました)。すでにnode.jsがインストール済みの方は飛ばしてOK
nodejs.org

2.下記から「Orca」をダウンロード&インストールする。寄付をお願い!と言われるので、しない場合は「No thanks, just take me to the downloads」をクリックしてダウンロード&インストールする
100r.co

3.下記からシンセ「Pilot」をダウンロード&インストールする。寄付をお願い!と言われるので、しない場合は「No thanks, just take me to the downloads」をクリックしてダウンロード&インストールする
wiki.xxiivv.com

4.「Orca」「Pilot」を起動する

音を鳴らしてみる

ORCAはステップシーケンサーのようなものなので、そのままでは音が出ません。MIDIを繋いでハード/ソフトシンセで音を出したり、OSCを使って他アプリと連携させて音を出します。
ここではソフトシンセの「Pilot」を使って音を出していきます。

1.画面中央の適当なところに「;54C」と入力する。連続入力ではなくて、矢印キーでカーソルを動かして1文字ずつ入力する
2.「;」の上に4、その左にDと入力する。シンセっぽい「ド」の音が鳴る
f:id:prince9:20190429220825p:plain
上記の「;54C48」は、
・「;」UDPという通信(気にしないでOK、とりあえずPilot使って音出す場合は入力する)
・「5」音色(0〜F)
・「4」音の高さ
・「C」ノート番号(ドレミ・・・)
・「4」音量
・「8」音の長さ

コマンドまとめ

ORCAでは主にAからZまでコマンドがあり、それぞれのアルファベットを入力することでコマンドを実行します。
そのコマンドを(分かってる範囲内で)まとめました。?はまだ私がコードを作る中で遭遇していないものです。
翻訳は本家のこちらを参考にしました。
github.com


・A 左右を足す
・B Bool変数
・C カウント
・D Bangを出力
・E Eを右に飛ばす
・F 左右が同じだとBangを送る(if)
・G 離れた位置に値を送る
・H 直下のアルファベットの活動をすべて停止
・I カウントアップ
・J 上の値を下に転送する
・K 変数を出力
・L ループ?
・M 余りの計算
・N 上にNを発射する
・O 演算子と出力を引き継ぐ?
・P 下の行に値を転送する
・Q Oと似てる?
・R ランダムな値を出力
・S 下にSを発射する
・T トラックを作る
・U S・N・E・Wを打ち返す
・V グローバル変数
・W 左にWを発射する
・X 離れた位置に値を送る
・Y 右にコピーした値を出力する
・Z Eと同じ?右にZを発射する
・# コメント。#Comment#という形で囲うように使用する
・* 強制的にBangを送る


ひとまずここから先は、よろしければ4/30(火)20:00スタートの下記の配信をご覧ください!
f:id:prince9:20190429221447p:plain
www.youtube.com

配信ではUnityのVFX Graphとの連携もご紹介します。
テキストでまとめるのは限界が・・・

また日本語チュートリアルを有志の方がまとめておられますので、こちらもご参考まで。
qiita.com
qiita.com


ORCA」お楽しみください!

バーチャルキャスト+VCIで、タッチすると(アイテム同士が接触すると)アニメーションが再生される

VCI(バーチャルキャストでアイテムを扱うための環境)を使って、アイテムにタッチするとアニメーションが再生されるようにします。
こんな感じ。

前回はグリップボタンを押すことでアクションが起きましたが、今回はアイテム同士が接触することでアクションが起こる状態を作っていきます。
prince9.hatenablog.com


これを応用すれば、「ボタンを押してアニメーションを再生する(リモコン)」も可能です。
ご本家のwikiでは例としてこちらにちょろっと書いてある程度で、詳細な説明がされていません。Unityでアニメーションを作った経験がないと、初見では分かりづらいかと思われます。
virtualcast.jp

VCIの環境を整える

1. 一度もVCIスクリプトつきのアイテムを作成・アップロードしたことがない場合は、下記の最初から「VCIスクリプトを書く」4.まで行い、Unityで環境をつくる。
prince9.hatenablog.com

初回の設定が終わっている(一度でもVCIスクリプトつきのアイテムを「The Seed Online」上にアップロードしたことがある)場合は、上記のリンクの「VCIスクリプトを書く(2回目以降はここから始める)」4.までを行う。

2.下記の条件すべてをクリアしているか確認する。クリアしていない場合は、リンクを参考にVCIスクリプトをつけたいアイテムを「The Seed Online」にアップロードして使用済みの状態にしておく
prince9.hatenablog.com

■条件
・VCIスクリプトを追加したい「つかんで動かせるVCIアイテム」をUnityで作成済み
・VCIスクリプトを追加したい「つかんで動かせるVCIアイテム」を「The Seed Online」に投稿or公開状態でアップロード済み
・VCIスクリプトを追加したい「つかんで動かせるVCIアイテム」をバーチャルキャストで一度でも呼び出して使った状態

アイテムを用意して、初期位置を調整する

今回使用するアイテムは下記の2つです。ステッキでウサギさんにタッチすると、ウサギのアニメーションが再生されるシンプルな仕組みです。

・アニメーションさせたいアイテム(今回の例だとウサギ)
・上記にタッチすることでアニメーション再生のトリガーとするアイテム(今回の例だとステッキ)

バーチャルキャスト自体、アバターがタッチしてもアクションは起こらない仕様になっています。アイテムにアクションを起こさせる場合、アイテム同士が接触する・アバターがアイテムをつかんでグリップボタンを押すの2択になります。今回はアイテム同士が接触することでアクションが起こる状態を作っていきます。

1.作成済みの「VCIスクリプトを追加したい"つかんで動かせるVCIアイテム"」があるUnityプロジェクトを開く
2.「root」の下に入っている「つかんで動かしたいアイテム(オブジェクト)」を「Hierarchy」の何もないところにドラッグし、いったん親子関係を解除する
アイテムの大きさを調整したい場合は、この時点で「R」キーを押して調整しておく
3.2.のオブジェクトをクリックし、「Inspector」→「Transform」→「Position」を一度0,0,0にする
4「Hierarchy」→「Create」をクリックし、「CreateEmpty」を選択する
5.空の「GameObject」ができているので、「GameObject」をクリックして適当な英字名に変更する(ここでは「UsaAtari」にしました)
6.5.で作った空のオブジェクトに3.の「つかんで動かしたいアイテム(オブジェクト)」をドラッグし、親子関係にする
f:id:prince9:20190416031456p:plain

7.親子関係になった8.(ここでは「UsaAtari」オブジェクト)をクリックし、Wキーを推して好きな位置に変更する。0,0,0の場合は下すぎてアバターやステージ(環境)によっては手が届かないことがあるため。アバターの顔の位置あたりが適当か?
8.7.を「root」オブジェクトにドラッグ&ドロップし、さらに親子関係にする
f:id:prince9:20190416031544p:plain

アイテムをつかんだり衝突判定ができるようにする

「つかんで動かせるVCIアイテム」を作るときと方法は同じですが、「VCISubItem」と「Box Collider」を設定するオブジェクトが違います。
公式では例としてのみ書かれていて、詳細な説明がないので注意です。

rootオブジェクトに対する設定

1.「Hierarchy」にある「root」をクリックし、「Inspector」に「VCIObject(Script)」があるか確認する。ない場合は「Add Component」をクリックし、検索窓に「VCI」と入力して「VCIObject」を選択して追加する
2.「root」がクリックされている状態で、「Window」メニュー→「Animation」→「Animation」を選択し、「Animation」の画面を出す
3.「Animation」ウィンドウが出てくるので「Create」ボタンを押す
f:id:prince9:20190416040150p:plain
4.英字で名前をつけて「Save」を押す
5.「Animation」ウィンドウの赤い●をクリックし、録画状態にする
f:id:prince9:20190416040329p:plain
6.「Add Property」をクリックし、「つかんで動かしたいアイテム(オブジェクト)の▶︎」→「Transformの▶︎」→「Position横の+」の順でクリックし、下記のような状態にする
f:id:prince9:20190416040759p:plain
7.下記に「15」と入力して、15に飛ぶ
f:id:prince9:20190416041117p:plain
8.「Scene」ビューに戻って、「Hierarchy」の「つかんで動かしたいアイテム(オブジェクト)」をクリックする
9.「W」キーを押して、上方向(Y軸方向)に少し動かす
・0の状態
f:id:prince9:20190416041206p:plain
・15の状態
f:id:prince9:20190416041235p:plain
10.「Animation」ウィンドウの「1:00」のところにある◆マークを「30」のところまでドラッグする
f:id:prince9:20190416041457p:plain
11.赤い●をクリックし、録画状態を解除する
12.「Animation」ウィンドウの赤い●の隣のボタンをクリックし、先頭に戻る
13.「Animation」ウィンドウの▶︎を押して、「Scene」ビューでアニメーションが動いているか確認する
14.「Assets」に「root」という名前のAnimation Controllerができているのを確認する
f:id:prince9:20190416063121p:plain
15.「Hierarchy」の「root」をクリックし、「Inspector」→「Add Component」をクリックする
16.「Inspector」に「Animater」が追加されていなければ、「Add Component」をクリックする。あればそのまま18.へ
17.16.がない場合は検索窓に「Animater」と入力して「Animater」をクリックする
18.「root」オブジェクトの「Inspector」→「Animater」→「Controller」の横の□に、14.で作ったAnimation Controllerをドラッグ&ドロップする
f:id:prince9:20190416063141p:plain

空のオブジェクト(ここでは「UsaAtari」オブジェクト)に対する設定

このオブジェクトに衝突判定やアイテムをつかむ設定を行います。アニメーションがついてない単なる「つかんで動かせるVCIアイテム」とは異なり、アイテムのオブジェクト自体に設定するのではない点に注意!

1.「UsaAtari」をクリックし、「Inspector」→「Add Component」をクリックする
2.検索窓に「VCI」と入力して「VCISubItem」をクリックする
3.「VCI Sub Item(Script)」がInspectorに出ていることを確認し、「Grabbable」にチェックを入れる
「Grabbable」にチェックを入れて、後述のColliderを設定することで掴めるようになります
4.大きさを変えたい場合は「Scalable」と「UniformScaling」にチェックを入れる。
UniformScalingは同じ比率で拡大縮小させる場合にチェックを入れる
5.「Rigidbody」の「Use Gravity」のチェックを外す。
「Use Gravity」のチェックを外す(重力を無視する)+「Is Kinematic」にチェックを入れないと、離したときに落下していくので注意
6.空中に留まっていて欲しいので、「Is Kinematic」にチェックを入れる
7.そのまま「Add Component」をクリックし、検索窓に「Box Collider」と入力して「Box Collider」をクリックする
8.「Edit Collider」ボタンをクリックして画面上で緑の■を動かし、アイテムをタッチしたい+つかみたい範囲が入るように大きさを調整する。
今回はウサギのボディあたりを範囲とした
f:id:prince9:20190416034826p:plain

設定済みの状態がこちらです。「Rigidbody」の「Mass」を10にすることで、つかんだときにあまりフラフラしないようにしています。
f:id:prince9:20190416034930p:plain

タッチされてアクションが起こるオブジェクト(アイテム)に対する設定

特に設定はありません

アクションのトリガーとなるアイテムに対する設定

1.「Assets」に「.fbx」「.glb」形式どちらかのファイルをドラッグ&ドロップして読み込ませる。今回は「Usacon」というオブジェクト名
2.1.を「Hierarchy」の何もないところにドラッグ&ドロップする
3.2.がクリックされている状態で、「W」キーを押して位置を調整する。アバターの顔あたりが無難?
4.3.を「root」オブジェクトにドラッグ&ドロップして、下記のような状態にする
f:id:prince9:20190416043221p:plain
5.4.がクリックされている状態で、「Inspector」→「Add Component」をクリックする
6.検索窓に「VCI」と入力して「VCISubItem」をクリックする
7.「VCI Sub Item(Script)」がInspectorに出ていることを確認し、「Grabbable」にチェックを入れる
「Grabbable」にチェックを入れて、後述のColliderを設定することで掴めるようになります
8.大きさを変えたい場合は「Scalable」と「UniformScaling」にチェックを入れる。
UniformScalingは同じ比率で拡大縮小させる場合にチェックを入れる
9.「Rigidbody」の「Use Gravity」のチェックを外す。
「Use Gravity」のチェックを外す(重力を無視する)+「Is Kinematic」にチェックを入れないと、離したときに落下していくので注意
10.空中に留まっていて欲しいので、「Is Kinematic」にチェックを入れる
11.そのまま「Add Component」をクリックし、検索窓に「Box Collider」と入力して「Box Collider」をクリックする
12.「Edit Collider」ボタンをクリックして画面上で緑の■を動かし、アイテムをタッチしたい+つかみたい範囲が入るように大きさを調整する

設定済みの状態がこちらです。
f:id:prince9:20190416043452p:plain

VCIスクリプトを書く

ようやく下準備が完了しました。後はスクリプトを書いて「root」にコピペするだけです。
今回は「Usacon」というステッキ型のオブジェクトをつかんだ状態でウサギにタッチすると、ウサギがアニメーションする流れになっています。

要素として、
・ステッキとウサギの衝突判定
・衝突するとアニメーションが一度再生される(ループなし)
となります。

実際のコードはこちら。

---[SubItemの所有権]アイテムにCollider(not Trigger)が接触したときに呼ばれる。
---@param item string @SubItem名
---@param hit string @Collider名

function onCollisionEnter(item, hit)
    if (item == "Usacon" and hit == "UsaAtari") or (item == "UsaAtari" and hit == "Usacon") then
        vci.assets._ALL_PlayAnimationFromName("JumpAnim",false)
    end
end

function onCollisionEnter(item, hit)〜でアイテム同士が接触したときの状態を書きます。
if以下〜は、もしアイテム「Usacon」と「UsaAtari」が接触したら、で、
vci.assets._ALL_PlayAnimationFromName〜は「JumpAnim」というアニメーションを一度再生しなさい、という流れです。

vci.assets._ALL_PlayAnimationFromName("アニメーションのファイル名",タッチごとに一度再生ならfalse。ループ再生させるならtrue)となります。
ここでもし「Stopcon」という別アイテムと「Usacon(ステッキ)」が接触したときに再生を止めたいという場合は、function onCollisionEnter(item, hit)の部分に下記を追加します。

    if (item == "Usacon" and hit == "Stopcon") or (item == "Stopcon" and hit == "Usacon") then
        vci.assets._ALL_StopAnimation()
    end

再生と停止両方を入れたスクリプト全体としては下記になります。

function onCollisionEnter(item, hit)
    if (item == "Usacon" and hit == "UsaAtari") or (item == "UsaAtari" and hit == "Usacon") then
        vci.assets._ALL_PlayAnimationFromName("JumpAnim",true)
    end

  if (item == "Usacon" and hit == "Stopcon") or (item == "Stopcon" and hit == "Usacon") then
        vci.assets._ALL_StopAnimation()
    end


end

|

vci.assets._ALL_StopAnimation()で止まります。

VCIスクリプトを適用する

1.「root」オブジェクトをクリックし「Inspector」→「Scripts」に下記を入力する
・Size → 1にする
・Name →「main.lua」と入力
・Source →「VCIスクリプトを書く」項目ので書いたスクリプトをコピペする。必要なコード全体をここにコピペする形です

VCIアイテムを書き出す

1.「Hierarchy」の「root」をクリックし、「VCI」メニュー→「UniVCI-バージョン」→「Export VCI」を選択する
2.ウィンドウが開くので、「新しいフォルダー」をクリックし、「Sample」と名前をつける
3.「Sample」フォルダをダブルクリックし、英語でファイル名をつけて「保存」を押す

The Seed Onlineにアップロードする

1.「The Seed Online」にアクセスする
seed.online

2.ログイン後、すでにアップロード済みの「つかんで動かせるVCIアイテム」をクリックする
3.「別のファイルを再アップロードする」をクリックし、「VCIアイテムを書き出す」3.で書き出した「.vci」ファイルをクリックする
4.「選択」ボタンを押して再アップロードする
8.下の方の「利用規約に同意する」にチェックを入れる
9. バーチャルキャストとThe Seed Onlineを連携した上でバーチャルキャストに入ると、アイテムのところに出てくるので使えるようになる