目次

つかんで飛ぶ紙飛行機

対応バージョンは、UniVCI v0.35以降です。

つかんだ状態でジャンプすると、グライダーのように滑空したり、つかんだ位置からわずかに上昇飛行が出来るVCIです。

サンプルデータ

https://virtualcast.jp/products/cbf9734b7af5f7fa8c4d205711aa53cbc902db06066f6080ea6a6562286ba18a

Unitypackage

gameapi_glider.zip

コンポーネント設定

VCI Object

Sub Item 設定一覧 (クリックで展開)
VCI Sub Item : GliderHandle
VCI Attchable (装着ボーンはLeft Hand/Right Hand)

VCIスクリプト

main.lua
local localPlayer = vci.vc.room.GetLocalPlayer()
 
local gravity = Vector3.Magnitude(vci.vc.room.GetGravity())
local playerController = localPlayer.GetRoomPlayerController() 
local handle = vci.assets.GetTransform("GliderHandle")
 
local glindStartedY = 0
local initialPotential = 0
local _grounded = false
local prevTime = os.time()
 
 
function updateAll()
 
    if handle.IsAttached == false or handle.IsMine == false then
        return
    end
 
    -- 最初に足を離したら開始
    if _grounded == true and playerController.IsGrounded() == false then
        initalize()
    end
 
    _grounded = playerController.IsGrounded()
    if _grounded == true then return end
 
    local y = localPlayer.GetPosition().y
 
    -- 落下開始地点からの差分
    local deltaY = (glindStartedY + initialPotential) - y
 
    if deltaY <0 then return end
 
    local f = handle.GetForward().normalized
 
    -- 落下した分の位置エネルギーがすべて運動エネルギーに変わったとする
    local t = math.sqrt(2.0 * gravity * deltaY)
 
    local next = f * t
 
    playerController.SetVelocity(next)
end
 
function initalize()
    -- 落下開始地点
    glindStartedY = localPlayer.GetPosition().y
    local v = Vector3.Magnitude(playerController.GetVelocity())
    -- 落下時に初速を持っていたらその分だけ高い位置から開始したとみなす
    initialPotential = v * v / (gravity * 2.0)
end