Funcionamento do ThirdPersonController do proprio unity
2 participantes
Página 1 de 1
Funcionamento do ThirdPersonController do proprio unity
Estou tentando entende como funciona o código do ThirdPersonController, estou quase entendendo tudo, mas não entendo por que o personagem para de rotaciona, mesmo sendo chamado o metodo Rotate no eixo y, e o valor passado não e zero.
Tipo quando eu aperto para ir para direita, se ele esta de costa para camera, ele rotaciona ate a direita e quando chega na direita ele segui reto pela direita, mas ainda esta sendo chamado o metodo Rotate.
Se alguem sabe como o ThirdPersonController funciona, ou tem mas experiencia no c# e consegui entender como ele funciona, pode por favor me explica.
Tipo quando eu aperto para ir para direita, se ele esta de costa para camera, ele rotaciona ate a direita e quando chega na direita ele segui reto pela direita, mas ainda esta sendo chamado o metodo Rotate.
Se alguem sabe como o ThirdPersonController funciona, ou tem mas experiencia no c# e consegui entender como ele funciona, pode por favor me explica.
samoliver1813- Membro
- PONTOS : 3384
REPUTAÇÃO : 16
Respeito as regras :
Re: Funcionamento do ThirdPersonController do proprio unity
Ele não faz rotação em relação a camera, más sim, em relação ao mundo... ou seja, quando você aperta 'S' por exemplo, ele vai percorrer o mundo no eixo Z, decrescendo valores... se apertar 'W', ele vai percorrer o mundo no eixo Z, crescendo valores...
O rotate é chamado para dar a direção ao personagem... depois que a direção é a correta para o eixo, a função passa a conduzir o personagem naquela direção
O rotate é chamado para dar a direção ao personagem... depois que a direção é a correta para o eixo, a função passa a conduzir o personagem naquela direção
Funcionamento do ThirdPersonController do proprio unity
MarcosSchultz escreveu:Ele não faz rotação em relação a camera, más sim, em relação ao mundo... ou seja, quando você aperta 'S' por exemplo, ele vai percorrer o mundo no eixo Z, decrescendo valores... se apertar 'W', ele vai percorrer o mundo no eixo Z, crescendo valores...
O rotate é chamado para dar a direção ao personagem... depois que a direção é a correta para o eixo, a função passa a conduzir o personagem naquela direção
Mas o que eu não entendi foi porque a função Rotate para de rotaciona, mas verifique pelo debug que o valor passado não e zero, eu botei um script num cubo com um valor fixo e o cubo fica rodado sem para. Também percebi que quando ele roda ate a direção que foi apertado o botão, a animação fica na de ir para frente, e animação que faz ele para de rotacionar?
samoliver1813- Membro
- PONTOS : 3384
REPUTAÇÃO : 16
Respeito as regras :
Re: Funcionamento do ThirdPersonController do proprio unity
Bom, primeiramente você precisa entender como é feito o movimento, pois são coisas separadas...
O movimento é feito por meio deste trecho de código:
Se você possui alguma camera em cena com a tag "MainCamera", o jogador irá se mover em relação a camera... se não possuir, vai se mover em relação ao mundo.
Na void "Move" que é chamada, nós também chamamos a void "ApplyExtraTurnRotation()", que possui os seguintes comandos:
que ajudam o personagem a girar mais rápido, pois parte do giro é feito pelo próprio corpo rigido do personagem, já que estamos lidando com Rigidbody
Você perguntou por que o personagem para de girar mesmo tendo alguns parametros de rotação ainda com valores, e a resposta é dada por esta linha de código:
Você faz o giro do personagem no eixo Y, multiplicando: m_TurnAmount * turnSpeed * Time.deltaTime
Time.deltaTime é para normalizar a velocidade de acordo com os frames.
m_TurnAmount recebe a relação de movimento que o personagem está impondo, através destas linhas:
que são aqueles inputs do primeiro script em relação a camera ou ao mundo, que são passados...
para complementar, nós também vemos a variavel "m_TurnAmount" atuando no Animator, para definir a inclinação do personagem, deixando as animações realistas, por meio deste comando:
este "m_TurnAmount" básicamente vai dar o angulo de inclinação que o personagem está, com base nos inputs de X e Y... então se um deles for zerado, o angulo será 0, o que causará 0 de alteração na rotação...
Tendo a rotação zerada, básicamente anula a rotação em Y, pois a rotação é uma multiplicação de 3 fatores, então se 1 deles for 0, automaticamente irá parar de rodar...
Más para complementar, ainda temos a variável "turnSpeed", que é composta por um Lerp de 3 outras variáveis, sendo elas:
"m_StationaryTurnSpeed", que é um valor fixo, definido no inspector.
"m_MovingTurnSpeed", que é um valor fixo, definido no inspector, e
"m_ForwardAmount", que nada mais é do que os inputs no eixo Z, do primeiro script.
é meio confuso e extenso, más é esta sopa que causa este efeito :D
O movimento é feito por meio deste trecho de código:
- Código:
float h = CrossPlatformInputManager.GetAxis("Horizontal"); //pega os inuts horizontais
float v = CrossPlatformInputManager.GetAxis("Vertical"); //pega os inputs verticais
bool crouch = Input.GetKey(KeyCode.C); //checa se esta abaixado
if (m_Cam != null){ //se existe uma camera com tag
m_CamForward = Vector3.Scale(m_Cam.forward, new Vector3(1, 0, 1)).normalized; // ajusta os inuts em relaçao a camera
m_Move = v*m_CamForward + h*m_Cam.right;
}
else{ //se nao tem camera com tag
m_Move = v*Vector3.forward + h*Vector3.right; //ajusta os inputs em relaçao ao mundo
}
m_Character.Move(m_Move, crouch, m_Jump); //chama a void "Move" do script "TirdPersonCharacter", passando os parametros (m_Move, crouch e m_Jump)
Se você possui alguma camera em cena com a tag "MainCamera", o jogador irá se mover em relação a camera... se não possuir, vai se mover em relação ao mundo.
Na void "Move" que é chamada, nós também chamamos a void "ApplyExtraTurnRotation()", que possui os seguintes comandos:
- Código:
float turnSpeed = Mathf.Lerp(m_StationaryTurnSpeed, m_MovingTurnSpeed, m_ForwardAmount);
transform.Rotate(0, m_TurnAmount * turnSpeed * Time.deltaTime, 0);
que ajudam o personagem a girar mais rápido, pois parte do giro é feito pelo próprio corpo rigido do personagem, já que estamos lidando com Rigidbody
Você perguntou por que o personagem para de girar mesmo tendo alguns parametros de rotação ainda com valores, e a resposta é dada por esta linha de código:
- Código:
transform.Rotate(0, m_TurnAmount * turnSpeed * Time.deltaTime, 0);
Você faz o giro do personagem no eixo Y, multiplicando: m_TurnAmount * turnSpeed * Time.deltaTime
Time.deltaTime é para normalizar a velocidade de acordo com os frames.
m_TurnAmount recebe a relação de movimento que o personagem está impondo, através destas linhas:
- Código:
m_TurnAmount = Mathf.Atan2(move.x, move.z);
que são aqueles inputs do primeiro script em relação a camera ou ao mundo, que são passados...
para complementar, nós também vemos a variavel "m_TurnAmount" atuando no Animator, para definir a inclinação do personagem, deixando as animações realistas, por meio deste comando:
- Código:
m_Animator.SetFloat("Turn", m_TurnAmount, 0.1f, Time.deltaTime);
este "m_TurnAmount" básicamente vai dar o angulo de inclinação que o personagem está, com base nos inputs de X e Y... então se um deles for zerado, o angulo será 0, o que causará 0 de alteração na rotação...
Tendo a rotação zerada, básicamente anula a rotação em Y, pois a rotação é uma multiplicação de 3 fatores, então se 1 deles for 0, automaticamente irá parar de rodar...
Más para complementar, ainda temos a variável "turnSpeed", que é composta por um Lerp de 3 outras variáveis, sendo elas:
"m_StationaryTurnSpeed", que é um valor fixo, definido no inspector.
"m_MovingTurnSpeed", que é um valor fixo, definido no inspector, e
"m_ForwardAmount", que nada mais é do que os inputs no eixo Z, do primeiro script.
é meio confuso e extenso, más é esta sopa que causa este efeito :D
Re: Funcionamento do ThirdPersonController do proprio unity
Acho que agora eu entendi, muito obrigado MarcosSchultz! E parabéns pelo canal e esse forum são muito bons.
samoliver1813- Membro
- PONTOS : 3384
REPUTAÇÃO : 16
Respeito as regras :
Tópicos semelhantes
» [TUTORIAL] Unity 5 - Como criar o próprio FPS Controller
» [TUTORIAL] Unity 3D - Como programar o próprio CUSTOM INSPECTOR
» Como criar navegador próprio em app?
» Meu Proprio remake de siren head (em 24hrs)
» [UE4] Como fazer cutscene com o próprio personagem?
» [TUTORIAL] Unity 3D - Como programar o próprio CUSTOM INSPECTOR
» Como criar navegador próprio em app?
» Meu Proprio remake de siren head (em 24hrs)
» [UE4] Como fazer cutscene com o próprio personagem?
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos