====== [銃VCI④]VCIスクリプトを作成 ======
\\
このページは\\
[[vci/sample/gun]]\\
解説ページです。
\\
**このページでやることを動画で確認**
{{:vci:sample:gun:sono6.mp4|}}
==== VSCodeの準備 ====
VCIスクリプトを作成することで銃を使ったときに弾を前に飛ばすことが出来るようになります。\\
VCIスクリプトの開発環境の導入がまだの場合は、[[vscode/tutorial]]を参考にVSCodeの準備をしてください。\\
デバックを利用した本格的なスクリプトが不要の方は、準備しなくても構いません。
==== スクリプト全文 ====
--←はコメントアウトで説明を書くときなどに使う。
--アセットの取得
local Gun = vci.assets.GetTransform("Gun") --UnityのObject名が「Gun」の物を Gun に取得。位置や回転を扱えるようにする。
local Bullet = vci.assets.GetTransform("Bullet") --UnityのObject名が「Bullet」の物を Bullet に取得。位置や回転を扱えるようにする。
--銃をuseした時前方に弾を飛ばす
function onUse(use)
local GunPos = Gun.GetPosition() --銃の位置を取得。弾を銃の位置と合わせるのに必要
local houkou = Gun.GetUp() --銃の前方を取得。UnityのCylinderの場合、上が銃の前方になるのでGetUp()を使用
--弾を銃の前方に飛ばすのに必要
Bullet.SetPosition(GunPos + houkou*1.5) --弾の位置を銃の位置(GunPos)から少し前方(houkou*1.5)に設定する。
Bullet.SetVelocity(Vector3.zero) --弾のrigitbodyにかかる速度をゼロにする。(1発目に撃った弾の速度を0にしてから力を加えないと挙動がおかしくなるため。)
Bullet.AddForce(3000*houkou) --弾に(銃の方向×3000)の力を加える。
--3000の値を大きくすると弾速が速くなり、小さくすると遅くなる。
end
使用している関数一覧
* [[https://developer.virtualcast.jp/vci-docs/api/classes/ExportAssets/GetTransform.html | vci.assets.GetTransform("")]]
* [[https://developer.virtualcast.jp/vci-docs/api/events/onUse.html | onUse(use)]]
* [[https://developer.virtualcast.jp/vci-docs/api/classes/ExportTransform/GetPosition.html | GetPosition()]]
* [[vci/script/reference/exporttransform | GetUp()]]
* [[https://developer.virtualcast.jp/vci-docs/api/classes/ExportTransform/SetPosition.html | SetPosition()]]
* [[https://developer.virtualcast.jp/vci-docs/api/classes/ExportTransform/SetVelocity.html | SetVelocity()]]
* [[https://developer.virtualcast.jp/vci-docs/api/classes/ExportTransform/AddForce.html | AddForce()]]
===== 手順 =====
**1. アセットの取得について**
--アセットの取得
local Gun = vci.assets.GetTransform("Gun") --UnityのObject名が「Gun」の物を Gun に取得。位置や回転を扱えるようにする。
local Bullet = vci.assets.GetTransform("Bullet") --UnityのObject名が「Bullet」の物を Bullet に取得。位置や回転を扱えるよう
Unityで作成したGun(銃本体)とBullet(弾)をスクリプトで制御するために、''vci.assets.GetTransform''を使用して変数(local Gun でGunという変数を作成している。)に取り出します。\\
スクリプトではここで指定した変数名を使ってUnityのObjectを操作します。\\
''local 変数名 = vci.assets.GetTransform("UnityのObject名")''\\
{{vci:sample:gun:jyu24.png?direct}}
**2. function onUse(use)について**
function onUse(use)
--ここにVCIがUseされたときの処理を書く
end
onUseはイベント関数といってシステムによって関数名と関数の挙動が定義されているものです。\\
他にも触った時、つかんだ時のイベント関数もあります。詳しくは[[vci/script/reference/eventfunction]]を参照してください。\\
**3. 弾を発射するための準備**
local GunPos = Gun.GetPosition() --銃の位置を取得。弾を銃の位置と合わせるのに必要
local houkou = Gun.GetUp() --銃の前方を取得。UnityのCylinderの場合、上が銃の前方になるのでGetUp()を使用
--弾を銃の前方に飛ばすのに必要
弾を飛ばすにはどこからどの方向に飛ばすのかを指定するための情報が必要になります。\\
今回は銃の位置から、銃を向けている方向に飛ばしたいので''GunPos''に銃の位置(Gun.GetPosition())を、''houkou''に銃が向いている方向(Gun.GetUp())を指定します。
{{ vci:sample:gun:jyu25.png?direct}}
{{ vci:sample:gun:jyu26.png?direct}}
**4. 弾を発射する**
どこからどの方向にどれだけの速度で発射するかを弾に伝えます。
Bullet.SetPosition(GunPos + houkou*1.5) --弾の位置を銃の位置(JyuPos)から少し前方(houkou*1.5)に設定する。
Bullet.SetVelocity(Vector3.zero) --弾のrigitbodyにかかる速度をゼロにする。(1発目に撃った弾の速度を0にしてから力を加えないと挙動がおかしくなるため。)
Bullet.AddForce(3000*houkou) --弾に(銃の方向×3000)の力を加える。
--3000の値を大きくすると弾速が速くなり、小さくすると遅くなる。
''Bullet.SetPosition(GunPos)''は、弾を手順3で取得した銃の位置に移動する処理です。\\
ただし、このままだと銃と完全に位置が同じになってしまうので弾が銃に埋まって挙動がおかしくなります。
''Bullet.SetPosition(GunPos + houkou*1.5)''とすると、銃の位置から銃の方向に少しだけずらした位置に弾を移動することができます。
{{ vci:sample:gun:jyu27.png?direct}}
{{ vci:sample:gun:jyu28.png?direct}}
次に''Bullet.SetVelocity(Vector3.zero)''で弾の速度を0に指定しています。\\
これをしないとUseする前の速度を引き継いでしまいます。
例えば、連続で弾を発射した場合、2倍、3倍、4倍・・・・と弾の速度がどんどん速くなります。(実際には重力で下方向にかかっている力をリセットできていないので1発目から挙動がおかしくなることがあります。)\\
''Bullet.SetVelocity(Vector3.zero)''を実行することで弾に何も力がかかってない状態にします。\\
これで、弾が銃の前方にきて静止している状態になりました。
次に''Bullet.AddForce(3000*houkou)''で弾を前方に飛ばします。\\
これは、手順3で銃の向きをhoukouに取得しているので、houkouの向きに3000を掛けた力を弾に与えています。\\
3000は弾に与える力の大きさと考えて大丈夫です。
この値を大きくすると速い弾を、小さくすると遅い弾を発射します。
{{vci:sample:gun:jyu29.png?direct}}
これで弾を発射する銃とスクリプトの準備ができました。\\
次にVCIとしてバーチャルキャストで使えるようにします。
^[[vci/sample/gun|銃VCI Top]]^^
^次のページ| [[vci/sample/gun/05]] |