プレイヤーが青い領域に侵入すると正面からCubeが飛んできて、プレイヤーに接触するとCubeが停止してコントローラーのバイブレーションが作動するサンプルの解説
Udonスクリプト作成
FireOnTriggerとProjectileをU#に書き直し
Udon Graph
Projectileはデカすぎてスクショに収まらないので画像添付していません。
U#
OnPlayerCollisionEnter・・・接触する
OnPlayerCollisionExit ・・・接触しなくなった
public class FireOnTriggerBySharp : UdonSharpBehaviour
{
public ProjectileBySharp projectile;
public override void OnPlayerTriggerEnter(VRCPlayerApi player)
{
projectile.Fire();
Debug.Log($"send OnPlayerTriggerEnter to {projectile}");
}
}
public class ProjectileBySharp : UdonSharpBehaviour
{
public Text textField;
public Rigidbody cubeRigidbody;
public ConstantForce force;
private Vector3 _originalPosition;
void Start()
{
_originalPosition = cubeRigidbody.position;
}
public void Fire()
{
ResetRigid();
force.enabled = true;
}
private void ResetRigid()
{
cubeRigidbody.position = _originalPosition;
cubeRigidbody.rotation = Quaternion.identity;
cubeRigidbody.angularVelocity = new Vector3(0, 0, 0);
cubeRigidbody.velocity = new Vector3(0, 0, 0);
force.enabled = false;
}
// 接触状態でなくなった
public override void OnPlayerCollisionExit(VRCPlayerApi player)
{
textField.text = $"{player.displayName} Exited";
ResetRigid();
}
// 接触した
public override void OnPlayerCollisionEnter(VRCPlayerApi player)
{
textField.text = $"{player.displayName} Extered";
// 接触するとコントローラーのバイブレーションを発生させる
player.PlayHapticEventInHand(VRC_Pickup.PickupHand.Left, 0.25f, 1, 1);
player.PlayHapticEventInHand(VRC_Pickup.PickupHand.Right, 0.25f, 1, 1);
}
}
シーン作成
飛んでくるCubeはIsTriggerのチェックマークを外したままにして下さい。これを外すと壁や床の判定でなくなり、プレイヤーがCubeの内部に侵入できてしまいます。
あとは物理演算ができるようにRegidbodyを追加
力を加えて移動させるためにConstant Forceを追加して力量を設定すれば完成です。
壁や床の接触判定を作成する