4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

VCIAdvent Calendar 2019

Day 8

所有権を貫通する銃弾について

Last updated at Posted at 2019-12-07

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

※2021年12月12日:参考資料、画像、サンプル更新、新しいVCIメッセージ機能に変更

所有権を無視してものをぶっ飛ばす銃弾について話します

事前準備

VCIの基本作成について学ぶ

説明はこっち:

作り方

GameObject

GameObject

Gun:掴めるを設定するsubitem
image.png

GunModel:銃のモデル + コライダー、物理衝突しないように Is Trigger にする
image.png

BulletOut:銃口の座標情報取得用の GameObject
image.png

Bullet:Rigidbody だけの GameObject、VCI Sub Item入れないです、地面下に設置する
image.png

BulletModel:銃弾のモデル + コライダー
image.png

スクリプト

定義宣言

main.lua
---銃口
local ShootPoint = vci.assets.GetTransform('ShootPoint')
---銃弾
local Bullet = vci.assets.GetTransform('Bullet')

メッセージ関数用意

main.lua
---射撃メッセージ処理(全員に処理)、同じVCIや別VCIのメッセージ名前が被るを防ぐ為にメッセージ名前にInstanceId入れます
vci.message.On('GUN_SHOT' .. vci.assets.GetInstanceId(), function (sender, name, message)
    ---銃弾が銃口に移動
    Bullet.SetPosition(ShootPoint.GetPosition())
    ---銃弾の速度を消す
    Bullet.SetVelocity(Vector3.zero)
    Bullet.SetAngularVelocity(Vector3.zero)
    ---銃弾を銃口のz軸方向に飛ばす
    Bullet.AddForce(ShootPoint.GetForward() * 1500)
end)

銃をグリップするとメッセージを送信

main.lua
---[SubItemの所有権&Use状態]アイテムをグラッブしてグリップボタンを押すと呼ばれる。
---@param use string @押されたアイテムのSubItem名
function onUse(use)
    ---SubItem名'Gun'をuseしたらメッセージ全員に送信
    if use == 'Gun' then
        vci.message.Emit('GUN_SHOT' .. vci.assets.GetInstanceId(), true)
    end
end

原理説明

subitemの所有権と物理計算

つまり

SubItem の所有権持つ人:SubItem の物理計算を担当する
SubItem の所有権持っていない人:ネットワークから受信した物理計算の結果を見るだけ

それで SubItem の銃弾にするとこうなる

銃弾の所有権持つ人:ぶっ飛ばしたい SubItem の所有権持ってないからぶっ飛すの物理計算はできない、弾は壁に当たったようにはじかれる
ぶっ飛ばしたい SubItem の所有権持っ人:弾は位置を"再生"するだけ

解決策

銃弾の SubItem を抜いて所有権と同期から解放する!!

そしてメッセージでみんなのバーチャルキャストにいる銃弾を同じ位置、同じ方向、同じ速度で飛ばす、これでぶっ飛ばしたい SubItem の所有権持っ人はぶっ飛す物理処理ができる

欠点

  1. 銃弾は同期から解放したから位置がずれる可能性がある、特に何がぶつけた後
    でもみんな同じもの当たれば問題ない
  2. 同じVCIならメッセージがかぶる
    最新版のバーチャルキャストで追加されたVCI関数vci.assets.GetInstanceId()があります
    この関数使えばVCIのInstanceIdが取れます、部屋内のVCIが全部違うIDがあります、同じVCIが複数あっても違うです
    これをメッセージの名前に入れることで自分以外のVCIからメッセージ受け取ること防げます

最後までお読だあなたに

この記事のサンプルVCI「所有権貫通銃」限定公開取り込みURLです、ありがとうございました。

4
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
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?