Ajuda com interpretação de Script
2 participantes
SchultzGames :: UNITY 3D :: Resolvidos
Página 1 de 1
Ajuda com interpretação de Script
Olá pessoal, tranquilo?
Gente, eu tô estudando novas formas de fazer uma boa movimentação no Unity baseado em física.
Fuçando na internet, encontrei este belo script (eu modifiquei ele um pouquinho)
Eu entendi praticamente tudo do script, menos uma parte, que talvez seja a mais importante. O script está funcionando belezinha, mas eu não entendi essa linha aqui:
Pessoal, porque ele está subtraindo a velocidade do personagem? Eu tentei isolar essa linha de várias formas, mas parece que ela que controla todo o esquema de velocidade do personagem, então não tem como remover.
Enfim, porque ele está pegando o valor que eu apertei(Input.GetAxis) e subtraindo a velocidade? Gostaria da ajuda de vocês para me ajudar. Até mais, abraços.
Gente, eu tô estudando novas formas de fazer uma boa movimentação no Unity baseado em física.
Fuçando na internet, encontrei este belo script (eu modifiquei ele um pouquinho)
- Código:
using UnityEngine;
using System.Collections;
[RequireComponent (typeof (Rigidbody))]
[RequireComponent (typeof (CapsuleCollider))]
public class NewBehaviourScript : MonoBehaviour {
public float speed = 10.0f;
public float gravity = 10.0f;
public float maxVelocityChange = 10.0f;
public bool canJump = true;
public float jumpHeight = 2.0f;
private bool grounded = false;
private Rigidbody playerRb;
void Awake () {
playerRb = GetComponent<Rigidbody>();
playerRb.freezeRotation = true;
playerRb.useGravity = false;
}
void FixedUpdate () {
if (grounded) {
// Calculate how fast we should be moving
Vector3 targetVelocity = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical")) * speed;
// Apply a force that attempts to reach our target velocity
Vector3 velocity = playerRb.velocity;
Vector3 velocityChange = (targetVelocity - velocity);
velocityChange.x = Mathf.Clamp(velocityChange.x, -maxVelocityChange, maxVelocityChange);
velocityChange.y = 0;
playerRb.AddForce(velocityChange, ForceMode.VelocityChange);
// Jump
if (canJump && Input.GetButton("Jump")) {
playerRb.velocity = new Vector3(velocity.x, CalculateJumpVerticalSpeed(), velocity.z);
}
}
// We apply gravity manually for more tuning control
playerRb.AddForce(new Vector3 (0, -gravity * playerRb.mass, 0));
grounded = false;
}
void OnCollisionStay () {
grounded = true;
}
float CalculateJumpVerticalSpeed () {
// From the jump height and gravity we deduce the upwards speed
// for the character to reach at the apex.
return Mathf.Sqrt(2 * jumpHeight * gravity);
}
}
Eu entendi praticamente tudo do script, menos uma parte, que talvez seja a mais importante. O script está funcionando belezinha, mas eu não entendi essa linha aqui:
- Código:
Vector3 velocityChange = (targetVelocity - velocity);
Pessoal, porque ele está subtraindo a velocidade do personagem? Eu tentei isolar essa linha de várias formas, mas parece que ela que controla todo o esquema de velocidade do personagem, então não tem como remover.
Enfim, porque ele está pegando o valor que eu apertei(Input.GetAxis) e subtraindo a velocidade? Gostaria da ajuda de vocês para me ajudar. Até mais, abraços.
Última edição por George Lucas Vieira em Sáb Set 24, 2016 10:25 am, editado 1 vez(es)
George Lucas Vieira- Avançado
- PONTOS : 3394
REPUTAÇÃO : 132
Idade : 21
Áreas de atuação : Programação, Modelagem e Animação.
Respeito as regras :
Re: Ajuda com interpretação de Script
Fiz uma análise corrida do script com os seguintes pontos:
primeiramente, coloquei isto no awake:
Isto permite analisar o que acontece bem detalhadamente... Depois, criei um Debug e coloquei como última coisa da void FixedUpdate, que é este debug aqui:
Com este debug, podemos perceber a targetVelocity, logo após a velocity e por último, o vetor de subtração dos 2.
Analizando a targetVelocity, já podemos perceber que o vetor não vai somente de 0 a 1, conforme os inputs horizontais e verticais, pois você está multiplicando o input pela variável "speed", conforme esta linha mostra:
Com esta linha, pode-se concluir que esta seria a "velocidade desejada" a se alcançar, pois você recebe o input, e multiplica pela velocidade que quer tentar alcançar.
O próximo debug que você recebe é o "velocity", que informa qual a velocidade atual do seu jogador...
O terceiro debug, informa qual a diferença entre a velocidade que você almeja alcançar e a velocidade real em que você está andando...
Supondo que você está pressionando A, então o seu input vai ser (-1,0,0). Agora, veja que a sua "speed" é 10, então esse vetor será multiplicado por 10, transformando o input real em (-10, 0, 0).
Este vetor é a velocidade que você está tentando alcançar, e você o chama de "targetVelocity"
Na próxima linha, apenas pegamos a velocidade atual do rigidbody:
Neste momento, a "targetVelocity" estará debugando "(-10, 0, 0)", pois é o input multiplicado pela speed.
Enquanto isso, a "velocity" estará debugando algo parecido a "(-9.9, 0,0 )"
Isto acontece por que a física gera atrito, e tende a alentar o colisor, fazendo o player "freiar"
Tendo tudo isto dito, a próxima coisa que você faz, é subtrair a velocidade que você está tentando alcançar, da velocidade real do seu player, e isto você chama de "velocityChange".
Então, se o vetor alvo é (-10, 0, 0) e o vetor real é (-9.9, 0, 0), o resultado da subtração será (-0.1, 0, 0)
Depois que isto é feito, você aplica um "clamp" no vetor, para limitar o máximo valor que este vetor poderá ter... mas estranhamente, você só faz isto no eixo X... o eixo Y você deixa como 0, pois não deve ser influenciado, e o eixo Z, não entendi por que não recebe o clamp, mas enfim, o clamp pouco interfere na análise final...
Depois que você "limita" este vetor, você faz um AddForce na direção desse vetor de subtração, nesta linha:
Pelo que eu entendi, isto é feito apenas para compensar o atrito que o rigidbody sofre, para compensar a frenagem natural que o objeto tem, minimizando a diferença entre a velocidade que você quer alcançar e a velocidade real do corpo...
primeiramente, coloquei isto no awake:
- Código:
Time.timeScale = 0.05f;
Isto permite analisar o que acontece bem detalhadamente... Depois, criei um Debug e coloquei como última coisa da void FixedUpdate, que é este debug aqui:
- Código:
Debug.Log("targVel: " + targetVelocity + " velocity: " + velocity + " subtrair: " + (targetVelocity - velocity));
Com este debug, podemos perceber a targetVelocity, logo após a velocity e por último, o vetor de subtração dos 2.
Analizando a targetVelocity, já podemos perceber que o vetor não vai somente de 0 a 1, conforme os inputs horizontais e verticais, pois você está multiplicando o input pela variável "speed", conforme esta linha mostra:
- Código:
Vector3 targetVelocity = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical")) * speed;
Com esta linha, pode-se concluir que esta seria a "velocidade desejada" a se alcançar, pois você recebe o input, e multiplica pela velocidade que quer tentar alcançar.
O próximo debug que você recebe é o "velocity", que informa qual a velocidade atual do seu jogador...
O terceiro debug, informa qual a diferença entre a velocidade que você almeja alcançar e a velocidade real em que você está andando...
Supondo que você está pressionando A, então o seu input vai ser (-1,0,0). Agora, veja que a sua "speed" é 10, então esse vetor será multiplicado por 10, transformando o input real em (-10, 0, 0).
Este vetor é a velocidade que você está tentando alcançar, e você o chama de "targetVelocity"
Na próxima linha, apenas pegamos a velocidade atual do rigidbody:
- Código:
Vector3 velocity = playerRb.velocity;
Neste momento, a "targetVelocity" estará debugando "(-10, 0, 0)", pois é o input multiplicado pela speed.
Enquanto isso, a "velocity" estará debugando algo parecido a "(-9.9, 0,0 )"
Isto acontece por que a física gera atrito, e tende a alentar o colisor, fazendo o player "freiar"
Tendo tudo isto dito, a próxima coisa que você faz, é subtrair a velocidade que você está tentando alcançar, da velocidade real do seu player, e isto você chama de "velocityChange".
Então, se o vetor alvo é (-10, 0, 0) e o vetor real é (-9.9, 0, 0), o resultado da subtração será (-0.1, 0, 0)
Depois que isto é feito, você aplica um "clamp" no vetor, para limitar o máximo valor que este vetor poderá ter... mas estranhamente, você só faz isto no eixo X... o eixo Y você deixa como 0, pois não deve ser influenciado, e o eixo Z, não entendi por que não recebe o clamp, mas enfim, o clamp pouco interfere na análise final...
Depois que você "limita" este vetor, você faz um AddForce na direção desse vetor de subtração, nesta linha:
- Código:
playerRb.AddForce(velocityChange, ForceMode.VelocityChange);
Pelo que eu entendi, isto é feito apenas para compensar o atrito que o rigidbody sofre, para compensar a frenagem natural que o objeto tem, minimizando a diferença entre a velocidade que você quer alcançar e a velocidade real do corpo...
Re: Ajuda com interpretação de Script
Você é o cara Marcos
Bem, eu não apliquei o Clamp no eixo Z pq é um jogo 2.5D...
Vlw ae!
Bem, eu não apliquei o Clamp no eixo Z pq é um jogo 2.5D...
Vlw ae!
George Lucas Vieira- Avançado
- PONTOS : 3394
REPUTAÇÃO : 132
Idade : 21
Áreas de atuação : Programação, Modelagem e Animação.
Respeito as regras :
Tópicos semelhantes
» Ajuda Urgente como chamo a animação no script alguém poderia dar uma ajuda???
» [AJUDA]Preciso de ajuda em um script relacionado ao vídeo Sistema de escolha de personagen
» [AJUDA]Quero Ajuda poque esse script so da erro!
» AJUDA COM SCRIPT
» Ajuda com Script
» [AJUDA]Preciso de ajuda em um script relacionado ao vídeo Sistema de escolha de personagen
» [AJUDA]Quero Ajuda poque esse script so da erro!
» AJUDA COM SCRIPT
» Ajuda com Script
SchultzGames :: UNITY 3D :: Resolvidos
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos