Otimizacão por Colisor - (Desativar/Ativar)
+2
ffabim
Duarte
6 participantes
Página 1 de 1
Otimizacão por Colisor - (Desativar/Ativar)
Ola pessoal, eu estou tentando fazer um sistema simples para ajudar na otimizao que e ativar e desativar objetos pelo collisor.
Por Exemplo: se o objeto esta no collisor ele ativa se sair do collisor ele desativa.
Eu usei void OntriggerEnter e void OntriggerExit, mais por algum motivo ele não estava funcionando.
OBS: eu ate postaria o script mais eu apaguei e estou criando o tópico pelo cell não cheguei em casa ainda, mais eu criei uma array para ativar e desativar os objetos dessa array.
Obrigado!
Por Exemplo: se o objeto esta no collisor ele ativa se sair do collisor ele desativa.
Eu usei void OntriggerEnter e void OntriggerExit, mais por algum motivo ele não estava funcionando.
OBS: eu ate postaria o script mais eu apaguei e estou criando o tópico pelo cell não cheguei em casa ainda, mais eu criei uma array para ativar e desativar os objetos dessa array.
Obrigado!
Última edição por dstaroski em Dom Fev 25, 2018 7:53 am, editado 1 vez(es) (Motivo da edição : Corrigido erro de português no título)
Duarte- Programador
- PONTOS : 3355
REPUTAÇÃO : 97
Idade : 24
Áreas de atuação : Programação
Desenvolvedor Android
Respeito as regras :
ffabim- MembroAvançado
- PONTOS : 3356
REPUTAÇÃO : 69
Respeito as regras :
Re: Otimizacão por Colisor - (Desativar/Ativar)
Entao mn, acho que então teria que fazer para desativar conforme a distancia por que acho que o Ontrigger precisa de um Rigiboddy para dectar a colisão.ffabim escreveu:Parece que estamos no mesmo barco.
Seria assim
Duarte- Programador
- PONTOS : 3355
REPUTAÇÃO : 97
Idade : 24
Áreas de atuação : Programação
Desenvolvedor Android
Respeito as regras :
Re: Otimizacão por Colisor - (Desativar/Ativar)
Já verificou se o seu colisor está marcado como "IsTrigger", e pelo menos um dos gameObjects está com "RigidBody" anexado? Fez a verificação com "if(other.compareTag("tag"))"? Se tiver feito tudo isso, não tem como não funcionar!
Gilberto555- Iniciante
- PONTOS : 2548
REPUTAÇÃO : 2
Respeito as regras :
Re: Otimizacão por Colisor - (Desativar/Ativar)
Sim, pra funcionar você vai precisar de pelo menos 1 Rigidbody com isKinematica ativado ou desativado. Você pode colocar este rigidbody no player. Se pelo menos 1 dos objetos tiver 1 rigidbody, já funciona.
Re: Otimizacão por Colisor - (Desativar/Ativar)
Duarte escreveu:Ola pessoal, eu estou tentando fazer um sistema simples para ajudar na otimizao que e ativar e desativar objetos pelo collisor.
Por Exemplo: se o objeto esta no collisor ele ativa se sair do collisor ele desativa.
Eu usei void OntriggerEnter e void OntriggerExit, mais por algum motivo ele não estava funcionando.
OBS: eu ate postaria o script mais eu apaguei e estou criando o tópico pelo cell não cheguei em casa ainda, mais eu criei uma array para ativar e desativar os objetos dessa array.
Obrigado!
Cara, acredito que você esteja escrevendo o nome do void errado, você, aqui no tópico, escreveu "OntriggerEnter" se estiver assim no Script não vai funcionar pq o correto é "OnTriggerEnter".
RonilddoRR- Iniciante
- PONTOS : 3027
REPUTAÇÃO : 4
Idade : 27
Áreas de atuação : Programação;
Modelagem;
Design gráfico;
Edição e gravação de efeitos sonoros.
Respeito as regras :
Re: Otimizacão por Colisor - (Desativar/Ativar)
Eu ja usei esse tipo de otimização num jogo meu. Funcionou perfeitamente, ao afastar desativava e ao aproximar ativava.
Re: Otimizacão por Colisor - (Desativar/Ativar)
Ola a Todos e Obrigado!
Então eu coloquei o script em um objeto que fica sempre na posição do player, pq o player ele não fica ativado o tempo todo na cena.
E eu não sabia que precisava de um RIgidbody para funcionar, pois eu coloquei o Rigidbody.
Eu estou pelo cel, mais tipo eu fiz um script mais ouemos assim, pois queria que ele ativasse e dasativasse qualquer objetor que estivesse dentro do coolider ou não.
Ele estava desativando tudo que saia do coolider mais não ativava, ih eu to com o tempo curto ai nem deu pra verificar pq.
EX:
Eu pensei ate em criar uma lista e todos objetos que entrasse no collider ele adicionaria a lista e ativaria os q saísse ele removeria e desativaria, mais eu quero otimizar ganhar fps, e economizar processador, rs.
Então eu coloquei o script em um objeto que fica sempre na posição do player, pq o player ele não fica ativado o tempo todo na cena.
E eu não sabia que precisava de um RIgidbody para funcionar, pois eu coloquei o Rigidbody.
Eu estou pelo cel, mais tipo eu fiz um script mais ouemos assim, pois queria que ele ativasse e dasativasse qualquer objetor que estivesse dentro do coolider ou não.
Ele estava desativando tudo que saia do coolider mais não ativava, ih eu to com o tempo curto ai nem deu pra verificar pq.
EX:
- Código:
void OnTriggerEnter(Collider other)
{
other.gameObject.SetActive (true);
}
- Código:
void OnTriggerExit(Collider other)
{
other.gameObject.SetActive (false);
}
Eu pensei ate em criar uma lista e todos objetos que entrasse no collider ele adicionaria a lista e ativaria os q saísse ele removeria e desativaria, mais eu quero otimizar ganhar fps, e economizar processador, rs.
Duarte- Programador
- PONTOS : 3355
REPUTAÇÃO : 97
Idade : 24
Áreas de atuação : Programação
Desenvolvedor Android
Respeito as regras :
Re: Otimizacão por Colisor - (Desativar/Ativar)
Essa é a melhor forma de otimizar por desactive/active na minha opinião kkk é a forma mais leve que conheço e o melhor é que você nem precisa referenciar nenhum objeto. Se quiser ter menos impacto ainda no processamento da física, sugiro que use sphere colliders. São os colisores mais leves da Unity!
Re: Otimizacão por Colisor - (Desativar/Ativar)
Eu acho que consegui descobrir por que ele não estava ativando os objetos novamente, pq quando ele desativava quando saia a parte de ativar ficava sem referencia por que os objetos estão desativados, oque se acha?marcos4503 escreveu:Essa é a melhor forma de otimizar por desactive/active na minha opinião kkk é a forma mais leve que conheço e o melhor é que você nem precisa referenciar nenhum objeto. Se quiser ter menos impacto ainda no processamento da física, sugiro que use sphere colliders. São os colisores mais leves da Unity!
Esse meu script acima funcionou apenas para desativar como eu faria para ativar novamente?
Duarte- Programador
- PONTOS : 3355
REPUTAÇÃO : 97
Idade : 24
Áreas de atuação : Programação
Desenvolvedor Android
Respeito as regras :
Re: Otimizacão por Colisor - (Desativar/Ativar)
Bom, eu fiz assim. Criei um novo gameobject filho do player. Dei uma nova tag pra ele e adicionar um sphere collider com um raio de 30 por exemplo. A tag desse gameobject era "Renderizador".
Criei um script mais ou menos assim
E pronto! Tudo que fiz foi adicionar mais um sphere collider em cada objeto que eu queria ocultar ou mostrar, e adicionar este script a eles. Assim eles iam se ativar ou desativar sempre que entrassem ou não em colisão com o sphere collider "Renderizador" que é filho do player. E como ele é filho do player, ele vai aproveitar o RigidBody que esta no player.
- Lembre-se, um RigidBody se aplica não só a um gameobject mais a TODOS os objetos filhos.
- Você não precisa colocar um RigidBody nos objetos que vão ser desativados.
- As voids OnTriggerEnter funcionam mesmo se o script estiver desabilitado.
- Para estes scripts funcionarem você deve adicionar eles a um objeto e o objeto que você deseja ocultar ou revelar, deve ser filho deles.
Ou então você pode fazer a mesma coisa mais modificando este script e adicionando-o somente ao player. E quando ele entrar em colisão com os objetos ele vai pegar o objeto, procurar em seus filhos pelo objeto ao qual vc deseja desativar e irá desativa-lo/ativa-lo. Mais eu acredito que dessa forma que mostrei o uso de CPU é super baixo.
Criei um script mais ou menos assim
- Código:
public GameObject objeto;
void OnTriggerEnter(Collider colisor){
if(colisor.gameObject == "Renderizador"){
objeto.SetActive(true);
}
}
void OnTriggerExit(Collider colisor){
if(colisor.gameObject == "Renderizador"){
objeto.SetActive(false);
}
}
E pronto! Tudo que fiz foi adicionar mais um sphere collider em cada objeto que eu queria ocultar ou mostrar, e adicionar este script a eles. Assim eles iam se ativar ou desativar sempre que entrassem ou não em colisão com o sphere collider "Renderizador" que é filho do player. E como ele é filho do player, ele vai aproveitar o RigidBody que esta no player.
- Lembre-se, um RigidBody se aplica não só a um gameobject mais a TODOS os objetos filhos.
- Você não precisa colocar um RigidBody nos objetos que vão ser desativados.
- As voids OnTriggerEnter funcionam mesmo se o script estiver desabilitado.
- Para estes scripts funcionarem você deve adicionar eles a um objeto e o objeto que você deseja ocultar ou revelar, deve ser filho deles.
Ou então você pode fazer a mesma coisa mais modificando este script e adicionando-o somente ao player. E quando ele entrar em colisão com os objetos ele vai pegar o objeto, procurar em seus filhos pelo objeto ao qual vc deseja desativar e irá desativa-lo/ativa-lo. Mais eu acredito que dessa forma que mostrei o uso de CPU é super baixo.
Re: Otimizacão por Colisor - (Desativar/Ativar)
marcos4503 escreveu:Bom, eu fiz assim. Criei um novo gameobject filho do player. Dei uma nova tag pra ele e adicionar um sphere collider com um raio de 30 por exemplo. A tag desse gameobject era "Renderizador".
Criei um script mais ou menos assim
- Código:
public GameObject objeto;
void OnTriggerEnter(Collider colisor){
if(colisor.gameObject == "Renderizador"){
objeto.SetActive(true);
}
}
void OnTriggerExit(Collider colisor){
if(colisor.gameObject == "Renderizador"){
objeto.SetActive(false);
}
}
E pronto! Tudo que fiz foi adicionar mais um sphere collider em cada objeto que eu queria ocultar ou mostrar, e adicionar este script a eles. Assim eles iam se ativar ou desativar sempre que entrassem ou não em colisão com o sphere collider "Renderizador" que é filho do player. E como ele é filho do player, ele vai aproveitar o RigidBody que esta no player.
- Lembre-se, um RigidBody se aplica não só a um gameobject mais a TODOS os objetos filhos.
- Você não precisa colocar um RigidBody nos objetos que vão ser desativados.
- As voids OnTriggerEnter funcionam mesmo se o script estiver desabilitado.
- Para estes scripts funcionarem você deve adicionar eles a um objeto e o objeto que você deseja ocultar ou revelar, deve ser filho deles.
Ou então você pode fazer a mesma coisa mais modificando este script e adicionando-o somente ao player. E quando ele entrar em colisão com os objetos ele vai pegar o objeto, procurar em seus filhos pelo objeto ao qual vc deseja desativar e irá desativa-lo/ativa-lo. Mais eu acredito que dessa forma que mostrei o uso de CPU é super baixo.
Me corrija se eu estiver errado.
Dessa forma cada objeto que eu queria ativar/desativar teria que conter esse script?
Para um jogo de cidade que existe vários objetos acho que dessa forma não seria o ideal, (casas, prédios, e outros objetos pela cidade).
Oque se acha, alguma dica de como fazer uma otimização do tipo para um jogo de cidade.
Ou eu entendi errado? kk
Obrigado!
Duarte- Programador
- PONTOS : 3355
REPUTAÇÃO : 97
Idade : 24
Áreas de atuação : Programação
Desenvolvedor Android
Respeito as regras :
Re: Otimizacão por Colisor - (Desativar/Ativar)
Sim, cada objeto teria que ter um script. Mais pra um jogo de cidade, você pode separar varios prédios em chuncks, ou então colocar o script somente no colisor do player e fazer ele desativar ou ativar objetos com uma certa tag.
Re: Otimizacão por Colisor - (Desativar/Ativar)
Simm, mais li em algum lugar que esse negoico de comparar tag no colisor pesa bastante, procede isso?marcos4503 escreveu:Sim, cada objeto teria que ter um script. Mais pra um jogo de cidade, você pode separar varios prédios em chuncks, ou então colocar o script somente no colisor do player e fazer ele desativar ou ativar objetos com uma certa tag.
Eu fiz um script aqui também de ativar/desativar pela distancia, mais acho que iria prejudicar o desempenho!
Duarte- Programador
- PONTOS : 3355
REPUTAÇÃO : 97
Idade : 24
Áreas de atuação : Programação
Desenvolvedor Android
Respeito as regras :
Re: Otimizacão por Colisor - (Desativar/Ativar)
Sim, procede kkkk acontece que quando eu fiz esse script ja tinha um bom tempo, então eu esqueci de avisar. Se você usar asssim
ai não pesa!
Dessa forma ele vai retornar um valor true se a tag do objeto colidido for a mesma de "Renderizador"! Simples e leve!
Agora fica a seu criterio escolher qual aplicar. Dessa forma eu acho que o desempenho quase não é afetado já que ele so vai ativar ou desativar no momento do contato..
- Código:
colisor.CompareTag("Renderizador")
ai não pesa!
Dessa forma ele vai retornar um valor true se a tag do objeto colidido for a mesma de "Renderizador"! Simples e leve!
Agora fica a seu criterio escolher qual aplicar. Dessa forma eu acho que o desempenho quase não é afetado já que ele so vai ativar ou desativar no momento do contato..
Re: Otimizacão por Colisor - (Desativar/Ativar)
Ok então, obrigado.marcos4503 escreveu:Sim, procede kkkk acontece que quando eu fiz esse script ja tinha um bom tempo, então eu esqueci de avisar. Se você usar asssim
- Código:
colisor.CompareTag("Renderizador")
ai não pesa!
Dessa forma ele vai retornar um valor true se a tag do objeto colidido for a mesma de "Renderizador"! Simples e leve!
Agora fica a seu criterio escolher qual aplicar. Dessa forma eu acho que o desempenho quase não é afetado já que ele so vai ativar ou desativar no momento do contato..
Assim que eu chegar em casa irei fazer um script, para ver!
Obrigado!
Duarte- Programador
- PONTOS : 3355
REPUTAÇÃO : 97
Idade : 24
Áreas de atuação : Programação
Desenvolvedor Android
Respeito as regras :
Re: Otimizacão por Colisor - (Desativar/Ativar)
Entao mn do jeito que você falou funcionou eu fiz um teste aqui mais eu teria que por um script em cada objeto..marcos4503 escreveu:Se precisar estamos aí!
Do jeito que eu queria fazer não funciona pq ele desativa e depois não verifica mais TAG, kk
fiz assim, e adicionei a TAG a os objetos que eu queria desativar.
- Código:
using UnityEngine;
using System.Collections;
public class Otimizacao : MonoBehaviour
{
private void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Renderizador"))
{
other.gameObject.SetActive(true);
}
}
- Código:
private void OnTriggerExit(Collider other)
{
if (other.CompareTag("Renderizador"))
{
other.gameObject.SetActive(false);
}
}
}
Duarte- Programador
- PONTOS : 3355
REPUTAÇÃO : 97
Idade : 24
Áreas de atuação : Programação
Desenvolvedor Android
Respeito as regras :
Tópicos semelhantes
» Ativar/Desativar Complemento
» Desativar e ativar Player
» Ativar e desativar botão UI
» Ativar/Desativar Sprites
» Ativar e desativar o emission
» Desativar e ativar Player
» Ativar e desativar botão UI
» Ativar/Desativar Sprites
» Ativar e desativar o emission
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos