[TUTORIAL] Unity 2019 - Lanterna e pilhas, com UI
+4
MarcosSchultz
Youre
Frosfector
Crash Psycho
8 participantes
Página 1 de 1
[TUTORIAL] Unity 2019 - Lanterna e pilhas, com UI
Fala pessoal, finalmente consegui atualizar esse tutorial antigo e integrar a UI nele. Agora é possível apagar e ascender a lanterna via celular também.
Vídeo tutorial:
Download do modelo 3D e dos sons: https://drive.google.com/open?id=1nKYYVfdekGJ0u815loC_t1dAED7dGcuD
Script da LANTERNA:
Script das PILHAS:
Vídeo tutorial:
Download do modelo 3D e dos sons: https://drive.google.com/open?id=1nKYYVfdekGJ0u815loC_t1dAED7dGcuD
Script da LANTERNA:
- Código:
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
// este código vai na luz da lanterna
[RequireComponent(typeof(AudioSource))][RequireComponent(typeof(Light))]
public class Lanterna : MonoBehaviour {
[Header("UI")]
public Image imagemBateria;
public Button botaoOpcional;
[Header("Sons")]
public AudioClip click;
[Header("Duração")]
public float tempoTotalBaterias = 250;
[Header("Angulo")]
public float anguloMinimo = 20.0f;
public float anguloMaximo = 40.0f;
[Header("Intensidade")]
public float intensidadeMinima = 0.5f;
public float intensidadeMaxima = 5.0f;
[Header("Distancia")]
public float distanciaMin = 3.0f;
public float distanciaMax = 10.0f;
[Header("Inicialização")]
public bool comecarLigado = false;
Light luzLanterna;
AudioSource somLanterna;
bool podeLigar;
float tempoMinimo;
float tempoMaxInicial;
float inverseLerpFactor;
[HideInInspector]
public float tempoAtualLanterna;
void Awake (){
transform.root.tag = "Player";
//
luzLanterna = GetComponent<Light> ();
luzLanterna.enabled = comecarLigado;
//
somLanterna = GetComponent<AudioSource> ();
somLanterna.clip = click;
somLanterna.loop = false;
somLanterna.playOnAwake = false;
//
tempoAtualLanterna = tempoMaxInicial = tempoTotalBaterias;
tempoMinimo = tempoTotalBaterias / 15;
podeLigar = true;
//
if (imagemBateria) {
imagemBateria.type = Image.Type.Filled;
imagemBateria.fillMethod = Image.FillMethod.Horizontal;
imagemBateria.fillOrigin = 0;
}
if (botaoOpcional) {
botaoOpcional.onClick = new Button.ButtonClickedEvent();
botaoOpcional.onClick.AddListener(() => BotaoUILanterna());
}
}
void Update (){
inverseLerpFactor = Mathf.InverseLerp (0, tempoMaxInicial, tempoAtualLanterna);
ControleDaLanterna ();
ControleDaUI ();
}
void ControleDaLanterna(){
//Timer lanterna
if (luzLanterna.enabled == true && podeLigar == true) {
tempoAtualLanterna -= Time.deltaTime;
}
//Input lanterna
if (Input.GetKeyDown (KeyCode.F)) {
luzLanterna.enabled = !luzLanterna.enabled;
somLanterna.PlayOneShot(somLanterna.clip);
}
//Checagens de tempo
if (tempoAtualLanterna <= tempoMinimo) {
luzLanterna.enabled = false;
podeLigar = false;
} else {
podeLigar = true;
}
tempoAtualLanterna = Mathf.Clamp (tempoAtualLanterna, 0.0f, tempoMaxInicial);
//Setar propriedades nas luzes
luzLanterna.spotAngle = Mathf.Clamp((anguloMaximo * inverseLerpFactor), anguloMinimo, anguloMaximo);
luzLanterna.range = Mathf.Clamp ((distanciaMax * inverseLerpFactor), distanciaMin, distanciaMax);
luzLanterna.intensity = Mathf.Clamp ((intensidadeMaxima * inverseLerpFactor), intensidadeMinima, intensidadeMaxima);
}
void ControleDaUI(){
if (imagemBateria) {
imagemBateria.fillAmount = inverseLerpFactor;
}
}
public void BotaoUILanterna(){
luzLanterna.enabled = !luzLanterna.enabled;
somLanterna.PlayOneShot(somLanterna.clip);
}
}
Script das PILHAS:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Pilha : MonoBehaviour {
public Button botaoOpcional;
public KeyCode teclaPegarBateria = KeyCode.E;
[Range(10, 500)]
public float tempoQueVaiRepor = 50;
[Range(0.1f, 3.0f)]
public float distanciaMinima = 2;
//
bool dentroDoColisor;
Lanterna lanternaTemp;
Transform target;
float distancia;
void Start() {
dentroDoColisor = false;
target = GameObject.FindGameObjectWithTag("Player").transform;
if (botaoOpcional) {
botaoOpcional.onClick = new Button.ButtonClickedEvent();
botaoOpcional.onClick.AddListener(() => BotaoUIPegarBateria());
botaoOpcional.gameObject.SetActive(false);
}
}
void Update() {
distancia = Vector3.Distance(transform.position, target.position);
if (distancia < distanciaMinima) {
dentroDoColisor = true;
} else {
dentroDoColisor = false;
lanternaTemp = null;
}
//
if (dentroDoColisor && Input.GetKeyDown(teclaPegarBateria)) {
lanternaTemp = target.gameObject.GetComponentInChildren<Lanterna>();
if (lanternaTemp) {
float soma = lanternaTemp.tempoAtualLanterna + (tempoQueVaiRepor * 0.5f);
if (soma < lanternaTemp.tempoTotalBaterias) {
lanternaTemp.tempoAtualLanterna += tempoQueVaiRepor;
Destroy(this.gameObject);
}
}
}
//
if (botaoOpcional) {
if (dentroDoColisor) {
botaoOpcional.gameObject.SetActive(true);
} else {
botaoOpcional.gameObject.SetActive(false);
}
}
}
public void BotaoUIPegarBateria() {
if (dentroDoColisor) {
lanternaTemp = target.gameObject.GetComponentInChildren<Lanterna>();
if (lanternaTemp) {
float soma = lanternaTemp.tempoAtualLanterna + (tempoQueVaiRepor * 0.5f);
if (soma < lanternaTemp.tempoTotalBaterias) {
lanternaTemp.tempoAtualLanterna += tempoQueVaiRepor;
Destroy(this.gameObject);
}
}
}
}
}
Última edição por MarcosSchultz em Seg Mar 11, 2019 2:00 am, editado 2 vez(es)
Re: [TUTORIAL] Unity 2019 - Lanterna e pilhas, com UI
Que legal!
que pena que não vou poder usa-lo.
To sem pc
que pena que não vou poder usa-lo.
To sem pc
Re: [TUTORIAL] Unity 2019 - Lanterna e pilhas, com UI
Quando eu clico na letra E para pegar não funciona nem com botão me ajuda por favor!
Frosfector- Iniciante
- PONTOS : 2194
REPUTAÇÃO : 0
Respeito as regras :
Re: [TUTORIAL] Unity 2019 - Lanterna e pilhas, com UI
Frosfector escreveu:Quando eu clico na letra E para pegar não funciona nem com botão me ajuda por favor!
Poderia postar mais detalhes? algumas prints talvez?
Re: [TUTORIAL] Unity 2019 - Lanterna e pilhas, com UI
Eai Marcos, fiz tudo certo aqui e aparentemente na primeira vez funcionou de boa, mas logo quando tentei de novo, o personagem simplesmente não pega a pilha... Não aparece nenhum erro nem nada, ele simplesmente não pega, saberia me dizer oq pode ser?
Youre- Iniciante
- PONTOS : 1975
REPUTAÇÃO : 0
Idade : 25
Respeito as regras :
Re: [TUTORIAL] Unity 2019 - Lanterna e pilhas, com UI
Youre escreveu:Eai Marcos, fiz tudo certo aqui e aparentemente na primeira vez funcionou de boa, mas logo quando tentei de novo, o personagem simplesmente não pega a pilha... Não aparece nenhum erro nem nada, ele simplesmente não pega, saberia me dizer oq pode ser?
O código tem uma condição que impede o player de pegar pilhas caso já esteja carregando o máximo
Re: [TUTORIAL] Unity 2019 - Lanterna e pilhas, com UI
Ah eu arrumei uma parte mas continuou o erroWdigamer escreveu:Nome do erro completo:Wdigamer escreveu:ah e eu esqueci de falarWdigamer escreveu:Estou com um pouco de duvida no meu fica aparecendo esse erro:
IndexOutOfRangeException: Array index is out of range.
onde está errado que faz praticamente 2 horas que estou parado nesse lugar
- Código:
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class Lanterna : MonoBehaviour {
public Texture[] TexturaBateria;
public int numero;
public AudioClip click;
public static float tempoTotal = 250; // ESTE VALOR DEVE SER ALTERADO PELO SCRIPT
public float tempoMinimo = 20;
public int pilhaASerTexturizada;
public float anguloDaLuz = 35;
public float distanciaDaLuz = 5;
public float intensidade = 5;
public float reducaoForcaLuz = 50;
public bool podeLigar;
public static float TempoTotalInicial;
public float anguloMaximo, anguloMinimo, intensidadeMaxima, intensidadeMinima, distanciaMax, distanciaMin;
private bool Aviso;
public Font Fonte;
void Start() {
Aviso = true;
GetComponent<Light>().enabled = false;
TempoTotalInicial = tempoTotal;
podeLigar = false;
numero = Mathf.RoundToInt(tempoTotal) / TexturaBateria.Length;
}
void Update() {
if (GetComponent<Light>().enabled == true && podeLigar == true) {
Aviso = false;
tempoTotal -= Time.deltaTime;
}
if (Input.GetKeyDown("f")) {
if (GetComponent<Light>().enabled == true) {
GetComponent<Light>().enabled = false;
GetComponent<AudioSource>().PlayOneShot(click);
}
else {
GetComponent<Light>().enabled = true;
GetComponent<AudioSource>().PlayOneShot(click);
}
}
if (tempoTotal <= tempoMinimo) {
GetComponent<Light>().enabled = false;
podeLigar = false;
}
if (tempoTotal >= tempoMinimo) {
podeLigar = true;
}
if (tempoTotal >= TempoTotalInicial) {
tempoTotal = TempoTotalInicial;
}
GetComponent<Light>().spotAngle = anguloDaLuz * tempoTotal / reducaoForcaLuz;
GetComponent<Light>().range = distanciaDaLuz * tempoTotal / reducaoForcaLuz;
GetComponent<Light>().intensity = intensidade * tempoTotal / reducaoForcaLuz / 2;
pilhaASerTexturizada = Mathf.FloorToInt(tempoTotal / numero);
//==========================VALORES MAXIMOS E MINIMOS=============================
if (GetComponent<Light>().spotAngle >= anguloMaximo) {
GetComponent<Light>().spotAngle = anguloMaximo;
}
if (GetComponent<Light>().spotAngle <= anguloMinimo) {
GetComponent<Light>().spotAngle = anguloMinimo;
}
//========================================
if (GetComponent<Light>().range >= distanciaMax) {
GetComponent<Light>().range = distanciaMax;
}
if (GetComponent<Light>().range <= distanciaMin) {
GetComponent<Light>().range = distanciaMin;
}
//========================================
if (GetComponent<Light>().intensity >= intensidadeMaxima) {
GetComponent<Light>().intensity = intensidadeMaxima;
}
if (GetComponent<Light>().intensity <= intensidadeMinima) {
GetComponent<Light>().intensity = intensidadeMinima;
}
}
void OnGUI() {
GUI.skin.font = Fonte;
GUI.skin.label.fontSize = Screen.height / 10;
if (Aviso == true) {
GUI.Label(new Rect(Screen.width / 2 - Screen.width / 5, Screen.height / 2 - Screen.height / 16, Screen.width / 2.5f, Screen.height / 8), "Press 'F' for flashlight");
if (GetComponent<Light>().enabled == true) {
GUI.DrawTexture(new Rect(Screen.width / 2 + Screen.width / 2.3f, Screen.height / 2 - Screen.height / 4, Screen.width / 25, Screen.height / 10), TexturaBateria[pilhaASerTexturizada]);
}
}
}
}
esse erro ai só acontece com esse comando:Agradecerei o quanto mais rapido me responderem
- Código:
GUI.DrawTexture(new Rect(Screen.width / 2 + Screen.width / 2.3f, Screen.height / 2 - Screen.height / 4, Screen.width / 25, Screen.height / 10), TexturaBateria[pilhaASerTexturizada]);
IndexOutOfRangeException: Array index is out of range.
Lanterna.OnGUI () (at Assets/Scripts/Lanterna.cs:87)
ps: a versão do meu unity é 5.6.7f1 não é mais atualizado porque essa é a versão mais atualizada que suporta 32 bits
Sorry se isso for contra as regras.
agr ta assim
- Código:
using UnityEngine;
using System.Collections;
public class Lanterna : MonoBehaviour {
private bool Aviso;
public Font Fonte;
public Texture[] TexturaBateria;
public int numero;
public AudioClip click;
public static float tempoTotal = 250; // ESTE VALOR DEVE SER ALTERADO PELO SCRIPT
public float tempoMinimo = 20;
public int pilhaASerTexturizada;
public float anguloDaLuz = 35;
public float distanciaDaLuz = 5;
public float intensidade = 5;
public float reducaoForcaLuz = 50;
public bool podeLigar;
public static float TempoTotalInicial;
public float anguloMaximo, anguloMinimo, intensidadeMaxima, intensidadeMinima, distanciaMax, distanciaMin;
void Start() {
Aviso = true;
GetComponent<Light>().enabled = false;
TempoTotalInicial = tempoTotal;
podeLigar = false;
numero = Mathf.RoundToInt(tempoTotal) / TexturaBateria.Length;
}
void Update() {
if (GetComponent<Light>().enabled == true && podeLigar == true) {
Aviso = false;
tempoTotal -= Time.deltaTime;
}
if (Input.GetKeyDown("f")) {
if (GetComponent<Light>().enabled == true) {
GetComponent<Light>().enabled = false;
GetComponent<AudioSource>().PlayOneShot(click);
}
else {
GetComponent<Light>().enabled = true;
GetComponent<AudioSource>().PlayOneShot(click);
}
}
if (tempoTotal <= tempoMinimo) {
GetComponent<Light>().enabled = false;
podeLigar = false;
}
if (tempoTotal >= tempoMinimo) {
podeLigar = true;
}
if (tempoTotal >= TempoTotalInicial) {
tempoTotal = TempoTotalInicial;
}
GetComponent<Light>().spotAngle = anguloDaLuz * tempoTotal / reducaoForcaLuz;
GetComponent<Light>().range = distanciaDaLuz * tempoTotal / reducaoForcaLuz;
GetComponent<Light>().intensity = intensidade * tempoTotal / reducaoForcaLuz / 2;
pilhaASerTexturizada = Mathf.FloorToInt(tempoTotal / numero);
//==========================VALORES MAXIMOS E MINIMOS=============================
if (GetComponent<Light>().spotAngle >= anguloMaximo) {
GetComponent<Light>().spotAngle = anguloMaximo;
}
if (GetComponent<Light>().spotAngle <= anguloMinimo) {
GetComponent<Light>().spotAngle = anguloMinimo;
}
//========================================
if (GetComponent<Light>().range >= distanciaMax) {
GetComponent<Light>().range = distanciaMax;
}
if (GetComponent<Light>().range <= distanciaMin) {
GetComponent<Light>().range = distanciaMin;
}
//========================================
if (GetComponent<Light>().intensity >= intensidadeMaxima) {
GetComponent<Light>().intensity = intensidadeMaxima;
}
if (GetComponent<Light>().intensity <= intensidadeMinima) {
GetComponent<Light>().intensity = intensidadeMinima;
}
}
void OnGUI() {
GUI.skin.font = Fonte;
GUI.skin.label.fontSize = Screen.height / 10;
if (Aviso == true) {
GUI.Label(new Rect(Screen.width / 2 - Screen.width / 5, Screen.height / 2 - Screen.height / 16, Screen.width / 2.5f, Screen.height / 8), "Press 'F' for flashlight");
}
if (GetComponent<Light>().enabled == true) {
GUI.DrawTexture(new Rect(Screen.width / 2 + Screen.width / 2.3f, Screen.height / 2 - Screen.height / 4, Screen.width / 25, Screen.height / 10), TexturaBateria[pilhaASerTexturizada]);
}
}
}
Wdigamer- Iniciante
- PONTOS : 1721
REPUTAÇÃO : 1
Respeito as regras :
Re: [TUTORIAL] Unity 2019 - Lanterna e pilhas, com UI
Da erro de nullReference por que você não associou as texturas na array de texturas...
Você assistiu o vídeo todo e seguiu passo a passo?
Você assistiu o vídeo todo e seguiu passo a passo?
Re: [TUTORIAL] Unity 2019 - Lanterna e pilhas, com UI
Não, porque minha a versão minha é unity 5MarcosSchultz escreveu:Da erro de nullReference por que você não associou as texturas na array de texturas...
Você assistiu o vídeo todo e seguiu passo a passo?
e eu to usando o script do outro tópico
Wdigamer- Iniciante
- PONTOS : 1721
REPUTAÇÃO : 1
Respeito as regras :
Re: [TUTORIAL] Unity 2019 - Lanterna e pilhas, com UI
depois que coloquei o scripts da lanterna o meu "range" e "intensity" mudarao e eu autero mas coontinua do mesmo jeito au apertar play oque eu faço
EduardoSM- Iniciante
- PONTOS : 1594
REPUTAÇÃO : 0
Idade : 20
Respeito as regras :
Re: [TUTORIAL] Unity 2019 - Lanterna e pilhas, com UI
https://youtu.be/6GO4eXmAstU entra nesse linque ai eu explico melhor oque aconteseEduardoSM escreveu:depois que coloquei o scripts da lanterna o meu "range" e "intensity" mudarao e eu autero mas coontinua do mesmo jeito au apertar play oque eu faço
EduardoSM- Iniciante
- PONTOS : 1594
REPUTAÇÃO : 0
Idade : 20
Respeito as regras :
Re: [TUTORIAL] Unity 2019 - Lanterna e pilhas, com UI
EduardoSM escreveu:https://youtu.be/6GO4eXmAstU entra nesse linque ai eu explico melhor oque aconteceEduardoSM escreveu:depois que coloquei o scripts da lanterna o meu "range" e "intensity" mudarao e eu autero mas coontinua do mesmo jeito au apertar play oque eu faço
É que o próprio código redefine as configurações da Light.... Basta alterar as propriedades da luz com base nos parâmetros fornecidos no inspector do código mesmo... A luz você meio que não configura nada nela, é tudo no inspector do código.
Re: [TUTORIAL] Unity 2019 - Lanterna e pilhas, com UI
Olá, quando eu aperto o E, o personagem não pega a pilha
LeonTrindade01- Iniciante
- PONTOS : 1458
REPUTAÇÃO : 0
Idade : 26
Respeito as regras :
Re: [TUTORIAL] Unity 2019 - Lanterna e pilhas, com UI
Boa tarde,
Eu sou novo por aqui e estou tentando aprender com vocês.
Usei os scripts da lanterna e da pilha assistindo o vídeo do tópico e deu tudo certo, porém quando coloco mais pilhas eu só consigo pegar as pilhas via celular pela ordem em que coloquei no senário, se eu for em uma pilha aleatória, diferente da ordem que eu coloquei não ativa mais o botão de pegar a pilha, no PC com a tecla E funciona perfeitamente em qualquer pilha aleatoriamente, o erro aparece apenas no celular.
O que estou fazendo de errado para isso acontecer?
Muito obrigado.
Vocês são Top!!
Eu sou novo por aqui e estou tentando aprender com vocês.
Usei os scripts da lanterna e da pilha assistindo o vídeo do tópico e deu tudo certo, porém quando coloco mais pilhas eu só consigo pegar as pilhas via celular pela ordem em que coloquei no senário, se eu for em uma pilha aleatória, diferente da ordem que eu coloquei não ativa mais o botão de pegar a pilha, no PC com a tecla E funciona perfeitamente em qualquer pilha aleatoriamente, o erro aparece apenas no celular.
O que estou fazendo de errado para isso acontecer?
Muito obrigado.
Vocês são Top!!
Lecosouza- Iniciante
- PONTOS : 1292
REPUTAÇÃO : 0
Respeito as regras :
Tópicos semelhantes
» [TUTORIAL] Sistema de Lanterna com Pilhas
» [TUTORIAL] Unity 2019.4 ou superior - PRESETS
» Sistema de lanterna com pilhas que tem como pegar pra usar depois
» [TUTORIAL] Deixando o unity 2019 preto na versão de graça
» Qual versão do JDK, NDK E SDK o Unity Hub recomenda para Unity 2019.2.12f1 (64-bit)?
» [TUTORIAL] Unity 2019.4 ou superior - PRESETS
» Sistema de lanterna com pilhas que tem como pegar pra usar depois
» [TUTORIAL] Deixando o unity 2019 preto na versão de graça
» Qual versão do JDK, NDK E SDK o Unity Hub recomenda para Unity 2019.2.12f1 (64-bit)?
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos