※この記事は、VCI Advent Calendar 2019 の8日目の記事です。
※2021年12月12日:参考資料、画像、サンプル更新、新しいVCIメッセージ機能に変更
所有権を無視してものをぶっ飛ばす銃弾について話します
事前準備
VCIの基本作成について学ぶ
説明はこっち:
作り方
GameObject
GunModel:銃のモデル + コライダー、物理衝突しないように Is Trigger にする
BulletOut:銃口の座標情報取得用の GameObject
Bullet:Rigidbody だけの GameObject、VCI Sub Item入れないです、地面下に設置する
スクリプト
定義宣言
---銃口
local ShootPoint = vci.assets.GetTransform('ShootPoint')
---銃弾
local Bullet = vci.assets.GetTransform('Bullet')
メッセージ関数用意
---射撃メッセージ処理(全員に処理)、同じ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)
銃をグリップするとメッセージを送信
---[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 の所有権持っ人はぶっ飛す物理処理ができる
欠点
- 銃弾は同期から解放したから位置がずれる可能性がある、特に何がぶつけた後
でもみんな同じもの当たれば問題ない -
同じVCIならメッセージがかぶる
最新版のバーチャルキャストで追加されたVCI関数vci.assets.GetInstanceId()
があります
この関数使えばVCIのInstanceIdが取れます、部屋内のVCIが全部違うIDがあります、同じVCIが複数あっても違うです
これをメッセージの名前に入れることで自分以外のVCIからメッセージ受け取ること防げます
最後までお読だあなたに
この記事のサンプルVCI「所有権貫通銃」限定公開取り込みURLです、ありがとうございました。