[RESOLVIDO] Ajudinha com código
4 participantes
Página 1 de 1
[RESOLVIDO] Ajudinha com código
Salve pessoal!
Atualmente eu estou utilizando SphereCastAll no FixedUpdate para interação com objetos. Dentro deste, eu tenho um Switch Case dentro de um for para tratar as tags dos objetos de colisão do SphereCast e realizar as ações. Segue o Código:
Sim, eu só tenho um case para testes, mas existem outras tags a serem tratadas. Estou usando SphereCast no lugar de RayCast porque o jogador vai poder interagir com mais de um objeto.
E no FixedUpdate...
O código funciona muito bem, a questão é que em computadores com uma placa de vídeo mais modesta, em áreas que existem muitos objetos o jogo sofre uma queda de quadros terrível. Todas as máquinas em que eu realizei os testes tem o mesmo processador e memória, (i7 / 8gb de ram) mudando somente a placa de vídeo.
Abraços e sucesso a todos !
Atualmente eu estou utilizando SphereCastAll no FixedUpdate para interação com objetos. Dentro deste, eu tenho um Switch Case dentro de um for para tratar as tags dos objetos de colisão do SphereCast e realizar as ações. Segue o Código:
- Código:
void DisparaRayCast(){
//Cria um SphereCastAll a partir do objeto de referência (ObjRaycast) na diagonal e armazena todas as colisões no "Array" Alvo.
Alvo = Physics.SphereCastAll (ObjRaycast.position,0.4f,new Vector3(ObjRaycast.forward.x,-1,ObjRaycast.forward.z),3);
//Trata as tags dos objetos que colidiram com o RayCast e executa as ações...
for (int i = 0; i < Alvo.Length; i++) {
switch (Alvo [i].collider.tag) {
case "Colecionavel":
if (Input.GetKeyDown (KeyCode.E)) {
NetworkIdentity idObj = Alvo [i].collider.GetComponent<NetworkIdentity> ();
Debug.Log ("<color=red>" + Alvo [i].collider.name + "</color>");
NetworkIdentity oldObjPai = TransformPai.GetComponent<NetworkIdentity>();
CmdPegaObjeto (idObj, idPlayer, oldObjPai);
}
Debug.DrawLine (ObjRaycast.position, Alvo [i].point, Color.red);
//Destaca o Objeto
Renderer Objeto = Alvo[i].collider.GetComponent<Renderer>();
DestacaObjeto (Objeto,0.365f);
break;
default:
break;
}
}
}
Sim, eu só tenho um case para testes, mas existem outras tags a serem tratadas. Estou usando SphereCast no lugar de RayCast porque o jogador vai poder interagir com mais de um objeto.
E no FixedUpdate...
- Código:
void FixedUpdate(){
if (!isLocalPlayer) {
return;
}
DisparaRayCast ();
}
O código funciona muito bem, a questão é que em computadores com uma placa de vídeo mais modesta, em áreas que existem muitos objetos o jogo sofre uma queda de quadros terrível. Todas as máquinas em que eu realizei os testes tem o mesmo processador e memória, (i7 / 8gb de ram) mudando somente a placa de vídeo.
- RayCasts e derivados consomem mais processamento da GPU e não da CPU?
- Alguém poderia sugerir uma maneira "menos porca" de fazer isso?
- Quando utilizo um RayCastAll e ele colide com um ojeto, ele não armazena só o pai, mas sim todos os filhos de um objeto?
Abraços e sucesso a todos !
Última edição por artplayer em Ter Ago 09, 2016 8:13 am, editado 1 vez(es)
Re: [RESOLVIDO] Ajudinha com código
Ok, consegui amenizar muito o problema aqui.
Troquei SphereCastAll por Spherecast e retirei o DrawLine do debug (Ele estava ajudando na queda de FPS).
Isso já reduziu bastante a queda de FPS em uma placa de vídeo inferior, mas não o bastante a ponto de deixar o jogo liso. Com esta mesma placa de vídeo, fiz alguns testes em jogos com mapas parecidos com o meu desenvolvidos com unity ( The Forest foi um deles ).
O problema é exatamente o mesmo quando se trata de mapas com muitas árvores/grama. Pra falar a verdade o desempenho é exatamente o mesmo, mesmo com configurações muito baixas.
Minha conclusão:
Meu código estava porco sim (E ainda pode estar), mas não dá pra ter um desempenho ótimo em todas as placas de vídeo, infelizmente.
Pelo menos isso me ajudou a ter um parâmetro pra definir os requisitos mínimos do jogo.
Troquei SphereCastAll por Spherecast e retirei o DrawLine do debug (Ele estava ajudando na queda de FPS).
- Código:
void DisparaRayCast(){
if (Physics.SphereCast (ObjRaycast.position, 0.4f, new Vector3 (ObjRaycast.forward.x, -1, ObjRaycast.forward.z), out Alvo, 3)) {
switch (Alvo.collider.tag) {
case "Colecionavel":
ExibeBtnInteracao (true);
if (Input.GetKeyDown (KeyCode.E)) {
NetworkIdentity idObj = Alvo.collider.GetComponent<NetworkIdentity> ();
Debug.Log ("<color=red>" + Alvo.collider.name + "</color>");
NetworkIdentity oldObjPai = TransformPai.GetComponent<NetworkIdentity> ();
CmdPegaObjeto (idObj, idPlayer, oldObjPai);
}
break;
default:
ExibeBtnInteracao (false);
break;
}
};
}
Isso já reduziu bastante a queda de FPS em uma placa de vídeo inferior, mas não o bastante a ponto de deixar o jogo liso. Com esta mesma placa de vídeo, fiz alguns testes em jogos com mapas parecidos com o meu desenvolvidos com unity ( The Forest foi um deles ).
O problema é exatamente o mesmo quando se trata de mapas com muitas árvores/grama. Pra falar a verdade o desempenho é exatamente o mesmo, mesmo com configurações muito baixas.
Minha conclusão:
Meu código estava porco sim (E ainda pode estar), mas não dá pra ter um desempenho ótimo em todas as placas de vídeo, infelizmente.
Pelo menos isso me ajudou a ter um parâmetro pra definir os requisitos mínimos do jogo.
Re: [RESOLVIDO] Ajudinha com código
SphereCast infelizmente eh MUITO pesado.
Este é um dos motivos da wheelCollider da Unity (colisor para rodas) ser tão ruim. Eles priorizaram o desempenho e fizeram ser apenas 1 raycast para baixo em vez de um circulo com vários raios.
Depende da sua necessidade, mas as vezes usar um Raycast pode ser mais lucrativo
Este é um dos motivos da wheelCollider da Unity (colisor para rodas) ser tão ruim. Eles priorizaram o desempenho e fizeram ser apenas 1 raycast para baixo em vez de um circulo com vários raios.
Depende da sua necessidade, mas as vezes usar um Raycast pode ser mais lucrativo
Re: [RESOLVIDO] Ajudinha com código
É que no meu caso, o personagem está em terceira pessoa e a cabeça dele não se move. Um RayCast simples acabaria sendo muito "fino". Ainda estou usando SphereCast, mas a sua mensagem acabou me fazendo ter uma idéia:
"Rotacionar" o raycast em um ângulo de 45º pra cima e pra baixo a partir do centro, uma espécie de scanner. Só não sei se isso vai interferir no desempenho.
"Rotacionar" o raycast em um ângulo de 45º pra cima e pra baixo a partir do centro, uma espécie de scanner. Só não sei se isso vai interferir no desempenho.
RenanMSV- Instrutor
- PONTOS : 4483
REPUTAÇÃO : 356
Áreas de atuação : Programação em C#, PHP. SQL, JavaScript (Web)
Respeito as regras :
Re: [RESOLVIDO] Ajudinha com código
RenanMSV escreveu:Colocar um raycast no centro da tela ignorando o player n da ?
É que podem ter Objetos no chão ou no alto e a cabeça dele não se move. Então atuamento estou usando um Spherecast com uma grossura razoável saindo dos olhos dele em direção ao chão. Estou usando MeshCollider em algumas ferramentas. Um RayCast comum, acaba não pegando em objetos muito finos ou pequenos. Por isso acabei optando pelo Sphere. Mas tenho a impressão que isso está me dando um custo desnecessário.
... A não ser que eu ponha um BoxCollider com IsTrigger!, Daí dá pra usar um RayCast de boa acho. Vou correr e testar aqui.
Não tinha pensado nisso ainda! :oops:
Re: [RESOLVIDO] Ajudinha com código
Funcionou bem aqui, substitui o SphereCast por um Raycast, e nos objetos tenho um MeshCollider ( pra manter a realidade da física quando o objeto cai no chão por exemplo ), e um BoxCollider com IsTrigger pro Raycast.
Não vi mudança em questão de desempenho. No final, acabei ficando com a impressão de que troquei 6 por meia dúzia.
Não vi mudança em questão de desempenho. No final, acabei ficando com a impressão de que troquei 6 por meia dúzia.
Re: [RESOLVIDO] Ajudinha com código
Sim sim, só diminuiu um pouco o consumo da CPU. E em resoluções mais baixas o FPS foi de 28 a 78 ~100. Então acho que tive um ganho considerável sim. Só vou ter que testar o client em uma máquina mais modesta.
Tópicos semelhantes
» [RESOLVIDO] Preciso de uma ajudinha script c# !!!
» [RESOLVIDO] NullReferenceException : Error Código JS
» [RESOLVIDO] Ajuda Com Código
» [RESOLVIDO] Problema com codigo de morte
» [RESOLVIDO] Como desativar um Script via código?
» [RESOLVIDO] NullReferenceException : Error Código JS
» [RESOLVIDO] Ajuda Com Código
» [RESOLVIDO] Problema com codigo de morte
» [RESOLVIDO] Como desativar um Script via código?
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos