public override void CollideWithWave(WavePositionInfo waveInfo) { if (waveInfo.position.y - transform.position.y > returnDepth) { knifeController.ReturnKnifeTransition(); } }
/* * Perform raycasts underneath and apply hover force based on the closest hit */ void ApplyHoverForce() { // raycast and apply hover force float maxHoverForce = 0f; Vector3 origin = position + (Vector3.up * rayCastHeightModifier); int raysToCheck = controllerActive ? raycastDirections.Count : 1; // only checks down ray when controller not active for (int i = 0; i < raysToCheck; i++) { RaycastHit hitInfo; float rayLength = CalculateHoverRayLengthFromIndex(i); if (Physics.Raycast(origin, raycastDirections[i], out hitInfo, rayLength, raycastMask, QueryTriggerInteraction.Collide)) { float distance = hitInfo.distance; if (hitInfo.collider.isTrigger) { WaveShaderPositionTracker waveShaderPositionTracker = hitInfo.collider.GetComponent <WaveShaderPositionTracker>(); if (waveShaderPositionTracker != null) { WavePositionInfo waveInfo = waveShaderPositionTracker.CalculateDepthAndNormalAtPoint(hitInfo.point); distance = Mathf.Abs(waveInfo.position.y - origin.y); } else if (Physics.Raycast(origin, raycastDirections[i], out hitInfo, rayLength, raycastMask, QueryTriggerInteraction.Ignore)) { distance = hitInfo.distance; } else { continue; } } if (distance > rayCastHeightModifier) // this check to make sure raycasts ending above player collider dont trigger hover { float force = (1 - (distance - rayCastHeightModifier) / (rayLength - rayCastHeightModifier)) * hoverForce; if (force > maxHoverForce) { maxHoverForce = force; } } } } if (maxHoverForce > 0f) { if (!controllerActive) { maxHoverForce *= 4f; } rb.AddForce(Vector3.up * maxHoverForce * Time.fixedDeltaTime, ForceMode.Impulse); } // apply vertical momentum drag Vector3 velocity = rb.velocity; velocity.y *= 1f - verticalDrag; rb.velocity = velocity; }
public override void CollideWithWave(WavePositionInfo waveInfo) { float yDist = transform.position.y - waveInfo.position.y; float hoverStrength = Mathf.Clamp01(1 - (yDist / hoverHeight)) * hoverForce; if (hoverStrength > 0) { rb.AddForce(Vector3.up * hoverStrength * Time.fixedDeltaTime, ForceMode.Impulse); } }
void HandleWaveCollisions(Collider col) { WaveCollisionHandler waveCollisionHandler = col.GetComponent <WaveCollisionHandler>(); if (waveCollisionHandler == null || col.transform == targetObjectTransform || col.transform.IsChildOf(targetObjectTransform)) { return; } WavePositionInfo waveInfo = CalculateDepthAndNormalAtPoint(col.transform.position); waveCollisionHandler.CollideWithWave(waveInfo); }
public override void CollideWithWave(WavePositionInfo waveInfo) { Vector3 position = rb.position; Vector3 colFootPosition = position + Vector3.down * footDist; float waveOverlap = waveInfo.position.y - colFootPosition.y; if (waveOverlap < 0f) { return; } /* * SINKING * * Use a maxSinkDepth value to make sure we never sink the camera below the sand. * Essentially transition footDepth from 0-maxSinkDepth over time * * TODO: need to implement respawning at some point */ // TODO: alter logic based on lightsensor status (Sink) bool isLit = lightSensor.GetCurrentIntensity() > 0f; // Tell jumpCollider player is grounded if (isLit) { jumpCollider.Grounded(true); } // inside wave volume if (waveOverlap > footDepth) { // move rigidbody to align with surface rb.MovePosition(position + Vector3.up * (waveOverlap - footDepth)); } Vector3 velocity = rb.velocity; if (Vector3.Dot(velocity.normalized, waveInfo.normal) < 0f) { Vector3 velocityAlongWaveNormal = Vector3.Project(velocity, waveInfo.normal); rb.velocity -= velocityAlongWaveNormal; } // Dampen velocity while in contact if (velocityDampenStrength > 0f) { rb.velocity *= 1 - (Time.fixedDeltaTime * velocityDampenStrength); } }
void Update() { WavePositionInfo info = wave.CalculateDepthAndNormalAtPoint(transform.position); // match child to wave position, taking into account movementStrength for horizontal axes childTransform.position = new Vector3(info.position.x * waveMovementStrength, info.position.y + waveOffsetHeight, info.position.z * waveMovementStrength); // apply wave normal tilt to child transform if (tiltStrength > 0f) { Vector3 tilt = new Vector3(info.normal.x * tiltStrength, info.normal.y, info.normal.z * tiltStrength).normalized; childTransform.rotation = Quaternion.FromToRotation(transform.up, tilt); } }
private void Hover() { RaycastHit[] hits = Physics.RaycastAll(position, Vector3.down, hoverHeight, hoverCastMask, QueryTriggerInteraction.Collide); hits.AddRange(Physics.RaycastAll(position, forward + Vector3.down, hoverHeight, hoverCastMask, QueryTriggerInteraction.Collide)); if (hits.Length <= 0) { return; } float closestHoverSurface = hoverHeight; foreach (RaycastHit hit in hits) { if (hit.collider.isTrigger) { if (hit.collider.gameObject.layer == waveShaderLayer) { WavePositionInfo wavePositionInfo = wavePositionTracker.CalculateDepthAndNormalAtPoint(position); float dist = (position - wavePositionInfo.position).magnitude; if (dist < closestHoverSurface) { closestHoverSurface = dist; } } } else { if (hit.distance < closestHoverSurface) { closestHoverSurface = hit.distance; } } } float hoverForceFactor = closestHoverSurface / hoverHeight; hoverForceFactor = 1 - hoverForceFactor * hoverForceFactor; rb.AddForce(Vector3.up * hoverForceFactor * hoverForce * Time.fixedDeltaTime, ForceMode.Impulse); }
public abstract void CollideWithWave(WavePositionInfo waveInfo);