/////////////////// // MONOBEHAVIOUR // /////////////////// void OnCollisionEnter(Collision collision) { // Never collide with any SteamVR tracked objects if (collision.gameObject.GetComponent <SteamVR_TrackedObject>()) { return; } if (armSwinger.preventWallClip == false || armSwinger.wallClipPreventionPaused || armSwinger.preventionsPaused) { return; } // If we're already in geometry, unconditionally push back if (inGeometry) { armSwinger.triggerRewind(ArmSwinger.PreventionReason.HEADSET); armSwinger.wallClipThisFrame = true; return; } if (armSwinger.currentPreventionReason == ArmSwinger.PreventionReason.NONE || armSwinger.currentPreventionReason == ArmSwinger.PreventionReason.HEADSET) { if ((groundRayLayerMask.value & 1 << collision.gameObject.layer) != 0) { foreach (ContactPoint contactPoint in collision.contacts) { Vector3 normalOfCollisionPoint = contactPoint.normal; float angleOfCollisionPoint = Vector3.Angle(Vector3.up, normalOfCollisionPoint); //Debug.Log("this.transform=" + this.transform); //Debug.Log("previousCollisionTransform=" + previousCollisionTransform); if (this.transform.position == previousCollisionPosition && this.transform.rotation == previousCollisionRotation) { return; } if (angleOfCollisionPoint >= minAngleToRewindDueToWallClip) { inGeometry = true; armSwinger.triggerRewind(ArmSwinger.PreventionReason.HEADSET); armSwinger.wallClipThisFrame = true; previousCollisionPosition = this.transform.position; previousCollisionRotation = this.transform.rotation; return; } } } } }
/////////////////// // MONOBEHAVIOUR // /////////////////// void OnCollisionEnter(Collision collision) { // Never collide with any SteamVR tracked objects if (collision.gameObject.GetComponent <SteamVR_TrackedObject>()) { return; } if (armSwinger.preventWallClip == false || armSwinger.wallClipPreventionPaused || armSwinger.preventionsPaused || inGeometry == true) { return; } if (armSwinger.currentPreventionReason == ArmSwinger.PreventionReason.NONE || armSwinger.currentPreventionReason == ArmSwinger.PreventionReason.HEADSET) { if ((groundRayLayerMask.value & 1 << collision.gameObject.layer) != 0) { Vector3 normalOfCollisionPoint = collision.contacts[0].normal; float angleOfCollisionPoint = Vector3.Angle(Vector3.up, normalOfCollisionPoint); if (angleOfCollisionPoint >= minAngleToRewindDueToWallClip) { inGeometry = true; armSwinger.triggerRewind(ArmSwinger.PreventionReason.HEADSET); } } } }