예제 #1
0
 public override void CollideWithWave(WavePositionInfo waveInfo)
 {
     if (waveInfo.position.y - transform.position.y > returnDepth)
     {
         knifeController.ReturnKnifeTransition();
     }
 }
예제 #2
0
    /*
     * 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;
    }
예제 #3
0
    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);
    }
예제 #5
0
    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);
        }
    }
예제 #6
0
    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);
        }
    }
예제 #7
0
    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);
    }
예제 #8
0
 public abstract void CollideWithWave(WavePositionInfo waveInfo);