LoginSignup
2
1

More than 3 years have passed since last update.

はじめに

この記事は、VCI Advent Calendar 2019の1日目の記事です。

回る

PDCA_RotateA.gif

投げる

PDCA_RotateB.gif
PDCAは投げ捨てるもの

サンプル

PDCA - アイテム情報確認 - THE SEED ONLINE(α)

作り方

作成に必要な各アプリ(特にUnity)の導入についてはこちらを確認してください。
Virtual Cast Wiki : 初めてVCIを作成する

ざっくりいくよー。

1.VCIObjectの作成

Hierarchyを右クリックして、
VCI > PlainVCI

を選択して作成します。
そして下記画像のように入力していきます。
PDCA 0.png

2.VCI SubItemの作成

上記で作成したHierarchyのVCIObjectを右クリックして、
Create EmptyでGameObjectを作成します。

VCI SubItemの追加・設定

作成したGameObjectを選択して、名前を変更し、Inspector画面からAddComponentをクリックして
検索から
「VCI」
を入力します。
すると、「VCI SubItem」が表示されるのでそれをクリックしてアタッチしてください。
image.png
今回は、

  • 回っているPDCAを掴みたい
  • 回っているPDCAを投げ捨てたい
  • 回っているPDCAを大きくしたり小さくしたい

という考えなので、

  • Grabbable
  • Scalable
    • Uniform Scaling

の3つにチェックを入れてください。
意味としては

  • Grabbable 掴めるか
  • Scalable 両手で掴んで大きさの変更が可能か
    • Uniform Scalable X,Y,Zの比率を維持した拡縮に制限するか

になります。
VCI SubItemについての詳細はこちら
VCI SubItem Component

Rigidbodyの設定

VCI SubItemが追加される際に、Rigidbodyコンポーネントが自動で追加されます。
Unity Documentation:Rigidbody
重要な箇所のみざっくり説明します。

Mass 単位はKg
Drag 抵抗。値が低いと、オブジェクトが重く見えるようになります。この値が高いと、軽く見えます。 Drag の通常の値は、0.001 (金属の塊) と 10 (羽) の間です。
Angular Drag 回転の抵抗
Use Gravity 重力の影響を受けるか
Is Kinematic 物理エンジンの影響を無効にするか
Freeze Position XYZ軸の移動を制限するか
Freeze Rotation XYZ軸の回転を制限するか

例えば猫耳を体に付けるためのVCIを作成したい場合は

  • Use Gravity
  • Is Kinematic

にすると良いです。

Box Colliderの追加

VCIの時と同様にBoxを入力するとBox Colliderが出てくるのでそれを選択します。
Box Collider 2Dを選択しないように注意して下さい。
image.png

大きさは下記を参考にしてください。
PDCA 5.png

Box Colliderの範囲がそのSubItemを掴める範囲になります。
また、Is Triggerについてですが、

  • Is Trigger:物理的な当たり判定がある
  • Is Trigger:物理的な当たり判定がない

ぐらいに思っていれば最初はOKです。装着VCIの場合は基本的にチェックが付いていることをお勧めします。

3.回転するGameObjectの作成

前回同様に、空のGameObjectを作成して、名前を変更します。
このGameObjectの下に回転させるGameObjectを設置していきます。
PDCA 18.png

4.描画用GameObjectの追加

テキスト裏の白背景の追加

文字の後ろに白背景を用意したいので、HierarchyのRotatePDCAを右クリックして
3D GameObject > Plane
を選択してPlaneを作成します。初期値がすごく大きいのでScaleを小さくしましょう。
PDCA 26.png

テキストの追加その1

HierarchyのRotatePDCAを右クリックして
VCI > Text
を追加します。
うまく動作しない場合は下記URLを参照してください。
VCI Text (TextMeshPro)
PDCA 34.png
作成したら、上記画像のように値を入力します。

テキストの追加その2

Hierarchyから、上記で作成したTextをコピーして同じところに貼り付けます。
Rotationを180度回転させます。
PDCA_00 40.png

5.スクリプトの追加

今回は回転させるためのスクリプトの作成が必要になります。
コピペでOK。ということでもいいと思いますが少し解説します。
全文はこちら

main.lua
---@type ExportTransform @回転させるGameObjectをGetSubItemしたもの
local PDCARotate = vci.assets.GetSubItem("RotatePDCA")
---@type number @Y軸の回転角度
local RotateY_Axis = 0

---全ユーザーで毎フレーム呼ばれる
function updateAll()
    RotateY_Axis = RotateY_Axis + 2
    PDCARotate.SetLocalRotation(Quaternion.Euler(0,RotateY_Axis ,0))
    if RotateY_Axis == 360 then 
        RotateY_Axis = 0
    end
end

GetSubItem()

まずは始めの1文です

---@type ExportTransform @回転させるGameObjectをGetSubItemしたもの
local PDCARotate = vci.assets.GetSubItem("RotatePDCA")

GetSubItemの解説はこちらとこちらに任せるとして、
バーチャルキャストのVCIスクリプトの例
ExportTransform
今回は「subItem VCI」の付いたGameObject名ではなく、「subItem VCI」の付いたGameObjectの子供のGameObject名を記載しています。
そう、関数名はGetSubItemなのですが、別にSubItemじゃないGameObjectもGetSubItemできます。
ちなみにSubItemじゃないGameObjectの位置は同期されません(初期位置固定)
今回はPDCAが回っていることが重要で皆が同じPDCAの位置を共有している必要はないため、回転位置を同期しない実装にしています。
リアルでも共有って難しいよね

updateAll()

updateAll関数についての注意点を少し。

---全ユーザーで毎フレーム呼ばれる
function updateAll()
    RotateY_Axis = RotateY_Axis + 2
    PDCARotate.SetLocalRotation(Quaternion.Euler(0,RotateY_Axis ,0))
    if RotateY_Axis == 360 then 
        RotateY_Axis = 0
    end
end

全ユーザーで毎フレーム呼ばれますが、全ユーザーの秒間のフレーム数・開始タイミングはそれぞれ異なります。

これはお互いがPDCAのCを指している様子
PDCA_Rotate.gif
このような実装をする場合には、お互いが秒間フレームが異なる状態でも問題のないVCIである必要があります。

最後に

Export VCIボタンを押して.vciファイルを作成します。
あとはTHE SEED ONLINEにアップすればバーチャルキャスト上で利用することができるようになります。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1