0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

持ち物の概念をつくる その3

Posted at

「VキャスのVCIで◯ine◯raftっぽいもの作る Advent Calendar 2024」11日目

Vキャス内で、穴を掘って、石を砕き、木を切って、組み合わせて武器を作って、何なら出てくる敵を倒して・・・
そんなことをやりたいなぁっていう試みを12月でできるところまで行こうというカレンダーの11日目です!

今日はON/OFFの状態切り替えを作っていきます。

持ち物の概念をつくる その3

ON/OFFの切り替えはオブジェクト自体を消さず、サイズを操作することでそう見えるようにします。
つまり、ONのときはアクセサリー部分が極めて小さくなり板は通常サイズになり、OFFのときは板が極めて小さくなりアクセサリー部分が通常サイズになるというような処理を書きます。

手順

① USEでON/OFFを切り替わるようにする。

Visual Studio Codeを開き、EmbeddeedScriptWorkspace階層を開きます。
image.png

情報表示板のmain.luaを開き、コードを追記していきましょう。
image.png

ON状態でOFFへの切り替えの判定を行うのは、l_vというオブジェクトになります。
image.png

逆にOFF状態でONへの切り替え判定を行うのは、Cylinderというオブジェクトです。
image.png

この2つのオブジェクトのUSEを押したら、状態が変化するようにします。
この記述は簡単にすみます。

function onUse(target)
    if target == "l_v" and mode==true then
        mode = false
    elseif target == "Cylinder" and mode==fales then
        mode = true
    end
end

USEをしたときに、その対象がON/OFFを切り替えるオブジェクトでかつ、切り替えるタイミングのmodeのときにmodeを切り替えるという処理です。

② ONとOFFのサイズ変更処理を書く

modeの切り替えを書いたので、modeがONのときの処理を書きます。
これは関数として書いておいた方がほかで呼びやすいので関数を書きます。

function setON()
    Cube.SetLocalScale(Vector3.__new(0.6,0.01,0.35))
    for key, value in pairs(SubItems) do
        if key == "l_v" then
            SubItems[key].item.SetLocalScale(Vector3.__new(0.1,0.02,0.085))
        elseif key == "select" then
            SubItems[key].item.SetLocalScale(Vector3.__new(0.12,0.02,0.12))
        elseif key == "Sphere" then
            SubItems[key].item.SetLocalScale(Vector3.__new(0.2,0.2,0.2))
        else
            SubItems[key].item.SetLocalScale(Vector3.__new(0.08,0.01,0.08))
        end
    end
    Cylinder.SetLocalScale(Vector3.__new(0.001,0.001,0.001))
end

ONのときに、Cube(板)と、各ボタンのサイズを視覚的に見える状態(Unityでの設定サイズ)にして、Cylinder(OFFのとき出ているアクセサリー)を小さくするという処理が書かれています。

同様に反対の記述をOFFように書きます。

function setOFF()
    Cylinder.SetLocalScale(Vector3.__new(0.1,0.01,0.1))
    for key, value in pairs(SubItems) do
        if key == "l_v" then
            SubItems[key].item.SetLocalScale(Vector3.__new(0.001,0.001,0.001))
        elseif key == "select" then
            SubItems[key].item.SetLocalScale(Vector3.__new(0.001,0.001,0.001))
        elseif key == "Sphere" then
            SubItems[key].item.SetLocalScale(Vector3.__new(0.2,0.2,0.2))
        else
            SubItems[key].item.SetLocalScale(Vector3.__new(0.001,0.001,0.001))
        end
    end
    Cube.SetLocalScale(Vector3.__new(0.001,0.001,0.001))
end

OFFでもONでも、腕につけるオブジェクト(Sphere)はサイズが変わらないので同じことを書いています。
※サイズ変更がないので、変更させない分岐でも良い

③ 昨日の設定部分の間違いを治す

ON/OFFはUSEで切り替えることを考えていました。
USEが働く条件を公式リファレンスを確認すると

UseをするにはSubItemがGrabできる設定になっている必要があります。SubItemがGrabができるためには、自身を含む子孫にColliderがアタッチされており、かつSubItemの Grabbable が true になっている必要があります。

とあり、昨日Unityで設定したGrabbableのチェック外しをしていると、USEが機能しないことがわかります。

そこでUnityからVCToolkittを再度開き修正します。
image.png

Grabbableのチェックを付け、しかし移動できないように、RigiodbodyのConstrainsにチェックを入れて動かないようにしました。

修正したら、再度VirtualCastへ投稿(更新)します。
image.png

この状態で、再度VirtualCastを起動し、VCIを更新して②で定義した関数を、USE時に実行するように記述して試してみます。

function onUnuse(subItemName)
    if subItemName == "l_v" and mode==true then
        mode = false
        setOFF()
    elseif subItemName == "Cylinder" and mode==false then
        mode = true
        setON()
    end
end

OFFに(l_vオブジェクトをUSE)したら、OFFにする関数を実行し、ONに(CylinderオブジェクトをUSE)したら、ONにする関数を実行。
という記述です。

VR上で試してみます。
板のON/OFFボタンをUSEして、消える。

そして、円柱をUSEすると、板が復帰する。

これで表示のON/OFFができました。

おわりに

これで、表示のON/OFFができました。
今の状態は、持ち運ぶことはできますが、実は手に装着状態では板が追従してくれません。
そこで、明日は手に装着しているときも追従して、でも手で持っているときは手で持っている方に追従するようにコードを書き換えていこうと思います。

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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?