Menu
CoddyTech

Empurrando objetos

Parte da seção Criando jogos de verdade do Journey de Unity da Coddy. Lição 40 de 56.

Um CharacterController nunca empurra nada: faça-o andar contra uma caixa com um Rigidbody e ele para como se estivesse diante de uma parede. Em vez disso, o Unity chama OnControllerColliderHit(ControllerColliderHit hit) nos próprios scripts do controlador para cada colisor tocado por um Move, inclusive o chão, e o script decide o que acontece. hit.collider é o que foi tocado, hit.moveDirection é a direção do Move que o tocou, e hit.normal é a direção para a qual a superfície está voltada no ponto de contato. Este é o próprio script de empurrão do Unity:

public float pushPower = 2f;

void OnControllerColliderHit(ControllerColliderHit hit)
{
    Rigidbody body = hit.collider.attachedRigidbody;
    if (body == null || body.isKinematic) return;   // nada para empurrar
    if (hit.moveDirection.y < -0.3f) return;        // está sob nossos pés

    Vector3 pushDir = new Vector3(hit.moveDirection.x, 0f, hit.moveDirection.z);
    body.linearVelocity = pushDir * pushPower;
}

Cada return tem um motivo. O chão e as paredes não têm Rigidbody, então body é null para eles, e são tocados em quase todo Move. Um corpo cinemático só se move quando o próprio script o move, então uma velocidade não tem efeito sobre ele. Um Move com direção acentuadamente para baixo tocou algo sob os pés, e a caixa sobre a qual o jogador está não deve ser empurrada.

A direção do empurrão mantém apenas x e z, então a caixa desliza pelo chão em vez de ser pressionada contra ele. Definir linearVelocity, em vez de adicionar uma força, move uma caixa leve e uma pesada no mesmo ritmo; body.AddForce(pushDir * pushPower, ForceMode.Impulse) empurraria a pesada com menos força.

challenge icon

Desafio

Médio

Chute as bolas pelo quintal. O jogador anda com um CharacterController (Walker.cs, pronto). Escreva Kicker.cs, também no Player. No Inspector, defina kickPower (6) e lift (4).

  • Quando o jogador andar contra um corpo que possa ser empurrado, defina sua linearVelocity na direção do movimento, paralela ao chão, multiplicada por kickPower, mais lift diretamente para cima, para que a bola voe para a frente e para cima.
  • O chão e o poste não têm Rigidbody: ignore-os sem gerar um erro.
  • Uma bola sob os pés do jogador não é chutada.

Pressione Play e chute a bola vermelha; depois, Check.

Experimente você mesmo

using UnityEngine;

public class Kicker : MonoBehaviour
{
    public float kickPower = 6f;
    public float lift = 4f;

    // Chute as bolas nas quais o jogador esbarrar
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Criando jogos de verdade