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.
Desafio
MédioChute 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
linearVelocityna direção do movimento, paralela ao chão, multiplicada porkickPower, maisliftdiretamente 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
}
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
1Texto na tela
Canvas e textoExiba a pontuaçãoFormate númerosUm cronômetro regressivoRevisão: velocímetro4Cenas e Fases
Carregar uma CenaReiniciar a FasePróxima FaseManter entre CenasRevisão: Seleção de Fases10Projeto: Jogo de Plataforma 3D
O PercursoPlataformas Móveis2Botões e telas
Botões e onClickLambdasConectando no InspectorPainéis ligados e desligadosBarras de vidaRevisão: Loja de melhorias5Salvando com PlayerPrefs
Salvar um númeroCarregar com um valor padrãoRecordeSalvar configuraçõesRevisão: Moedas no banco8Controlador de personagem
CharacterController.MoveGravidade na mãoPuloEmpurrando objetosMover-se para onde você olhaRecapitulação: pulo duplo