Yes Second Life

セカンドライフ向けWebサービスを作ってました。このブログではVR・メタバースのことを書いていきます

High Fidelityのスクリプト

この記事は、セカンドライフ技術系アドベントカレンダー2016向けの記事です。

www.adventar.org

去年に引き続き、誰にも望まれていないHighFidelityの記事になっております。HighFidelityはオープンソースだし、自鯖に入れて遊べるし、自由度が高いから個人的に広まってほしいです。

High Fidelity

さて今回のお題はスクリプト。まずはざっくりとした説明から。

言語はJavascriptです。なのでセカンドライフみたいなState構文とかはありません。作成したスクリプトは、勝手にサーバ上に保存されたりしないので、ローカルマシンのディスクに保存したり、Webサーバ上に置いたりして、インワールドからファイルパスやURLを指定して読み込みます。

そしてHighFidelityには3タイプのスクリプトがあります。

  • Interface Scripts
  • Assignment Client Scripts
  • Entity Scripts

それぞれ役割が違うので詳しく説明していきます。

Interface Scripts

これを説明する前にまずはHighFidelityのアーキテクチャについて、ちょっと知っておく必要があります。簡単に言うとセカンドライフでいうところのシムにあたるのがドメインサーバ、ビューワにあたるのがインターフェースです。Interface Scriptsは、名前の通りインターフェース上で動作するスクリプトです。メニューから「Edit → Running Scriipts」と進むと、インターフェースで動作しているスクリプトを確認したり、新しくスクリプトをロードしたりできます。
f:id:sabro:20161129010307p:plain:h600
たとえば、こんなスクリプトを書いてローカルのディスクに保存して、FROM DISKボタンからロードすると

Window.alert("ウィンドウ テスト!");

こんなダイアログを出せます。
f:id:sabro:20161129012809p:plain:w480
Interface Scriptの主な役割は、メニュー等のUI構築や、インターフェースが起動している間だけ使用する一時的なタスクの実行などになります。ちなみに、Interface Scriptはインターフェース上で動作しますが、そのスクリプトが与えた影響は他のユーザにも反映されます。例えば、スクリプトからオブジェクトの色を変えると他のユーザのディスプレイ上でも同じく色が変わります。

Assignment Client Scripts

Interface Scriptでも大体のことができるんですが、インターフェース上で動くという性質上、ログアウトすると処理が中断してしまうという欠点があります。例えばオブジェクトをアニメーションさせるスクリプトを動かしてからログアウトすると、アニメーションが止まってしまいます。

こういうときに使えるのがAssignment Client Scriptです。名前にClientと入ってますが、これはサーバ側で動作するスクリプトです。なんでこんな名前になってるかを理解するには、HighFidelityのアーキテクチャをもう少し知る必要があります。
f:id:sabro:20161129220409p:plain:w480
↑公式サイトより引用

Domain Serverの下に、AudioMixer、AvatarMixer、EntityServerが動的に割り当てられている感じになってるのが分かります。スクリプトはこれらの割り当てられたサーバで動作します。これらのサーバはDomain Serverから見たら割り当てられたクライアントなので、スクリプトもAssignment Client Scriptと呼ばれるわけです。ちなみに、これらのDomain Serverに紐ついたサーバ群は、Domain Serverと別のマシンで動かすこともできますが、基本的には同一のマシン上で動かすことが多いみたいです。なので、スクリプトはDomain Server上で動いてるくらいの認識で大体合ってると思います。

さて、Interface Scriptsはインターフェースのメニューからロードしましたが、Assignment Client Scriptは、Domain Serverの設定メニューから指定します。
f:id:sabro:20161129222549p:plain:w480
Scriptメニューで、URL、インスタンス数を入力します。Poolはブランクでいいみたいです。

Entity Scripts

Entity Scriptは名前から大体わかると思いますが、インワールドで生成されたオブジェクトに紐付けられているスクリプトです。主にタッチや衝突検知などのイベントをトリガーにして何かしたいときに使用します。

Entity Scriptはオブジェクト編集メニューのScriptURLでオブジェクトと紐つけることができます。Entity Scriptは他のインターフェースからもロードできる必要があるので、ローカルディスクのパスは指定できません。httpのURLを指定しましょう。
f:id:sabro:20161129233242p:plain:h600
Entity Scriptsは、ちょっと書き方が特殊で、匿名関数でイベントを定義するみたいな書き方になります。こんな感じのスクリプトを書いてやると

(function() {
	this.clickDownOnEntity = function(entityID, mouseEvent) {
		Window.alert("クリック テスト!");
	};
})

オブジェクトをタッチでダイアログがでます。
f:id:sabro:20161129235422p:plain:w480

さて、一通り説明できましたけど、少しでも興味を持ってもらえたでしょうか?基本がJavascriptなのでLSLよりとっつきやすく、多くの人がすんなり書き始められるんじゃないかと思います。関数一覧は下のリンクから見れるので、気になった人は覗いてみてくださいね( ̄∇  ̄ )
Category:JavaScript API - High Fidelity Documentation