Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma strict
- var layerMask : LayerMask; //make sure we aren't in this layer
- var skinWidth : float = 0.1; //probably doesn't need to be changed
- var skipFixedUpdates : int = 0;
- private var skips : int;
- private var minimumExtent : float;
- private var partialExtent : float;
- private var sqrMinimumExtent : float;
- private var previousPosition : Vector3;
- private var myRigidbody : Rigidbody;
- //initialize values
- function Awake() {
- myRigidbody = rigidbody;
- previousPosition = myRigidbody.position;
- minimumExtent = Mathf.Min(Mathf.Min(collider.bounds.extents.x, collider.bounds.extents.y), collider.bounds.extents.z);
- partialExtent = minimumExtent*(1.0 - skinWidth);
- sqrMinimumExtent = minimumExtent*minimumExtent;
- }
- function OnEnable() {
- myRigidbody = rigidbody;
- previousPosition = myRigidbody.position;
- minimumExtent = Mathf.Min(Mathf.Min(collider.bounds.extents.x, collider.bounds.extents.y), collider.bounds.extents.z);
- partialExtent = minimumExtent*(1.0 - skinWidth);
- sqrMinimumExtent = minimumExtent*minimumExtent;
- }
- function FixedUpdate() {
- if(skips >= skipFixedUpdates)
- {
- skips = 0;
- //have we moved more than our minimum extent?
- var movementThisStep : Vector3 = myRigidbody.position - previousPosition;
- var movementSqrMagnitude : float = movementThisStep.sqrMagnitude;
- if (movementSqrMagnitude > sqrMinimumExtent) {
- var movementMagnitude : float = Mathf.Sqrt(movementSqrMagnitude);
- var hitInfo : RaycastHit;
- //check for obstructions we might have missed
- if (Physics.Raycast(previousPosition, movementThisStep, hitInfo, movementMagnitude, layerMask.value))
- myRigidbody.position = hitInfo.point - (movementThisStep/movementMagnitude)*partialExtent;
- }
- previousPosition = myRigidbody.position;
- }
- else
- {
- skips += 1;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement