예제 #1
0
    void ManageWallCollision()
    {
        //Hacer el SphereCast desde la posición previa hasta la actual
        Vector3 delta = transform.position - previousPosition;

        RaycastHit[] hits = Physics.SphereCastAll(previousPosition, sphereCollider.radius, (delta).normalized, delta.magnitude, wallLayerMask);
        //Debug.Log(hits.Length);
        //if(hits.Length > 1) { Debug.Break(); }

        foreach (RaycastHit hit in hits)
        {
            //Checar que no sea un hit desde adentro de un collider
            if (hit.distance == 0f)
            {
                break;
            }

            //Reflejar la velocidad
            velocity = Vector3Util.NoY(Vector3.Reflect(velocity, hit.normal));

            //Guardar la info para el Gizmos y la normal
            hitInfos.Add(new HitInfo(hit.point, hit.normal));

            //Mover la pelota fuera del collider
            transform.position = hit.point + hit.normal * sphereCollider.radius;
        }

        //Guardar esta posicion como la ultima para el siguiente frame
        previousPosition = transform.position;
    }
예제 #2
0
    void Update()
    {
        Collider[] hits;

        //Revisar si la pelota está en el radio de pateo
        hits = Physics.OverlapSphere(transform.position, kickRadius, ballLayerMask);

        //Si la pelota está en el radio, patearla
        if (hits.Length > 0)
        {
            FindObjectOfType <Ball>().velocity = Vector3Util.NoY(transform.forward) * kickForce;
        }
    }
예제 #3
0
 void Update()
 {
     //Revisar si la pelota colisionó con este bumber
     Collider[] colliders = Physics.OverlapSphere(transform.position + Vector3.up * 0.43f, 0.9635437f, ballLayerMask);
     foreach (Collider col in colliders)
     {
         if (col == ballCollider)
         {
             float newMagnitude = ball.velocity.magnitude * 1.5f;
             ball.velocity = Vector3.Reflect(ball.velocity.normalized, Vector3Util.NoY(ball.transform.position - transform.position)) * newMagnitude;
             StartCoroutine("BumperAnimation");
             if (OnBump != null)
             {
                 OnBump();
             }
         }
     }
 }
예제 #4
0
    void Update()
    {
        //Incrementar el contador de tiempo de juego
        playTime += Time.deltaTime;

        //Si la pelota está en el radio, dirigirse hacia ella
        if (playManager.playInProgress)
        {
            //Revisar si hay suelo
            Vector3 nextPos = transform.position + (Vector3Util.NoY(ball.transform.position) - transform.position).normalized * moveSpeed * Time.deltaTime;

            if (Physics.Raycast(nextPos + Vector3.up, Vector3.down, 4f, floorLayerMask))
            {
                transform.position = Vector3.MoveTowards(transform.position, Vector3Util.NoY(ball.transform.position), moveSpeed * Time.deltaTime);
                Quaternion lookRotation      = Quaternion.LookRotation(ball.transform.position - transform.position);
                Quaternion fixedLookRotation = Quaternion.Euler(0f, lookRotation.eulerAngles.y, 0f);
                transform.rotation = Quaternion.RotateTowards(transform.rotation, fixedLookRotation, 400f * Time.deltaTime);
            }
        }
    }
예제 #5
0
    void Update()
    {
        //Revisar si la pelota está en el radio de seguimiento
        Collider[] hits = Physics.OverlapSphere(startingPos, followRadius, ballLayerMask);

        //Si la pelota está en el radio, dirigirse hacia ella
        if (hits.Length > 0)
        {
            transform.position = Vector3.MoveTowards(transform.position, Vector3Util.NoY(hits[0].transform.position), moveSpeed * Time.deltaTime);
            Quaternion lookRotation      = Quaternion.LookRotation(hits[0].transform.position - transform.position);
            Quaternion fixedLookRotation = Quaternion.Euler(0f, lookRotation.eulerAngles.y, 0f);
            transform.rotation = Quaternion.RotateTowards(transform.rotation, fixedLookRotation, 400f * Time.deltaTime);
        }

        //Si no está en el radio, regresar al centro de este mismo
        else
        {
            transform.position = Vector3.MoveTowards(transform.position, startingPos, moveSpeed * Time.deltaTime);
            transform.rotation = Quaternion.RotateTowards(transform.rotation, startingRot, 200f * Time.deltaTime);
        }
    }
예제 #6
0
    void Update()
    {
        //Recopilar datos del suelo
        RaycastHit hit;
        //bool thereIsFloor = Physics.SphereCast(transform.position, sphereCollider.radius * 0.999f, Vector3.down, out hit, 10f, floorLayerMask);
        bool thereIsFloor = Physics.Raycast(transform.position + Vector3.up * sphereCollider.radius, Vector3.down, out hit, 10f, floorLayerMask);

        //Si no hay suelo, caer
        if (thereIsFloor == false)
        {
            velocity = velocity + Vector3.down * Time.deltaTime * 16f;

            //Reiniciar la partida despues de 1 segundo
            StartCoroutine(FindObjectOfType <PlayManager>().RestartPlayAfter(1f));
        }

        //Si hay suelo
        else
        {
            //Disminuir la velocidad
            Deacelerate(2f);

            //Pegarse a el
            transform.position = new Vector3(transform.position.x, hit.point.y + sphereCollider.radius, transform.position.z);

            //Darle velocidad de acuerdo a la pendiente
            Vector3 velAdd = Vector3Util.NoY(hit.normal);
            velocity = velocity + velAdd * Time.deltaTime * 16f;
        }

        //Moverse de acuerdo a la velocidad
        transform.position = transform.position + velocity * Time.deltaTime;

        //Manejar colisión
        ManageCollision();

        //Guardar esta posicion como la ultima para el siguiente frame
        previousPosition = transform.position;
    }
예제 #7
0
 void OnDrawGizmos()
 {
     //Dibujar el spawn de la pelota
     Gizmos.DrawSphere(Vector3Util.NoY(ballStartingPos) + Vector3.up * ballRadius, ballRadius);
 }