Manter a última posic de objetos após sair e voltar de cena
3 participantes
Página 1 de 1
Manter a última posic de objetos após sair e voltar de cena
Prezados,
Vi o tutorial do Marcos sobre [TUTORIAL] Salvar a última posição do personagem ao trocar de cena... no entanto ainda não consegui...
Seguinte... Eu quero sair e fazer com que uma array de gameobjetos voltem para a última posição em que estavam na cena...
Tentei adaptar dois scripts do tutorial do Marcos...
Esse nos gameobjetos...
Esse no button que sai ou volta à cena...
Perguntas: Como fazer a array de gameobjetos receber o transform.position de cada um e voltar à cena na última posição em que estavam?
Vi o tutorial do Marcos sobre [TUTORIAL] Salvar a última posição do personagem ao trocar de cena... no entanto ainda não consegui...
Seguinte... Eu quero sair e fazer com que uma array de gameobjetos voltem para a última posição em que estavam na cena...
Tentei adaptar dois scripts do tutorial do Marcos...
Esse nos gameobjetos...
- Código:
using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;
//este script deve estar no seu Player e deve ter o nome "SalvarPosic"
public class SalvarPosicao : MonoBehaviour
{
void Start()
{
if (PlayerPrefs.HasKey("X") && PlayerPrefs.HasKey("Y") && PlayerPrefs.HasKey("Z"))
{
transform.position = new Vector3(PlayerPrefs.GetFloat("X"), PlayerPrefs.GetFloat("Y"), PlayerPrefs.GetFloat("Z"));
}
}
public void SalvarLocalizacao()
{
PlayerPrefs.SetFloat("X", transform.position.x);
PlayerPrefs.SetFloat("Y", transform.position.y);
PlayerPrefs.SetFloat("Z", transform.position.z);
Debug.Log("Salvei as localizacoes");
}
}
Esse no button que sai ou volta à cena...
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class SalvarPosicaoCarregar : MonoBehaviour
{
public GameObject Jogador;
public void Lugar()
{
Jogador.GetComponent<SalvarPosicao>().SalvarLocalizacao();
Debug.Log("algoritmo salvar posicao");
}
}
Perguntas: Como fazer a array de gameobjetos receber o transform.position de cada um e voltar à cena na última posição em que estavam?
joffersoju- Avançado
- PONTOS : 2506
REPUTAÇÃO : 4
Respeito as regras :
Re: Manter a última posic de objetos após sair e voltar de cena
Mas não precisa de outro script, é só no botão vc dizer para ele acessar a void SalvarLocalizacao.
Dica: Deixe só o comando transform no star e tira o if
Dica: Deixe só o comando transform no star e tira o if
lesgoy- Mestre
- PONTOS : 3491
REPUTAÇÃO : 49
Respeito as regras :
Re: Manter a última posic de objetos após sair e voltar de cena
Oi...
Deu certo não aqui... tentei assim e fiz outras adequações, mas, nada...
Deu certo não aqui... tentei assim e fiz outras adequações, mas, nada...
joffersoju- Avançado
- PONTOS : 2506
REPUTAÇÃO : 4
Respeito as regras :
Re: Manter a última posic de objetos após sair e voltar de cena
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SalvarPosicao: MonoBehaviour {
float Obj1PosX,Obj1PosY,Obj1PosZ,aa;
public GameObject Obj1;
// Use this for initialization
void Start () {
// Essas Linhas carregam a posição do objeto e aplicam a posição nele
// // // // // // // // // // // //
if(PlayerPrefs.HasKey("XPosObj1") && PlayerPrefs.HasKey("YPosObj1") && PlayerPrefs.HasKey("ZPosObj1"))
{
Obj1PosX = PlayerPrefs.GetFloat ("XPosObj1");
Obj1PosY = PlayerPrefs.GetFloat ("YPosObj1");
Obj1PosZ = PlayerPrefs.GetFloat ("ZPosObj1");
Obj1.transform.position = new Vector3 (Obj1PosX, Obj1PosY, Obj1PosZ);
}
// // // // // // // // // // // //
}
// Update is called once per frame
void Update () {
}
public void BotaoTrocaDeCena (){
// Essas 3 Linhas salvam a posição do Objeto
// // // // // // //
PlayerPrefs.SetFloat("XPosObj1", Obj1.transform.position.x);
PlayerPrefs.SetFloat("YPosObj1", Obj1.transform.position.y);
PlayerPrefs.SetFloat("ZPosObj1", Obj1.transform.position.z);
// // // // // // //
// O comando que muda de cena deve estar aqui, em baixo das 3 linhas
}
}
Crie um C# Script com o nome 'SalvarPosicao' sem aspas.
Crie um Objeto na sua cena e coloque ele.
Agora no seu botão, aquele que muda de cena, você deverá ir em "OnClick" e clicar no +.
Arraste o Objeto que contem o script.
Clique em "No Function" e mude para SalvarPosicao > BotaoTrocaDeCena.
Agora no Objeto que contém o script existe uma variavel a Obj1
Este Obj1 é o Objeto que vc quer que a posição fique salva, pode ser o player, uma caixa, qualquer coisa. Basta arrastar o seu objeto para ela.
Agora basta dar Play, mover seu objeto e clicar no botão.
Se quiser que outros objetos tenham sua posição salva você devera fazer o seguinte :
Criar uma nova variável com o nome Obj2.
Na function Star, apenas copie e cole as linhas que fazem o carregamento e mude de Obj1 >> Obj2.
Faça o mesmo na void BotaoTrocaDeCena.
Isso deve funcionar
lesgoy- Mestre
- PONTOS : 3491
REPUTAÇÃO : 49
Respeito as regras :
Re: Manter a última posic de objetos após sair e voltar de cena
Ignora a váriavel 'aa' pode até apagar, eu coloquei só para fzr alguns testes e esqueci de tirar
lesgoy- Mestre
- PONTOS : 3491
REPUTAÇÃO : 49
Respeito as regras :
Re: Manter a última posic de objetos após sair e voltar de cena
Oi... tudo bem?
Funfou...
Tive que fazer umas pequenas adequações para a realidade do meu jogo, mas funcionou beleza, obrigado...
Só tenho mais uma pergunta, é possível fazer uma array de objetos para fazer essas localizações? Pq tenho que fazer 16 deles...
Existe algumas forma?
Funfou...
Tive que fazer umas pequenas adequações para a realidade do meu jogo, mas funcionou beleza, obrigado...
Só tenho mais uma pergunta, é possível fazer uma array de objetos para fazer essas localizações? Pq tenho que fazer 16 deles...
Existe algumas forma?
joffersoju- Avançado
- PONTOS : 2506
REPUTAÇÃO : 4
Respeito as regras :
Re: Manter a última posic de objetos após sair e voltar de cena
Ficaria assim :
Ele não tem 16 espaços pq claro, começa a partir do 0 e não do 1.
Você deve ir no inspector onde esta o script e mudar o "Size" da variavel Obj para 16 e definir 1 a 1 qual objeto você quer salvar.
Se quiser adicionar mais obj's é só aumentar o Size no Inspector e aumentar o numero do "for"
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Testes : MonoBehaviour {
public GameObject[] Obj;
public bool Salvar;
public int Pos;
// Use this for initialization
void Start () {
for (Pos = 0; Pos <= 15; Pos++) {
if(PlayerPrefs.HasKey("XPosObj"+ Pos) && PlayerPrefs.HasKey("YPosObj"+ Pos) && PlayerPrefs.HasKey("ZPosObj"+ Pos))
{
Obj[Pos].transform.position = new Vector3 (PlayerPrefs.GetFloat ("XPosObj"+Pos), PlayerPrefs.GetFloat ("YPosObj"+Pos), PlayerPrefs.GetFloat ("ZPosObj"+Pos));
}
}
}
// Update is called once per frame
void Update () {
}
public void BotaoTrocaDeCena (){
for (Pos = 0; Pos <= 15; Pos++) {
PlayerPrefs.SetFloat("XPosObj"+Pos, Obj[Pos].transform.position.x);
PlayerPrefs.SetFloat("YPosObj"+Pos, Obj[Pos].transform.position.y);
PlayerPrefs.SetFloat("ZPosObj"+Pos, Obj[Pos].transform.position.z);
}
}
}
Ele não tem 16 espaços pq claro, começa a partir do 0 e não do 1.
Você deve ir no inspector onde esta o script e mudar o "Size" da variavel Obj para 16 e definir 1 a 1 qual objeto você quer salvar.
Se quiser adicionar mais obj's é só aumentar o Size no Inspector e aumentar o numero do "for"
lesgoy- Mestre
- PONTOS : 3491
REPUTAÇÃO : 49
Respeito as regras :
Re: Manter a última posic de objetos após sair e voltar de cena
Novamente esqueci de apagar a variavel que usei para testes , você pode apaga-la "Salvar", espero que tenha ajudado.
Obs : Eu também não fazia a minima ideia de como fzr loop no unity, sempre fiz códigos grandes, e agr com sua duvida resolvi criar coragem e ir pesquisar, e para minha surpresa é facil kkk
É por isso que se dizem que quem ajuda aprende também !
Obs : Eu também não fazia a minima ideia de como fzr loop no unity, sempre fiz códigos grandes, e agr com sua duvida resolvi criar coragem e ir pesquisar, e para minha surpresa é facil kkk
É por isso que se dizem que quem ajuda aprende também !
lesgoy- Mestre
- PONTOS : 3491
REPUTAÇÃO : 49
Respeito as regras :
Re: Manter a última posic de objetos após sair e voltar de cena
Só para otimizar o código acima, e já que está aprendendo sobre loops também, não é interessante colocar um número específico como condição do laço, pois você mesmo disse que quando muda o size do array, precisa mudar os valores no loop.
Para ficar mais dinâmico e não ter de fazer alterações manuais, você pode usar a propriedade Length dos Arrays para saber seu tamanho, tornando-o a condição do laço:
Assim não importa o tamanho do array, o laço vai percorre-lo todo.
Outra alternativa seria usar o loop foreach, que é mais usado para trabalhar com Arrays e coleções num geral:
Espero ter ajudado neste detalhe.
Para ficar mais dinâmico e não ter de fazer alterações manuais, você pode usar a propriedade Length dos Arrays para saber seu tamanho, tornando-o a condição do laço:
- Código:
for(Pos = 0; Pos < Obj.Length; Pos++){
// Conteúdo do laço
}
Assim não importa o tamanho do array, o laço vai percorre-lo todo.
Outra alternativa seria usar o loop foreach, que é mais usado para trabalhar com Arrays e coleções num geral:
- Código:
foreach(GameObject objeto in Obj){
/* A variável objeto irá guardar
o objeto que está sendo varrido no laco*/
}
Espero ter ajudado neste detalhe.
Tópicos semelhantes
» Loja no game, duvidas sobre voltar para a cena após usar a loja.
» Como fazer a câmera voltar à posição (eixo) inicial após largar o botão de mira?
» Manter aplicativo aberto depois de voltar ao menu principal (android)
» [TUTORIAL] Salvar a última posição do personagem ao trocar de cena
» {duvida pesada} Sistema De Load [ salvar a ultima cena que eu "entrei"}
» Como fazer a câmera voltar à posição (eixo) inicial após largar o botão de mira?
» Manter aplicativo aberto depois de voltar ao menu principal (android)
» [TUTORIAL] Salvar a última posição do personagem ao trocar de cena
» {duvida pesada} Sistema De Load [ salvar a ultima cena que eu "entrei"}
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos