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; }
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; } }
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(); } } } }
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); } } }
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); } }
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; }
void OnDrawGizmos() { //Dibujar el spawn de la pelota Gizmos.DrawSphere(Vector3Util.NoY(ballStartingPos) + Vector3.up * ballRadius, ballRadius); }