[DUVIDA]confirar automaticamente para cada hardware
3 participantes
Página 1 de 1
[DUVIDA]confirar automaticamente para cada hardware
Olá e Bom dia, gostaria de saber se tem alguma forma na unity de configurar automaticamente as qualidades gráficas, dependendo das configurações da maquina do usuario.
diegopds- Mestre
- PONTOS : 3423
REPUTAÇÃO : 52
Idade : 26
Respeito as regras :
Re: [DUVIDA]confirar automaticamente para cada hardware
Eu fiz baseado no conhecimento que tinha, pois fui seguindo e vendo quais são os melhores componentes para os gráficos e quais a CPU e GPU suporta.
Bom, isso pode ser um pouco complicado, mas voce pode fazer um sistema básico e avançado de identificação de hardware, na própria unity, se voce ir em Edit>Project Settings>Quality voce verá que existem já varias Qualidade de Gráficos, provavelmente(Fastest, Fast, Simple, Good, Beautiful, Fantastic), e voce pode até mesmo personalizar e modificar os componentes da qualidade, como Shadows, Anti Aliasing, Qualidade de texturas e etc.
Na minha unity eu modifiquei os nomes delas por (Minimun, Very Low, Low, Medium, High, Ultra High) e modifiquei um pouco as configurações do Ultra High e High.
Primeiro para conseguir pegar informação dos Hardwares voce tem que utilizar o SystemInfo, ele vai ser o principal componente que vamos usar aqui para conseguir pegar informações dos hardware, o que suporta e o que nao suporta, qual a CPU, quantos Cores, Frequencia, qual a GPU, memória, modelo, Id, enfim. Primeiro vamos fazer detectar qual a CPU(e suas configurações) e GPU(e suas configurações) presente na máquina.
Pronto, com isso ao dar Start já podemos detectar as informações mais importantes da nossa CPU e GPU.
Bom, agora vem a parte mais chatinha do nosso tutorial, que é saber o que sua máquina suporta e nao suporta, baseado nisso, precisaremos criar uma array do tipo bool e colocar as coisas mais importantes que precisamos saber para funcionar os gráficos de um jogo, para cada componente que sua máquina suporta retornará true, para cada componente nao suportado retornará false, isso englobando qualidades de texturas, sombras, shader, buffer, anti anliasing, anisotropic, renderizações, cubemaps, ray traicing e etc. Para detectarmos quantas componentes da maquina retornarm true precisamos criar um foreach e uma variavel que acrescenta 1 para cada true retornado na nosso array booleana.
Deve ficar assim, a nossa variavel trueAmount irá conter o valor de quantas retornarám true na nossa array bool supports. Agora precisamos fazer com que baseado nos valores true da array defina um valor para detectar qual o gráfico melhor suportado para a máquina, tudo isso baseado em uma porcentagem de quantidades de elementos na array, que finalmente denominará qual é o gráfico mais acessível para aquela GPU e CPU.
E pronto, chegamos ao fim do nosso tutorial, o que fizemos foi criar um porcentagem para a quantidade suportada de componentes e baseada nessa porcentagem, automaticamente ao apertar Start e irá percorrer o foreach, calcular quantas retornaram um valor true, atribuir este valor a trueAmount, que faremos uma divisão e multiplicação para identificarmos qual foi a porcentagem aproximada de componentes suportados, e para conseguirmos visualizar, precisamos de um string, chamada porcentagem, aí baseada no valor gerado, podemos dividir entre 100% para cada e mudar o QualitySettings, colocando um level, para:
0 = Minimum
1 = Very Low
2 = Low
3= Medium
4 = High
5 = Ultra High
E voce pode ver que eu criei mais algumas variaveis, que são a MSAA2x, MSAA4x, MSAA8x. Pois o unity em todas suas qualidades graficas nao colocam um Anti Aliasing, então eu fiz, que se sua máquina suportar algums desses Anti Aliasing, automaticamente irá implementalo.
Bom, isso pode ser um pouco complicado, mas voce pode fazer um sistema básico e avançado de identificação de hardware, na própria unity, se voce ir em Edit>Project Settings>Quality voce verá que existem já varias Qualidade de Gráficos, provavelmente(Fastest, Fast, Simple, Good, Beautiful, Fantastic), e voce pode até mesmo personalizar e modificar os componentes da qualidade, como Shadows, Anti Aliasing, Qualidade de texturas e etc.
Na minha unity eu modifiquei os nomes delas por (Minimun, Very Low, Low, Medium, High, Ultra High) e modifiquei um pouco as configurações do Ultra High e High.
Primeiro para conseguir pegar informação dos Hardwares voce tem que utilizar o SystemInfo, ele vai ser o principal componente que vamos usar aqui para conseguir pegar informações dos hardware, o que suporta e o que nao suporta, qual a CPU, quantos Cores, Frequencia, qual a GPU, memória, modelo, Id, enfim. Primeiro vamos fazer detectar qual a CPU(e suas configurações) e GPU(e suas configurações) presente na máquina.
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Experimental.Rendering;
public class IdentifyHardware : MonoBehaviour
{
[Header("CPU")]
public int Core;
public int frequency;
public string type;
[Header("GPU")]
public string Name; public string Vendor;
public int Memory;
public int ID;
public string Version;
public int ShaderLevel;
public bool MultiThreaded;
void Start()
{
Core = SystemInfo.processorCount;
frequency = SystemInfo.processorFrequency;
type = SystemInfo.processorType;
ID = SystemInfo.graphicsDeviceID;
Name = SystemInfo.graphicsDeviceName;
Vendor = SystemInfo.graphicsDeviceVendor;
Version = SystemInfo.graphicsDeviceVersion;
Memory = SystemInfo.graphicsMemorySize;
MultiThreaded = SystemInfo.graphicsMultiThreaded;
ShaderLevel = SystemInfo.graphicsShaderLevel;
}
}
Pronto, com isso ao dar Start já podemos detectar as informações mais importantes da nossa CPU e GPU.
Bom, agora vem a parte mais chatinha do nosso tutorial, que é saber o que sua máquina suporta e nao suporta, baseado nisso, precisaremos criar uma array do tipo bool e colocar as coisas mais importantes que precisamos saber para funcionar os gráficos de um jogo, para cada componente que sua máquina suporta retornará true, para cada componente nao suportado retornará false, isso englobando qualidades de texturas, sombras, shader, buffer, anti anliasing, anisotropic, renderizações, cubemaps, ray traicing e etc. Para detectarmos quantas componentes da maquina retornarm true precisamos criar um foreach e uma variavel que acrescenta 1 para cada true retornado na nosso array booleana.
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Experimental.Rendering;
public class IdentifyHardware : MonoBehaviour
{
[Header("CPU")]
public int Core;
public int frequency;
public string type;
[Header("GPU")]
public string Name; public string Vendor;
public int Memory;
public int ID;
public string Version;
public int ShaderLevel;
public bool MultiThreaded;
[Header("Supported")]
public int trueAmount;
private bool[] supports;
public string porcentagem;
public bool linear;
public bool MSAA2x;
public bool MSAA4x;
public bool MSAA8x;
void Start()
{
Core = SystemInfo.processorCount;
frequency = SystemInfo.processorFrequency;
type = SystemInfo.processorType;
ID = SystemInfo.graphicsDeviceID;
Name = SystemInfo.graphicsDeviceName;
Vendor = SystemInfo.graphicsDeviceVendor;
Version = SystemInfo.graphicsDeviceVersion;
Memory = SystemInfo.graphicsMemorySize;
MultiThreaded = SystemInfo.graphicsMultiThreaded;
ShaderLevel = SystemInfo.graphicsShaderLevel;
supports = new bool[]
{
SystemInfo.supportsShadows,
linear = SystemInfo.IsFormatSupported(GraphicsFormat.None, FormatUsage.Linear),
MSAA2x = SystemInfo.IsFormatSupported(GraphicsFormat.None, FormatUsage.MSAA2x),
MSAA4x = SystemInfo.IsFormatSupported(GraphicsFormat.None, FormatUsage.MSAA4x),
MSAA8x = SystemInfo.IsFormatSupported(GraphicsFormat.None, FormatUsage.MSAA8x),
SystemInfo.supports2DArrayTextures,
SystemInfo.supports3DRenderTextures,
SystemInfo.supports3DTextures,
SystemInfo.supportsComputeShaders,
SystemInfo.supportsCubemapArrayTextures,
SystemInfo.supportsGeometryShaders,
SystemInfo.supportsSparseTextures,
SystemInfo.supportsRawShadowDepthSampling,
SystemInfo.supportsHardwareQuadTopology,
SystemInfo.supportsRawShadowDepthSampling,
SystemInfo.supportsMipStreaming,
SystemInfo.supportsMultisampleAutoResolve,
SystemInfo.supportsMotionVectors,
SystemInfo.supportsRayTracing,
SystemInfo.supportsSetConstantBuffer,
SystemInfo.supports32bitsIndexBuffer,
SystemInfo.supportsSeparatedRenderTargetsBlend,
SystemInfo.supportsInstancing
};
foreach(bool Supported in supports)
{
if(Supported == true) trueAmount++;
}
}
}
Deve ficar assim, a nossa variavel trueAmount irá conter o valor de quantas retornarám true na nossa array bool supports. Agora precisamos fazer com que baseado nos valores true da array defina um valor para detectar qual o gráfico melhor suportado para a máquina, tudo isso baseado em uma porcentagem de quantidades de elementos na array, que finalmente denominará qual é o gráfico mais acessível para aquela GPU e CPU.
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Experimental.Rendering;
public class IdentifyHardware : MonoBehaviour
{
[Header("CPU")]
public int Core;
public int frequency;
public string type;
[Header("GPU")]
public string Name; public string Vendor;
public int Memory;
public int ID;
public string Version;
public int ShaderLevel;
public bool MultiThreaded;
[Header("Supported")]
public int trueAmount;
private bool[] supports;
public string porcentagem;
public bool linear;
public bool MSAA2x;
public bool MSAA4x;
public bool MSAA8x;
void Start()
{
Core = SystemInfo.processorCount;
frequency = SystemInfo.processorFrequency;
type = SystemInfo.processorType;
ID = SystemInfo.graphicsDeviceID;
Name = SystemInfo.graphicsDeviceName;
Vendor = SystemInfo.graphicsDeviceVendor;
Version = SystemInfo.graphicsDeviceVersion;
Memory = SystemInfo.graphicsMemorySize;
MultiThreaded = SystemInfo.graphicsMultiThreaded;
ShaderLevel = SystemInfo.graphicsShaderLevel;
supports = new bool[]
{
SystemInfo.supportsShadows,
linear = SystemInfo.IsFormatSupported(GraphicsFormat.None, FormatUsage.Linear),
MSAA2x = SystemInfo.IsFormatSupported(GraphicsFormat.None, FormatUsage.MSAA2x),
MSAA4x = SystemInfo.IsFormatSupported(GraphicsFormat.None, FormatUsage.MSAA4x),
MSAA8x = SystemInfo.IsFormatSupported(GraphicsFormat.None, FormatUsage.MSAA8x),
SystemInfo.supports2DArrayTextures,
SystemInfo.supports3DRenderTextures,
SystemInfo.supports3DTextures,
SystemInfo.supportsComputeShaders,
SystemInfo.supportsCubemapArrayTextures,
SystemInfo.supportsGeometryShaders,
SystemInfo.supportsSparseTextures,
SystemInfo.supportsRawShadowDepthSampling,
SystemInfo.supportsHardwareQuadTopology,
SystemInfo.supportsRawShadowDepthSampling,
SystemInfo.supportsMipStreaming,
SystemInfo.supportsMultisampleAutoResolve,
SystemInfo.supportsMotionVectors,
SystemInfo.supportsRayTracing,
SystemInfo.supportsSetConstantBuffer,
SystemInfo.supports32bitsIndexBuffer,
SystemInfo.supportsSeparatedRenderTargetsBlend,
SystemInfo.supportsInstancing
};
foreach(bool Supported in supports)
{
if(Supported == true) trueAmount++;
}
var value = (double)trueAmount/supports.Length * 100;
value = Mathf.Round((float)value);
porcentagem = value + "%";
if(value >=0 && value <=20) QualitySettings.SetQualityLevel(0);
if(value >=21 && value <=40) QualitySettings.SetQualityLevel(1);
if(value >=41 && value <=60) QualitySettings.SetQualityLevel(2);
if(value >=61 && value <=80) QualitySettings.SetQualityLevel(3);
if(value >=71 && value <=98) QualitySettings.SetQualityLevel(4);
if(value >=99 && value <=100) QualitySettings.SetQualityLevel(5);
if(MSAA2x) QualitySettings.antiAliasing = 2;
if(MSAA4x) QualitySettings.antiAliasing = 4;
if(MSAA8x) QualitySettings.antiAliasing = 8;
}
}
E pronto, chegamos ao fim do nosso tutorial, o que fizemos foi criar um porcentagem para a quantidade suportada de componentes e baseada nessa porcentagem, automaticamente ao apertar Start e irá percorrer o foreach, calcular quantas retornaram um valor true, atribuir este valor a trueAmount, que faremos uma divisão e multiplicação para identificarmos qual foi a porcentagem aproximada de componentes suportados, e para conseguirmos visualizar, precisamos de um string, chamada porcentagem, aí baseada no valor gerado, podemos dividir entre 100% para cada e mudar o QualitySettings, colocando um level, para:
0 = Minimum
1 = Very Low
2 = Low
3= Medium
4 = High
5 = Ultra High
E voce pode ver que eu criei mais algumas variaveis, que são a MSAA2x, MSAA4x, MSAA8x. Pois o unity em todas suas qualidades graficas nao colocam um Anti Aliasing, então eu fiz, que se sua máquina suportar algums desses Anti Aliasing, automaticamente irá implementalo.
Pokedlg- ProgramadorMaster
- PONTOS : 2340
REPUTAÇÃO : 198
Áreas de atuação : Iniciante: ShaderLab, Blender, Java, C++, ASP.NET.
Intermediário: C#.NET, Unity, Shader Graph.
Respeito as regras :
Re: [DUVIDA]confirar automaticamente para cada hardware
Jovem, vou nem pedir mais kkk quando fizer esse monstro de tutorial, cria um tópico com ele, facilita pra encontrar e já podemos mandar o link como sugestão de resposta caso tenha alguma dúvida parecida.
Parabéns.
Parabéns.
Fagner- Moderador
- PONTOS : 4446
REPUTAÇÃO : 667
Áreas de atuação : Modelagem 3D, Programação.
Respeito as regras :
diegopds- Mestre
- PONTOS : 3423
REPUTAÇÃO : 52
Idade : 26
Respeito as regras :
Re: [DUVIDA]confirar automaticamente para cada hardware
Fagner escreveu:Jovem, vou nem pedir mais kkk quando fizer esse monstro de tutorial, cria um tópico com ele, facilita pra encontrar e já podemos mandar o link como sugestão de resposta caso tenha alguma dúvida parecida.
Parabéns.
Valeu . Vou posta lá
Pokedlg- ProgramadorMaster
- PONTOS : 2340
REPUTAÇÃO : 198
Áreas de atuação : Iniciante: ShaderLab, Blender, Java, C++, ASP.NET.
Intermediário: C#.NET, Unity, Shader Graph.
Respeito as regras :
Re: [DUVIDA]confirar automaticamente para cada hardware
diegopds escreveu:valeu pelo tuto, vou testar.
Pokedlg- ProgramadorMaster
- PONTOS : 2340
REPUTAÇÃO : 198
Áreas de atuação : Iniciante: ShaderLab, Blender, Java, C++, ASP.NET.
Intermediário: C#.NET, Unity, Shader Graph.
Respeito as regras :
Tópicos semelhantes
» [Duvida] script para criar um servidor automaticamente
» [DUVIDA] Organizar GUI do inventario automaticamente
» Unity: Como otimizar automaticamente o app para o GooglePlay
» Fazer o player automaticamente ir para um sitio quando não tem balas
» [DÚVIDA] PROBLEMAS PARA COMPILAR PARA ANDROID
» [DUVIDA] Organizar GUI do inventario automaticamente
» Unity: Como otimizar automaticamente o app para o GooglePlay
» Fazer o player automaticamente ir para um sitio quando não tem balas
» [DÚVIDA] PROBLEMAS PARA COMPILAR PARA ANDROID
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos