Problema mudar de sprite sempre que seja adicionado um novo sprite a lista
2 participantes
Página 1 de 2
Página 1 de 2 • 1, 2
Problema mudar de sprite sempre que seja adicionado um novo sprite a lista
Olá
Estou com dificuldade de mudar o sprite do player sempre que arrasto um objecto para o lista de items ao clicar no play ele ler os movimentos ele muda me sempre para o ultimo sprite adicionado e eu queria que ele só mudasse quando a condição fosse chamada mas eu não sei como fazer isso. Já tentei de algumas maneiras mas não consegui. A função changeSprite é onde ele carrega o sprite e na função rotateSpritePlayer é onde ela é chamada e também adiciona uma posição a lista de movimentos para que seja feita a mudança do sprite.
O código é o seguinte:
Estou com dificuldade de mudar o sprite do player sempre que arrasto um objecto para o lista de items ao clicar no play ele ler os movimentos ele muda me sempre para o ultimo sprite adicionado e eu queria que ele só mudasse quando a condição fosse chamada mas eu não sei como fazer isso. Já tentei de algumas maneiras mas não consegui. A função changeSprite é onde ele carrega o sprite e na função rotateSpritePlayer é onde ela é chamada e também adiciona uma posição a lista de movimentos para que seja feita a mudança do sprite.
O código é o seguinte:
- Código:
public void startMoviments()
{
StartCoroutine(moveWave());
}
// Recria os varios movimentos na lista
IEnumerator moveWave()
{
while (counter < movimentsList.Count)
{
yield return new WaitForSeconds(respawnTime);
StartCoroutine (MovePlayer (movimentsList[countMoviments]));
movimentsList.Remove (movimentsList [countMoviments]);
counter++;
}
}
public void rotateSpritePlayer(){
for (int i = 0; i < player.itemsList.Count; i++) {
if (player.itemsList [i].name.Contains ("rotateUp")) {
changeSprite(ImagePlayerRotateUp);
movimentsList.Add (Vector3.zero);
}
if (player.itemsList [i].name.Contains ("rotateDown")) {
changeSprite(ImagePlayerRotateDown);
movimentsList.Add (Vector3.zero);
}
if (player.itemsList [i].name.Contains ("rotateLeft")) {
changeSprite(ImagePlayerRotateLeft);
movimentsList.Add (Vector3.zero);
}
if (player.itemsList [i].name.Contains ("rotateRight")) {
changeSprite(ImagePlayerRotateRight);
movimentsList.Add (Vector3.zero);
}
}
}
public void movimentsPlayer(){
for (int i = 0; i < player.itemsList.Count; i++) {
if (player.itemsList [i].name.Contains ("moveUp")) {
movimentsList.Add (Vector3.up);
} else if (player.itemsList [i].name.Contains ("moveDown")) {
movimentsList.Add (Vector3.down);
} else if (player.itemsList [i].name.Contains ("moveLeft")) {
movimentsList.Add (Vector3.left);
} else if (player.itemsList [i].name.Contains ("moveRight")) {
movimentsList.Add (Vector3.right);
}
}
}
public IEnumerator MovePlayer(Vector3 direction) // função que enumera as direções do teclado
{
isMoving = true;
float elapsedTime = 0;
origPos = transform.position;
targetPos = origPos + direction;
while (elapsedTime < timeToMove) {
transform.position = Vector3.Lerp (origPos, targetPos, (elapsedTime / timeToMove));//modifica as posições interpolando linearmente entre dois vectores
elapsedTime += Time.deltaTime;
yield return null;
}
transform.position = targetPos;
isMoving = false;
}
public void changeSprite(Sprite sprite){
spritePlayerRenderer = GetComponent<SpriteRenderer> ();
spritePlayerRenderer.sprite = sprite ;
}
Xremix30- Membro
- PONTOS : 2355
REPUTAÇÃO : 3
Re: Problema mudar de sprite sempre que seja adicionado um novo sprite a lista
Nao entendi muito bem, que condição seria essa? E onde está este sprite, no changeSprite?
Pokedlg- ProgramadorMaster
- PONTOS : 2336
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: Problema mudar de sprite sempre que seja adicionado um novo sprite a lista
Sim. ou seja eu declarei os sprites em cima ou seja sao 4 sprites um para virar para cima outro para o lado esquerdo outro para o lado direito e outro para baixo. essa função muda o estado deles o problema é quando ele verifica dentro da lista player.itemsList ele actualiza sempre para o ultimo. Ou seja tenho a lista de movimentos e como só da para adicionar Vectores eu nao sei como fazer esse sprite só ser atualizado quando for chamado. o que esta acontecer é que ele como nao guarda o sprite em nenhuma lista ele muda sempre que o sprite é chamado. e e eu queriq por exemplo: quando arrastar as setas para o inventario e desse play ele fizesse isto:Pokedlg escreveu:Nao entendi muito bem, que condição seria essa? E onde está este sprite, no changeSprite?
lista de items:| 0 | 1 | 2 | 3 |
roda para direita + seta para a direita + roda para baixo + seta para baixo (quando clicar no botão play faz esta sequencia)
Xremix30- Membro
- PONTOS : 2355
REPUTAÇÃO : 3
Re: Problema mudar de sprite sempre que seja adicionado um novo sprite a lista
Xremix30 escreveu:Sim. ou seja eu declarei os sprites em cima ou seja sao 4 sprites um para virar para cima outro para o lado esquerdo outro para o lado direito e outro para baixo. essa função muda o estado deles o problema é quando ele verifica dentro da lista player.itemsList ele actualiza sempre para o ultimo. Ou seja tenho a lista de movimentos e como só da para adicionar Vectores eu nao sei como fazer esse sprite só ser atualizado quando for chamado. o que esta acontecer é que ele como nao guarda o sprite em nenhuma lista ele muda sempre que o sprite é chamado. e e eu queriq por exemplo: quando arrastar as setas para o inventario e desse play ele fizesse isto:Pokedlg escreveu:Nao entendi muito bem, que condição seria essa? E onde está este sprite, no changeSprite?
lista de items:| 0 | 1 | 2 | 3 |
roda para direita + seta para a direita + roda para baixo + seta para baixo (quando clicar no botão play faz esta sequencia)
Voce quer colocar os sprites em uma lista? E como voce quer chamar eles? Atraves de teclas do teclado?
Pokedlg- ProgramadorMaster
- PONTOS : 2336
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: Problema mudar de sprite sempre que seja adicionado um novo sprite a lista
Não. Eu tenho um inventário que já tem as imagens com uma tag associada. Quando arrasto para o segundo ele guarda essa imagem associada com a tag e depois neste código ele compara a tag se o item que tiver dentro da lista tiver a tag correspondente por ex:moveUp quando clicar no play ele vai fazer com que o robo ande no senario. É tipo um drag and drop é do género do jogo light bot que está no Google play em que se arrasta items para o robo andarPokedlg escreveu:Xremix30 escreveu:Sim. ou seja eu declarei os sprites em cima ou seja sao 4 sprites um para virar para cima outro para o lado esquerdo outro para o lado direito e outro para baixo. essa função muda o estado deles o problema é quando ele verifica dentro da lista player.itemsList ele actualiza sempre para o ultimo. Ou seja tenho a lista de movimentos e como só da para adicionar Vectores eu nao sei como fazer esse sprite só ser atualizado quando for chamado. o que esta acontecer é que ele como nao guarda o sprite em nenhuma lista ele muda sempre que o sprite é chamado. e e eu queriq por exemplo: quando arrastar as setas para o inventario e desse play ele fizesse isto:Pokedlg escreveu:Nao entendi muito bem, que condição seria essa? E onde está este sprite, no changeSprite?
lista de items:| 0 | 1 | 2 | 3 |
roda para direita + seta para a direita + roda para baixo + seta para baixo (quando clicar no botão play faz esta sequencia)
Voce quer colocar os vetores em uma lista? E como voce quer chamar eles? Atraves de teclas do teclado?
Xremix30- Membro
- PONTOS : 2355
REPUTAÇÃO : 3
Re: Problema mudar de sprite sempre que seja adicionado um novo sprite a lista
Xremix30 escreveu:Não. Eu tenho um inventário que já tem as imagens com uma tag associada. Quando arrasto para o segundo ele guarda essa imagem associada com a tag e depois neste código ele compara a tag se o item que tiver dentro da lista tiver a tag correspondente por ex:moveUp quando clicar no play ele vai fazer com que o robo ande no senario. É tipo um drag and drop é do género do jogo light bot que está no Google play em que se arrasta items para o robo andarPokedlg escreveu:Xremix30 escreveu:Sim. ou seja eu declarei os sprites em cima ou seja sao 4 sprites um para virar para cima outro para o lado esquerdo outro para o lado direito e outro para baixo. essa função muda o estado deles o problema é quando ele verifica dentro da lista player.itemsList ele actualiza sempre para o ultimo. Ou seja tenho a lista de movimentos e como só da para adicionar Vectores eu nao sei como fazer esse sprite só ser atualizado quando for chamado. o que esta acontecer é que ele como nao guarda o sprite em nenhuma lista ele muda sempre que o sprite é chamado. e e eu queriq por exemplo: quando arrastar as setas para o inventario e desse play ele fizesse isto:Pokedlg escreveu:Nao entendi muito bem, que condição seria essa? E onde está este sprite, no changeSprite?
lista de items:| 0 | 1 | 2 | 3 |
roda para direita + seta para a direita + roda para baixo + seta para baixo (quando clicar no botão play faz esta sequencia)
Voce quer colocar os vetores em uma lista? E como voce quer chamar eles? Atraves de teclas do teclado?
Ok, e em qual lista o sprite está? E o que estas seuquencias irao fazer? desculpe, nao estou entendendo
Pokedlg- ProgramadorMaster
- PONTOS : 2336
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: Problema mudar de sprite sempre que seja adicionado um novo sprite a lista
Este é o jogo que estou a desenvolver:Pokedlg escreveu:Xremix30 escreveu:Não. Eu tenho um inventário que já tem as imagens com uma tag associada. Quando arrasto para o segundo ele guarda essa imagem associada com a tag e depois neste código ele compara a tag se o item que tiver dentro da lista tiver a tag correspondente por ex:moveUp quando clicar no play ele vai fazer com que o robo ande no senario. É tipo um drag and drop é do género do jogo light bot que está no Google play em que se arrasta items para o robo andarPokedlg escreveu:Xremix30 escreveu:Sim. ou seja eu declarei os sprites em cima ou seja sao 4 sprites um para virar para cima outro para o lado esquerdo outro para o lado direito e outro para baixo. essa função muda o estado deles o problema é quando ele verifica dentro da lista player.itemsList ele actualiza sempre para o ultimo. Ou seja tenho a lista de movimentos e como só da para adicionar Vectores eu nao sei como fazer esse sprite só ser atualizado quando for chamado. o que esta acontecer é que ele como nao guarda o sprite em nenhuma lista ele muda sempre que o sprite é chamado. e e eu queriq por exemplo: quando arrastar as setas para o inventario e desse play ele fizesse isto:Pokedlg escreveu:Nao entendi muito bem, que condição seria essa? E onde está este sprite, no changeSprite?
lista de items:| 0 | 1 | 2 | 3 |
roda para direita + seta para a direita + roda para baixo + seta para baixo (quando clicar no botão play faz esta sequencia)
Voce quer colocar os vetores em uma lista? E como voce quer chamar eles? Atraves de teclas do teclado?
Ok, e em qual lista o sprite está? E o que estas seuquencias irao fazer? desculpe, nao estou entendendo
imagem do jogo
Este é o script completo:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class PlayerMoviment : MonoBehaviour {
public bool isMoving, isSprite;
public Vector3 origPos, targetPos;
private float timeToMove = 0.2f;
// Tempo entre cada chamada de um movimento
public float respawnTime = 3.0f;
public Player player;
public List<Vector3> movimentsList;
public Sprite ImagePlayerRotateUp;
public Sprite ImagePlayerRotateDown;
public Sprite ImagePlayerRotateLeft;
public Sprite ImagePlayerRotateRight;
private SpriteRenderer spritePlayerRenderer;
int counter, countMoviments;
// Use this for initialization
void Start () {
countMoviments = 0;
player = GameObject.Find("Player").GetComponent<Player> ();
//addMovimentsList();
}
// Método a chamar na opção do botão Play
public void startMoviments()
{
//Primeira chamada do moveWave
StartCoroutine(moveWave());
//rotateSpritePlayer ();
}
// Recria os varios movimentos na lista
IEnumerator moveWave()
{
//rotateSpriteList.Reverse (0, rotateSpriteList.Count);
// Enquanto a lista (lista) tiver movimentos ...");
while (counter < movimentsList.Count)
{
yield return new WaitForSeconds(respawnTime);
// Faz um movimento do jogador
// Chama a sua função (ex: movePlayer()) para o movimento
StartCoroutine (MovePlayer (movimentsList[countMoviments]));
movimentsList.Remove (movimentsList [countMoviments]);
counter++;
}
}
public void rotateSpritePlayer(){
foreach(GameObject rotateSprite in player.itemsList){
if (rotateSprite.name.Contains ("rotateUp")) {
changeSprite(ImagePlayerRotateUp);
movimentsList.Add (Vector3.zero);
}
if (rotateSprite.name.Contains ("rotateDown")) {
changeSprite(ImagePlayerRotateDown);
movimentsList.Add (Vector3.zero);
}
if (rotateSprite.name.Contains ("rotateLeft")) {
changeSprite(ImagePlayerRotateLeft);
movimentsList.Add (Vector3.zero);
}
if (rotateSprite.name.Contains ("rotateRight")) {
changeSprite(ImagePlayerRotateRight);
movimentsList.Add (Vector3.zero);
}
}
}
public void movimentsPlayer(){
foreach (GameObject moviment in player.itemsList) {
if (moviment.name.Contains ("moveUp")) {
movimentsList.Add (Vector3.up);
} else if (moviment.name.Contains ("moveDown")) {
movimentsList.Add (Vector3.down);
} else if (moviment.name.Contains ("moveLeft")) {
movimentsList.Add (Vector3.left);
} else if (moviment.name.Contains ("moveRight")) {
movimentsList.Add (Vector3.right);
}
//countMoviments++;
}
}
public void handleCatchItems(){
foreach(GameObject handle in player.itemsList){
if (handle.name.Contains ("handleCatch")) {
movimentsList.Add (Vector3.zero);
Debug.Log ("Hello");
}
}
}
public IEnumerator MovePlayer(Vector3 direction) // função que enumera as direções do teclado
{
isMoving = true;
float elapsedTime = 0;
origPos = transform.position;
targetPos = origPos + direction;
while (elapsedTime < timeToMove) {
transform.position = Vector3.Lerp (origPos, targetPos, (elapsedTime / timeToMove));//modifica as posições interpolando linearmente entre dois vectores
elapsedTime += Time.deltaTime;
yield return null;
}
transform.position = targetPos;
isMoving = false;
if (FuelBar.Fuel > 0) {
FuelBar.Fuel -= 1.0f;
transform.position = targetPos;
} else {
SceneManager.LoadScene (1);
}
}
public void changeSprite(Sprite sprite){
spritePlayerRenderer = GetComponent<SpriteRenderer> ();
spritePlayerRenderer.sprite = sprite ;
}
Xremix30- Membro
- PONTOS : 2355
REPUTAÇÃO : 3
Re: Problema mudar de sprite sempre que seja adicionado um novo sprite a lista
Mas o player.itemsList é uma lista de sprites? E quando a void starMoviments e rotateSpritePlayer é chamada? Pelo que eu vi vc colocou um // atrás de quando ela é chamada
Pokedlg- ProgramadorMaster
- PONTOS : 2336
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: Problema mudar de sprite sempre que seja adicionado um novo sprite a lista
Não. O que essa lista faz é só armazenar as imagens que tem associado uma tag. O que depois faz o boneco movimentar é a lista que se chama movinentList ou seja o qie acontesse é eu percorro a lista itemList e tenho condições a verificar se a lista conter a tag da imagem por ex: moveUp ou rotateUp depende do item que arrastar ele adiciona na lista movinentList os movimentos e quando dou play ele lê toda a lista com os movimentos que foram associados ao longo do jogoPokedlg escreveu:Mas o player.itemsList é uma lista de sprites?
Xremix30- Membro
- PONTOS : 2355
REPUTAÇÃO : 3
Re: Problema mudar de sprite sempre que seja adicionado um novo sprite a lista
Ok, acho que entendi, se voce arrastar uma imagem com a tag: "Move Up" ele vai adicionar a movimentList,que vai ser lida e associada ao jogo, é isso?
E como voce chama a void starMoviments e rotateSpritePlayer? Pelo que eu vi vc colocou um // atrás de quando ela é chamada. E o seu problema, é na void rotateSprite, que sempre muda para o ultimo sprite adicionado é isso?
E como voce chama a void starMoviments e rotateSpritePlayer? Pelo que eu vi vc colocou um // atrás de quando ela é chamada. E o seu problema, é na void rotateSprite, que sempre muda para o ultimo sprite adicionado é isso?
Pokedlg- ProgramadorMaster
- PONTOS : 2336
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: Problema mudar de sprite sempre que seja adicionado um novo sprite a lista
Sim. E eu não sei como resolver isso. Eu queria que ele mudasse quando por ex: o sprite está na segunda posição da lista era nessa posição que devia ler o sprite ou seja só quero que mude de posição quando ao percorrer a lista esteja naquela posição e não passar para o último sprite sempre uwqyque for adicionadoPokedlg escreveu:Ok, acho que entendi, se voce arrastar uma imagem com a tag: "Move Up" ele vai adicionar a movimentList,que vai ser lida e associada ao jogo, é isso?
E como voce chama a void starMoviments e rotateSpritePlayer? Pelo que eu vi vc colocou um // atrás de quando ela é chamada. E o seu problema, é na void rotateSprite, que sempre muda para o ultimo sprite adicionado é isso?
Xremix30- Membro
- PONTOS : 2355
REPUTAÇÃO : 3
Re: Problema mudar de sprite sempre que seja adicionado um novo sprite a lista
No caso ele está mudando para a rotateRight? Ou nao tem nenhum sprite ainda e vc adicona depois?
Pokedlg- ProgramadorMaster
- PONTOS : 2336
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: Problema mudar de sprite sempre que seja adicionado um novo sprite a lista
Eu ja entendi o seu problema, isso está acontecendo porque voce coloca if conter a tag X muda o sprite se conter e por isso muda semre para o ultimo pois sempre está contendo a tag X. Me tira uma duvida, essas setas e rodas da sequencia que voce me falo, são setas do teclado ou sao sprites ou outra coisa?
E nessa sequencia que voce quer chamar o sprite a ser mudado?
E nessa sequencia que voce quer chamar o sprite a ser mudado?
Pokedlg- ProgramadorMaster
- PONTOS : 2336
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: Problema mudar de sprite sempre que seja adicionado um novo sprite a lista
Esta é uma sequencia como na imagem;Pokedlg escreveu:Eu ja entendi o seu problema, isso está acontecendo porque voce coloca if conter a tag X muda o sprite se conter e por isso muda semre para o ultimo pois sempre está contendo a tag X. Me tira uma duvida, essas setas e rodas da sequencia que voce me falo, são setas do teclado ou sao sprites ou outra coisa?
E nessa sequencia que voce quer chamar o sprite a ser mudado?
imagem do inventario
neste caso ja dei play para mostrar qual a posição que apanha que é sempre a ultima.
O que faz mover o boneco é a função MovePlayer(Vector direction) depois só adiciono o vector a lista movimentList que quero ex:
movimentList.Add(Vector.up) depois lê essa lista dentro de uma corroutina dentro do while e o robo move-se na direçao que eu quero
Xremix30- Membro
- PONTOS : 2355
REPUTAÇÃO : 3
Re: Problema mudar de sprite sempre que seja adicionado um novo sprite a lista
Ok entao quer dizer, que quando voce coloca o sprite nesta sequencia ele muda, é isso? Tipo, voce mando a imagem do robo virado para baixo, portanto o primeiro Sprite é do robo virado para a direita, só que quando voce da play e continua virado para baixo, é isso?
Pokedlg- ProgramadorMaster
- PONTOS : 2336
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: Problema mudar de sprite sempre que seja adicionado um novo sprite a lista
Sim. Ou seja sempre que adicionar o sprite novo ele vai sempre mostrar o último sprite colocado podia ser down Left Right Up ele iria substituirPokedlg escreveu:Ok entao quer dizer, que quando voce coloca o sprite nesta sequencia ele muda, é isso? Tipo, voce mando a imagem do robo virado para baixo, portanto o primeiro Sprite é do robo virado para a direita, só que quando voce da play e continua virado para baixo, é isso?
Xremix30- Membro
- PONTOS : 2355
REPUTAÇÃO : 3
Re: Problema mudar de sprite sempre que seja adicionado um novo sprite a lista
Xremix30 escreveu:Sim. Ou seja sempre que adicionar o sprite novo ele vai sempre mostrar o último sprite colocado podia ser down Left Right Up ele iria substituirPokedlg escreveu:Ok entao quer dizer, que quando voce coloca o sprite nesta sequencia ele muda, é isso? Tipo, voce mando a imagem do robo virado para baixo, portanto o primeiro Sprite é do robo virado para a direita, só que quando voce da play e continua virado para baixo, é isso?
Entendi
Pokedlg- ProgramadorMaster
- PONTOS : 2336
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: Problema mudar de sprite sempre que seja adicionado um novo sprite a lista
A movimentação funciona corretamente né?
Pokedlg- ProgramadorMaster
- PONTOS : 2336
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: Problema mudar de sprite sempre que seja adicionado um novo sprite a lista
Sim. o problema é mesmo os spritesPokedlg escreveu:A movimentação funciona corretamente né?
Xremix30- Membro
- PONTOS : 2355
REPUTAÇÃO : 3
Re: Problema mudar de sprite sempre que seja adicionado um novo sprite a lista
Ok, irei fazer alguns testes e tentar algumas soluções.
Pokedlg- ProgramadorMaster
- PONTOS : 2336
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: Problema mudar de sprite sempre que seja adicionado um novo sprite a lista
Durante o jogo, como voce adiciona essas casas, para que ele possa realizar as funções, arrastando? Tem um script para isso, que serve para colocar na sequencia?
Pokedlg- ProgramadorMaster
- PONTOS : 2336
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: Problema mudar de sprite sempre que seja adicionado um novo sprite a lista
Sim que é o drop slot mas o que ele faz unicamente é quando a imagem é arrastada para este inventário guarda na lista itemList as imagens com a tag correspondente. Este script é que é o principal.Pokedlg escreveu:Durante o jogo, como voce adiciona essas casas, para que ele possa realizar as funções, arrastando? Tem um script para isso, que serve para colocar na sequencia?
Xremix30- Membro
- PONTOS : 2355
REPUTAÇÃO : 3
Re: Problema mudar de sprite sempre que seja adicionado um novo sprite a lista
É este script que voce mandou? Ou é outro? Se for outro, voce poderia mandar o outro?
Pokedlg- ProgramadorMaster
- PONTOS : 2336
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: Problema mudar de sprite sempre que seja adicionado um novo sprite a lista
O problema esta neste script. O outro script simplesmente guarda na listaItems do player a sequencia de imagens com a tag sempre que é arrastado uma nova imagem para o inventário não faz mais nada. Este que enviei no inicio é o Principal que faz o robo movimentar se e rodar.Pokedlg escreveu:É este script que voce mandou? Ou é outro? Se for outro, voce poderia mandar o outro?
Xremix30- Membro
- PONTOS : 2355
REPUTAÇÃO : 3
Re: Problema mudar de sprite sempre que seja adicionado um novo sprite a lista
Ok, mas voce tem certeza que nao da pra fazer o sprite obedecer a sequencia com aquele script?
Pokedlg- ProgramadorMaster
- PONTOS : 2336
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: Problema mudar de sprite sempre que seja adicionado um novo sprite a lista
Não sei eu penso que não.Pokedlg escreveu:Ok, mas voce tem certeza que nao da pra fazer o sprite obedecer a sequencia com aquele script?
O outro script é este:
que armazena na lista as imagens
- Código:
public class DropSlot : MonoBehaviour, IDropHandler {
//declaração da classe em modo publico
public Player player;
//Força a declaração do metodo privado do objecto pai
[SerializeField] private GameObject parent;
//declaração do objecto item em modo privado
private GameObject item;
// Use this for initialization
void start(){
player = GameObject.FindGameObjectWithTag("Player").GetComponent<Player> ();
}
//função que adicona o item ao inventario que recebe as instruções
public void OnDrop(PointerEventData eventData){
int count = 1;
foreach(Transform subChild in parent.transform){
if (!item && subChild != null && subChild.childCount < 1) {
item = DragHandeler.itemDragging;
item.transform.SetParent (transform);
item.transform.position = transform.position;
player.itemsList.Add (item.gameObject);
}else if(subChild.childCount >= 1 && item) {
DestroyObject(item.gameObject);
player.itemsList.Remove (item.gameObject);
}
}
}
// Update is called once per frame
void Update () {
if (item != null && item.transform.parent != transform) {
item = null;
}
}
}
Xremix30- Membro
- PONTOS : 2355
REPUTAÇÃO : 3
Re: Problema mudar de sprite sempre que seja adicionado um novo sprite a lista
Vou ver oque consigo fazer
Pokedlg- ProgramadorMaster
- PONTOS : 2336
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: Problema mudar de sprite sempre que seja adicionado um novo sprite a lista
Obrigado. PokedlgPokedlg escreveu:Vou ver oque consigo fazer
Xremix30- Membro
- PONTOS : 2355
REPUTAÇÃO : 3
Re: Problema mudar de sprite sempre que seja adicionado um novo sprite a lista
Denada . O negócio é complicado, to fazendo diversos teste e só voltei aqui para avisar que to quase conseguindo resolver
Pokedlg- ProgramadorMaster
- PONTOS : 2336
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: Problema mudar de sprite sempre que seja adicionado um novo sprite a lista
Muito Obrigado mais uma vez. PokedlgPokedlg escreveu:Denada . O negócio é complicado, to fazendo diversos teste e só voltei aqui para avisar que to quase conseguindo resolver
Xremix30- Membro
- PONTOS : 2355
REPUTAÇÃO : 3
Re: Problema mudar de sprite sempre que seja adicionado um novo sprite a lista
Bom, depois de horas de tentar resolver isso, eu finalmente consegui chegar a um resultado. Porém eu nao sei se irá funcionar, eu fiz o teste e funcionou perfeitamente, porém eu percebi no seu script que algumas voids e Rotina que parecem que são declaradas, mas nunca são chamadas, uma delas é o startMoviments, mas se a movimentação está funcionando acredito que voce deve chamar ela em algum outro script. Emfim eu fiz varias tentativas e no final descobri na verdade que era algo facil, era só chamar o foreach dentro do update para sempre atualizar o sprite, com uma booleana para o sprite mudar e associar as posições da movimentação.
Troque aquele primeiro script por esse e tente se isso irá funcionar, pois nao utilizei seu script para o teste eu criei um baseado no seu e depois que consegui resolver o problema, eu tentei modificar o seu para que fique com o mesmo resultado:
Voce verá que eu criei um novo Vector3 o currentPos, que ele sempre atualizará constantemente a posição atual do seu player, e quando o targetPos muda, e a posição atual (currentPos) for diferente do trajeto, o isMoving será true e quando o isMoving é true, o readyToChangeSprite é false e quando o readyToChangeSprite, ele nao poderá mudar de sprite, até que a posição atual corresponda ao trajeto e quando isso acontecer, isMoving será false e readyToChangeSprite será true, o que consequentemente, irá chamar o foreach novamente atualizando assim para o ultimo sprite .
E também troquei o Vector3.Lerp pelo Vector3.MoveTowards (Ele é mais preciso)
Como eu disse, talvez nao funcione, vai que eu esqueci algo, se nao funcionar iremos tentar resolver de novo. Mas teoricamente era para funcionar.
Troque aquele primeiro script por esse e tente se isso irá funcionar, pois nao utilizei seu script para o teste eu criei um baseado no seu e depois que consegui resolver o problema, eu tentei modificar o seu para que fique com o mesmo resultado:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class PlayerMoviment : MonoBehaviour {
public bool isMoving, isSprite;
public bool readyToChangeSprite = true;
public Vector3 origPos, targetPos, currentPos;
private float timeToMove = 0.2f;
// Tempo entre cada chamada de um movimento
public float respawnTime = 3.0f;
public Player player;
public List<Vector3> movimentsList;
public Sprite ImagePlayerRotateUp;
public Sprite ImagePlayerRotateDown;
public Sprite ImagePlayerRotateLeft;
public Sprite ImagePlayerRotateRight;
private SpriteRenderer spritePlayerRenderer;
int counter, countMoviments;
// Use this for initialization
void Start () {
countMoviments = 0;
player = GameObject.Find("Player").GetComponent<Player> ();
//addMovimentsList();
}
void Update()
{
currentPos = transform.position;
if(currentPos != targetPos)
{
isMoving = true;
readyToChangeSprite = false;
}
else if (currentPos == targetPos)
{
isMoving = false;
readyToChangeSprite = true;
foreach (GameObject rotateSprite in player.itemList)
{
if (rotateSprite.name.Contains ("rotateUp")) {changeSprite(ImagePlayerRotateUp);}
if (rotateSprite.name.Contains ("rotateDown")) {changeSprite(ImagePlayerRotateDown);}
if (rotateSprite.name.Contains ("rotateLeft")) {changeSprite(ImagePlayerRotateLeft);}
if (rotateSprite.name.Contains ("rotateRight")) {changeSprite(ImagePlayerRotateRight);}
}
}
}
// Método a chamar na opção do botão Play
public void startMoviments()
{
//Primeira chamada do moveWave
StartCoroutine(moveWave());
//rotateSpritePlayer ();
}
// Recria os varios movimentos na lista
IEnumerator moveWave()
{
//rotateSpriteList.Reverse (0, rotateSpriteList.Count);
// Enquanto a lista (lista) tiver movimentos ...");
while (counter < movimentsList.Count)
{
yield return new WaitForSeconds(respawnTime);
// Faz um movimento do jogador
// Chama a sua função (ex: movePlayer()) para o movimento
StartCoroutine (MovePlayer (movimentsList[countMoviments]));
movimentsList.Remove (movimentsList [countMoviments]);
counter++;
}
}
public void rotateSpritePlayer(){
foreach(GameObject rotateSprite in player.itemsList){
if (rotateSprite.name.Contains ("rotateUp")) {
changeSprite(ImagePlayerRotateUp);
movimentsList.Add (Vector3.zero);
}
if (rotateSprite.name.Contains ("rotateDown")) {
changeSprite(ImagePlayerRotateDown);
movimentsList.Add (Vector3.zero);
}
if (rotateSprite.name.Contains ("rotateLeft")) {
changeSprite(ImagePlayerRotateLeft);
movimentsList.Add (Vector3.zero);
}
if (rotateSprite.name.Contains ("rotateRight")) {
changeSprite(ImagePlayerRotateRight);
movimentsList.Add (Vector3.zero);
}
}
}
public void movimentsPlayer(){
foreach (GameObject moviment in player.itemsList) {
if (moviment.name.Contains ("moveUp")) {
movimentsList.Add (Vector3.up);
} else if (moviment.name.Contains ("moveDown")) {
movimentsList.Add (Vector3.down);
} else if (moviment.name.Contains ("moveLeft")) {
movimentsList.Add (Vector3.left);
} else if (moviment.name.Contains ("moveRight")) {
movimentsList.Add (Vector3.right);
}
//countMoviments++;
}
}
public void handleCatchItems(){
foreach(GameObject handle in player.itemsList){
if (handle.name.Contains ("handleCatch")) {
movimentsList.Add (Vector3.zero);
Debug.Log ("Hello");
}
}
}
public IEnumerator MovePlayer(Vector3 direction) // função que enumera as direções do teclado
{
isMoving = true;
float elapsedTime = 0;
origPos = transform.position;
targetPos = origPos + direction;
while (elapsedTime < timeToMove) {
transform.position = Vector3.MoveTowards (origPos, targetPos, (elapsedTime / timeToMove));//modifica as posições interpolando linearmente entre dois vectores
elapsedTime += Time.deltaTime;
yield return null;
}
transform.position = targetPos;
isMoving = false;
if (FuelBar.Fuel > 0) {
FuelBar.Fuel -= 1.0f;
transform.position = targetPos;
} else {
SceneManager.LoadScene (1);
}
}
public void changeSprite(Sprite sprite){
spritePlayerRenderer = GetComponent<SpriteRenderer> ();
if (readyToChangeSprite == true)
{
spritePlayerRenderer.sprite = sprite ;
}
}
Voce verá que eu criei um novo Vector3 o currentPos, que ele sempre atualizará constantemente a posição atual do seu player, e quando o targetPos muda, e a posição atual (currentPos) for diferente do trajeto, o isMoving será true e quando o isMoving é true, o readyToChangeSprite é false e quando o readyToChangeSprite, ele nao poderá mudar de sprite, até que a posição atual corresponda ao trajeto e quando isso acontecer, isMoving será false e readyToChangeSprite será true, o que consequentemente, irá chamar o foreach novamente atualizando assim para o ultimo sprite .
E também troquei o Vector3.Lerp pelo Vector3.MoveTowards (Ele é mais preciso)
Como eu disse, talvez nao funcione, vai que eu esqueci algo, se nao funcionar iremos tentar resolver de novo. Mas teoricamente era para funcionar.
Pokedlg- ProgramadorMaster
- PONTOS : 2336
REPUTAÇÃO : 198
Áreas de atuação : Iniciante: ShaderLab, Blender, Java, C++, ASP.NET.
Intermediário: C#.NET, Unity, Shader Graph.
Respeito as regras :
Pokedlg- ProgramadorMaster
- PONTOS : 2336
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: Problema mudar de sprite sempre que seja adicionado um novo sprite a lista
Antes de mais quero lhe agrade de me estar a ajudar. Ainda não funcionou ainda mostra o último sprite será que é por causa do script que tenho o botão e quando clico. Eu lá tenho pela seguinte ordem a chamar as funcoes:Pokedlg escreveu:Funcionou?
startMoviments
MovimentsPlayer
rotateSpritePlayer
Xremix30- Membro
- PONTOS : 2355
REPUTAÇÃO : 3
Re: Problema mudar de sprite sempre que seja adicionado um novo sprite a lista
Quando voce clica o botao voce chama essas tres voids?
Pokedlg- ProgramadorMaster
- PONTOS : 2336
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: Problema mudar de sprite sempre que seja adicionado um novo sprite a lista
Sim.Pokedlg escreveu:Quando voce clica o botao voce chama essas tres voids?
Xremix30- Membro
- PONTOS : 2355
REPUTAÇÃO : 3
Re: Problema mudar de sprite sempre que seja adicionado um novo sprite a lista
Elas estão dentro da função onclick() { playerMoviment.startMovinents()Xremix30 escreveu:Sim.Pokedlg escreveu:Quando voce clica o botao voce chama essas tres voids?
playerMoviment.movinentsPlayer()
player Moviment.rotateSpritePlayer()}
Quando clico em play ele faz o qie está dentro dessas funcoes
Xremix30- Membro
- PONTOS : 2355
REPUTAÇÃO : 3
Re: Problema mudar de sprite sempre que seja adicionado um novo sprite a lista
Acho que descobri, como eu tinha dito, como eu nao usei seu script para fazer o teste, eu acabei de perceber que esqueci duas linhas de código. Bom veja se isso agora da certo:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class PlayerMoviment : MonoBehaviour {
public bool isMoving, isSprite;
public bool readyToChangeSprite = true;
public Vector3 origPos, targetPos, currentPos;
private float timeToMove = 0.2f;
// Tempo entre cada chamada de um movimento
public float respawnTime = 3.0f;
public Player player;
public List<Vector3> movimentsList;
public Sprite ImagePlayerRotateUp;
public Sprite ImagePlayerRotateDown;
public Sprite ImagePlayerRotateLeft;
public Sprite ImagePlayerRotateRight;
private SpriteRenderer spritePlayerRenderer;
int counter, countMoviments;
// Use this for initialization
void Start () {
countMoviments = 0;
player = GameObject.Find("Player").GetComponent<Player> ();
//addMovimentsList();
}
void Update()
{
currentPos = transform.position;
if(currentPos != targetPos)
{
readyToChangeSprite = false;
}
else if (currentPos == targetPos)
{
isMoving = false;
readyToChangeSprite = true;
foreach (GameObject rotateSprite in player.itemList)
{
if (rotateSprite.name.Contains ("rotateUp")) {changeSprite(ImagePlayerRotateUp);}
if (rotateSprite.name.Contains ("rotateDown")) {changeSprite(ImagePlayerRotateDown);}
if (rotateSprite.name.Contains ("rotateLeft")) {changeSprite(ImagePlayerRotateLeft);}
if (rotateSprite.name.Contains ("rotateRight")) {changeSprite(ImagePlayerRotateRight);}
}
}
}
// Método a chamar na opção do botão Play
public void startMoviments()
{
//Primeira chamada do moveWave
StartCoroutine(moveWave());
//rotateSpritePlayer ();
}
// Recria os varios movimentos na lista
IEnumerator moveWave()
{
http://rotateSpriteList.Reverse (0, rotateSpriteList.Count);
// Enquanto a lista (lista) tiver movimentos ...");
while (counter < movimentsList.Count)
{
yield return new WaitForSeconds(respawnTime);
// Faz um movimento do jogador
// Chama a sua função (ex: movePlayer()) para o movimento
StartCoroutine (MovePlayer (movimentsList[countMoviments]));
movimentsList.Remove (movimentsList [countMoviments]);
counter++;
}
}
public void rotateSpritePlayer(){
foreach(GameObject rotateSprite in player.itemsList){
if (rotateSprite.name.Contains ("rotateUp")) {
changeSprite(ImagePlayerRotateUp);
movimentsList.Add (Vector3.zero);
}
if (rotateSprite.name.Contains ("rotateDown")) {
changeSprite(ImagePlayerRotateDown);
movimentsList.Add (Vector3.zero);
}
if (rotateSprite.name.Contains ("rotateLeft")) {
changeSprite(ImagePlayerRotateLeft);
movimentsList.Add (Vector3.zero);
}
if (rotateSprite.name.Contains ("rotateRight")) {
changeSprite(ImagePlayerRotateRight);
movimentsList.Add (Vector3.zero);
}
}
}
public void movimentsPlayer(){
foreach (GameObject moviment in player.itemsList) {
if (moviment.name.Contains ("moveUp")) {
isMoving = true;
if(isMoving == true){readyToChangeSprite = false;}
movimentsList.Add (Vector3.up);
} else if (moviment.name.Contains ("moveDown")) {
isMoving = true;
if(isMoving == true){readyToChangeSprite = false;}
movimentsList.Add (Vector3.down);
} else if (moviment.name.Contains ("moveLeft")) {
isMoving = true;
if(isMoving == true){readyToChangeSprite = false;}
movimentsList.Add (Vector3.left);
} else if (moviment.name.Contains ("moveRight")) {
isMoving = true;
if(isMoving == true){readyToChangeSprite = false;}
movimentsList.Add (Vector3.right);
}
//countMoviments++;
}
}
public void handleCatchItems(){
foreach(GameObject handle in player.itemsList){
if (handle.name.Contains ("handleCatch")) {
movimentsList.Add (Vector3.zero);
Debug.Log ("Hello");
}
}
}
public IEnumerator MovePlayer(Vector3 direction) // função que enumera as direções do teclado
{
isMoving = true;
float elapsedTime = 0;
origPos = transform.position;
targetPos = origPos + direction;
while (elapsedTime < timeToMove) {
transform.position = Vector3.Lerp (origPos, targetPos, (elapsedTime / timeToMove));//modifica as posições interpolando linearmente entre dois vectores
elapsedTime += Time.deltaTime;
yield return null;
}
transform.position = targetPos;
isMoving = false;
if (FuelBar.Fuel > 0) {
FuelBar.Fuel -= 1.0f;
transform.position = targetPos;
} else {
SceneManager.LoadScene (1);
}
}
public void changeSprite(Sprite sprite){
spritePlayerRenderer = GetComponent<SpriteRenderer> ();
if (readyToChangeSprite == true)
{
spritePlayerRenderer.sprite = sprite ;
}
}
Pokedlg- ProgramadorMaster
- PONTOS : 2336
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: Problema mudar de sprite sempre que seja adicionado um novo sprite a lista
Continua a mostrar só a ultima sprite por ex: se meter ele a rodar para direita + seta da direita 4x + rodar para baixo + seta para baixo ele muda logo no inicio para o ultimo sprite que inseriPokedlg escreveu:Acho que descobri, como eu tinha dito, como eu nao usei seu script para fazer o teste, eu acabei de perceber que esqueci duas linhas de código. Bom veja se isso agora da certo:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class PlayerMoviment : MonoBehaviour {
public bool isMoving, isSprite;
public bool readyToChangeSprite = true;
public Vector3 origPos, targetPos, currentPos;
private float timeToMove = 0.2f;
// Tempo entre cada chamada de um movimento
public float respawnTime = 3.0f;
public Player player;
public List<Vector3> movimentsList;
public Sprite ImagePlayerRotateUp;
public Sprite ImagePlayerRotateDown;
public Sprite ImagePlayerRotateLeft;
public Sprite ImagePlayerRotateRight;
private SpriteRenderer spritePlayerRenderer;
int counter, countMoviments;
// Use this for initialization
void Start () {
countMoviments = 0;
player = GameObject.Find("Player").GetComponent<Player> ();
//addMovimentsList();
}
void Update()
{
currentPos = transform.position;
if(currentPos != targetPos)
{
readyToChangeSprite = false;
}
else if (currentPos == targetPos)
{
isMoving = false;
readyToChangeSprite = true;
foreach (GameObject rotateSprite in player.itemList)
{
if (rotateSprite.name.Contains ("rotateUp")) {changeSprite(ImagePlayerRotateUp);}
if (rotateSprite.name.Contains ("rotateDown")) {changeSprite(ImagePlayerRotateDown);}
if (rotateSprite.name.Contains ("rotateLeft")) {changeSprite(ImagePlayerRotateLeft);}
if (rotateSprite.name.Contains ("rotateRight")) {changeSprite(ImagePlayerRotateRight);}
}
}
}
// Método a chamar na opção do botão Play
public void startMoviments()
{
//Primeira chamada do moveWave
StartCoroutine(moveWave());
//rotateSpritePlayer ();
}
// Recria os varios movimentos na lista
IEnumerator moveWave()
{
//rotateSpriteList.Reverse (0, rotateSpriteList.Count);
// Enquanto a lista (lista) tiver movimentos ...");
while (counter < movimentsList.Count)
{
yield return new WaitForSeconds(respawnTime);
// Faz um movimento do jogador
// Chama a sua função (ex: movePlayer()) para o movimento
StartCoroutine (MovePlayer (movimentsList[countMoviments]));
movimentsList.Remove (movimentsList [countMoviments]);
counter++;
}
}
public void rotateSpritePlayer(){
foreach(GameObject rotateSprite in player.itemsList){
if (rotateSprite.name.Contains ("rotateUp")) {
changeSprite(ImagePlayerRotateUp);
movimentsList.Add (Vector3.zero);
}
if (rotateSprite.name.Contains ("rotateDown")) {
changeSprite(ImagePlayerRotateDown);
movimentsList.Add (Vector3.zero);
}
if (rotateSprite.name.Contains ("rotateLeft")) {
changeSprite(ImagePlayerRotateLeft);
movimentsList.Add (Vector3.zero);
}
if (rotateSprite.name.Contains ("rotateRight")) {
changeSprite(ImagePlayerRotateRight);
movimentsList.Add (Vector3.zero);
}
}
}
public void movimentsPlayer(){
foreach (GameObject moviment in player.itemsList) {
if (moviment.name.Contains ("moveUp")) {
isMoving = true;
if(isMoving == true){readyToChangeSprite = false;}
movimentsList.Add (Vector3.up);
} else if (moviment.name.Contains ("moveDown")) {
isMoving = true;
if(isMoving == true){readyToChangeSprite = false;}
movimentsList.Add (Vector3.down);
} else if (moviment.name.Contains ("moveLeft")) {
isMoving = true;
if(isMoving == true){readyToChangeSprite = false;}
movimentsList.Add (Vector3.left);
} else if (moviment.name.Contains ("moveRight")) {
isMoving = true;
if(isMoving == true){readyToChangeSprite = false;}
movimentsList.Add (Vector3.right);
}
//countMoviments++;
}
}
public void handleCatchItems(){
foreach(GameObject handle in player.itemsList){
if (handle.name.Contains ("handleCatch")) {
movimentsList.Add (Vector3.zero);
Debug.Log ("Hello");
}
}
}
public IEnumerator MovePlayer(Vector3 direction) // função que enumera as direções do teclado
{
isMoving = true;
float elapsedTime = 0;
origPos = transform.position;
targetPos = origPos + direction;
while (elapsedTime < timeToMove) {
transform.position = Vector3.Lerp (origPos, targetPos, (elapsedTime / timeToMove));//modifica as posições interpolando linearmente entre dois vectores
elapsedTime += Time.deltaTime;
yield return null;
}
transform.position = targetPos;
isMoving = false;
if (FuelBar.Fuel > 0) {
FuelBar.Fuel -= 1.0f;
transform.position = targetPos;
} else {
SceneManager.LoadScene (1);
}
}
public void changeSprite(Sprite sprite){
spritePlayerRenderer = GetComponent<SpriteRenderer> ();
if (readyToChangeSprite == true)
{
spritePlayerRenderer.sprite = sprite ;
}
}
Xremix30- Membro
- PONTOS : 2355
REPUTAÇÃO : 3
Re: Problema mudar de sprite sempre que seja adicionado um novo sprite a lista
Ele está a mudar para o ultimo sprite sempre que anda a primeira vez para a frenteXremix30 escreveu:Continua a mostrar só a ultima sprite por ex: se meter ele a rodar para direita + seta da direita 4x + rodar para baixo + seta para baixo ele muda logo no inicio para o ultimo sprite que inseriPokedlg escreveu:Acho que descobri, como eu tinha dito, como eu nao usei seu script para fazer o teste, eu acabei de perceber que esqueci duas linhas de código. Bom veja se isso agora da certo:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class PlayerMoviment : MonoBehaviour {
public bool isMoving, isSprite;
public bool readyToChangeSprite = true;
public Vector3 origPos, targetPos, currentPos;
private float timeToMove = 0.2f;
// Tempo entre cada chamada de um movimento
public float respawnTime = 3.0f;
public Player player;
public List<Vector3> movimentsList;
public Sprite ImagePlayerRotateUp;
public Sprite ImagePlayerRotateDown;
public Sprite ImagePlayerRotateLeft;
public Sprite ImagePlayerRotateRight;
private SpriteRenderer spritePlayerRenderer;
int counter, countMoviments;
// Use this for initialization
void Start () {
countMoviments = 0;
player = GameObject.Find("Player").GetComponent<Player> ();
//addMovimentsList();
}
void Update()
{
currentPos = transform.position;
if(currentPos != targetPos)
{
readyToChangeSprite = false;
}
else if (currentPos == targetPos)
{
isMoving = false;
readyToChangeSprite = true;
foreach (GameObject rotateSprite in player.itemList)
{
if (rotateSprite.name.Contains ("rotateUp")) {changeSprite(ImagePlayerRotateUp);}
if (rotateSprite.name.Contains ("rotateDown")) {changeSprite(ImagePlayerRotateDown);}
if (rotateSprite.name.Contains ("rotateLeft")) {changeSprite(ImagePlayerRotateLeft);}
if (rotateSprite.name.Contains ("rotateRight")) {changeSprite(ImagePlayerRotateRight);}
}
}
}
// Método a chamar na opção do botão Play
public void startMoviments()
{
//Primeira chamada do moveWave
StartCoroutine(moveWave());
//rotateSpritePlayer ();
}
// Recria os varios movimentos na lista
IEnumerator moveWave()
{
//rotateSpriteList.Reverse (0, rotateSpriteList.Count);
// Enquanto a lista (lista) tiver movimentos ...");
while (counter < movimentsList.Count)
{
yield return new WaitForSeconds(respawnTime);
// Faz um movimento do jogador
// Chama a sua função (ex: movePlayer()) para o movimento
StartCoroutine (MovePlayer (movimentsList[countMoviments]));
movimentsList.Remove (movimentsList [countMoviments]);
counter++;
}
}
public void rotateSpritePlayer(){
foreach(GameObject rotateSprite in player.itemsList){
if (rotateSprite.name.Contains ("rotateUp")) {
changeSprite(ImagePlayerRotateUp);
movimentsList.Add (Vector3.zero);
}
if (rotateSprite.name.Contains ("rotateDown")) {
changeSprite(ImagePlayerRotateDown);
movimentsList.Add (Vector3.zero);
}
if (rotateSprite.name.Contains ("rotateLeft")) {
changeSprite(ImagePlayerRotateLeft);
movimentsList.Add (Vector3.zero);
}
if (rotateSprite.name.Contains ("rotateRight")) {
changeSprite(ImagePlayerRotateRight);
movimentsList.Add (Vector3.zero);
}
}
}
public void movimentsPlayer(){
foreach (GameObject moviment in player.itemsList) {
if (moviment.name.Contains ("moveUp")) {
isMoving = true;
if(isMoving == true){readyToChangeSprite = false;}
movimentsList.Add (Vector3.up);
} else if (moviment.name.Contains ("moveDown")) {
isMoving = true;
if(isMoving == true){readyToChangeSprite = false;}
movimentsList.Add (Vector3.down);
} else if (moviment.name.Contains ("moveLeft")) {
isMoving = true;
if(isMoving == true){readyToChangeSprite = false;}
movimentsList.Add (Vector3.left);
} else if (moviment.name.Contains ("moveRight")) {
isMoving = true;
if(isMoving == true){readyToChangeSprite = false;}
movimentsList.Add (Vector3.right);
}
//countMoviments++;
}
}
public void handleCatchItems(){
foreach(GameObject handle in player.itemsList){
if (handle.name.Contains ("handleCatch")) {
movimentsList.Add (Vector3.zero);
Debug.Log ("Hello");
}
}
}
public IEnumerator MovePlayer(Vector3 direction) // função que enumera as direções do teclado
{
isMoving = true;
float elapsedTime = 0;
origPos = transform.position;
targetPos = origPos + direction;
while (elapsedTime < timeToMove) {
transform.position = Vector3.Lerp (origPos, targetPos, (elapsedTime / timeToMove));//modifica as posições interpolando linearmente entre dois vectores
elapsedTime += Time.deltaTime;
yield return null;
}
transform.position = targetPos;
isMoving = false;
if (FuelBar.Fuel > 0) {
FuelBar.Fuel -= 1.0f;
transform.position = targetPos;
} else {
SceneManager.LoadScene (1);
}
}
public void changeSprite(Sprite sprite){
spritePlayerRenderer = GetComponent<SpriteRenderer> ();
if (readyToChangeSprite == true)
{
spritePlayerRenderer.sprite = sprite ;
}
}
Xremix30- Membro
- PONTOS : 2355
REPUTAÇÃO : 3
Re: Problema mudar de sprite sempre que seja adicionado um novo sprite a lista
Desculpa demorar. Então ele só muda depois de se movimentar uma vez?
Pokedlg- ProgramadorMaster
- PONTOS : 2336
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: Problema mudar de sprite sempre que seja adicionado um novo sprite a lista
Não faz mal. Sim o que eu acho um bocado estranho.Pokedlg escreveu:Desculpa demorar. Então ele só muda depois de se movimentar uma vez?
Xremix30- Membro
- PONTOS : 2355
REPUTAÇÃO : 3
Re: Problema mudar de sprite sempre que seja adicionado um novo sprite a lista
Pelo menos ja conseguimos fazer ele respeitar uma sequencia de movimento, acredito que isso aconteça por causa que quando ele termina uma movimentação currentPos se torna igual a targetPos, acredito que teremos que somar todas as direções que possui na lista, e definir o resultado como trajeto final. Acho que isso daria certo.
Pokedlg- ProgramadorMaster
- PONTOS : 2336
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: Problema mudar de sprite sempre que seja adicionado um novo sprite a lista
Bom irei tentar alguns testes e ja volto para dizer se desse jeito irá funcionar.
Pokedlg- ProgramadorMaster
- PONTOS : 2336
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: Problema mudar de sprite sempre que seja adicionado um novo sprite a lista
Tente fazer o teste agora:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class PlayerMoviment : MonoBehaviour {
public bool isMoving, isSprite;
public bool readyToChangeSprite = true;
public Vector3 origPos, targetPos, currentPos, finalTarget;
private float timeToMove = 0.2f;
// Tempo entre cada chamada de um movimento
public float respawnTime = 3.0f;
public Player player;
public List<Vector3> movimentsList;
public Sprite ImagePlayerRotateUp;
public Sprite ImagePlayerRotateDown;
public Sprite ImagePlayerRotateLeft;
public Sprite ImagePlayerRotateRight;
private SpriteRenderer spritePlayerRenderer;
int counter, countMoviments;
// Use this for initialization
void Start () {
countMoviments = 0;
player = GameObject.Find("Player").GetComponent<Player> ();
//addMovimentsList();
}
void Update()
{
currentPos = transform.position;
if(currentPos != finalTarget)
{
readyToChangeSprite = false;
}
else if (currentPos == finalTarget)
{
isMoving = false;
readyToChangeSprite = true;
foreach (GameObject rotateSprite in player.itemList)
{
if (rotateSprite.name.Contains ("rotateUp")) {changeSprite(ImagePlayerRotateUp);}
if (rotateSprite.name.Contains ("rotateDown")) {changeSprite(ImagePlayerRotateDown);}
if (rotateSprite.name.Contains ("rotateLeft")) {changeSprite(ImagePlayerRotateLeft);}
if (rotateSprite.name.Contains ("rotateRight")) {changeSprite(ImagePlayerRotateRight);}
}
}
}
// Método a chamar na opção do botão Play
public void startMoviments()
{
//Primeira chamada do moveWave
StartCoroutine(moveWave());
//rotateSpritePlayer ();
}
// Recria os varios movimentos na lista
IEnumerator moveWave()
{
http://rotateSpriteList.Reverse (0, rotateSpriteList.Count);
// Enquanto a lista (lista) tiver movimentos ...");
while (counter < movimentsList.Count)
{
yield return new WaitForSeconds(respawnTime);
// Faz um movimento do jogador
// Chama a sua função (ex: movePlayer()) para o movimento
StartCoroutine (MovePlayer (movimentsList[countMoviments]));
movimentsList.Remove (movimentsList [countMoviments]);
counter++;
}
}
public void rotateSpritePlayer(){
foreach(GameObject rotateSprite in player.itemsList){
if (rotateSprite.name.Contains ("rotateUp")) {
changeSprite(ImagePlayerRotateUp);
movimentsList.Add (Vector3.zero);
}
if (rotateSprite.name.Contains ("rotateDown")) {
changeSprite(ImagePlayerRotateDown);
movimentsList.Add (Vector3.zero);
}
if (rotateSprite.name.Contains ("rotateLeft")) {
changeSprite(ImagePlayerRotateLeft);
movimentsList.Add (Vector3.zero);
}
if (rotateSprite.name.Contains ("rotateRight")) {
changeSprite(ImagePlayerRotateRight);
movimentsList.Add (Vector3.zero);
}
}
}
public void movimentsPlayer(){
foreach (GameObject moviment in player.itemsList) {
if (moviment.name.Contains ("moveUp")) {
isMoving = true;
if(isMoving == true){readyToChangeSprite = false;}
movimentsList.Add (Vector3.up);
finalTarget += Vector3.up;
} else if (moviment.name.Contains ("moveDown")) {
isMoving = true;
if(isMoving == true){readyToChangeSprite = false;}
movimentsList.Add (Vector3.down);
finalTarget += Vector3.down;
} else if (moviment.name.Contains ("moveLeft")) {
isMoving = true;
if(isMoving == true){readyToChangeSprite = false;}
movimentsList.Add (Vector3.left);
finalTarget += Vector3.left;
} else if (moviment.name.Contains ("moveRight")) {
isMoving = true;
if(isMoving == true){readyToChangeSprite = false;}
movimentsList.Add (Vector3.right);
finalTarget += Vector3.right;
}
//countMoviments++;
}
}
public void handleCatchItems(){
foreach(GameObject handle in player.itemsList){
if (handle.name.Contains ("handleCatch")) {
movimentsList.Add (Vector3.zero);
Debug.Log ("Hello");
}
}
}
public IEnumerator MovePlayer(Vector3 direction) // função que enumera as direções do teclado
{
isMoving = true;
float elapsedTime = 0;
origPos = transform.position;
targetPos = origPos + direction;
while (elapsedTime < timeToMove) {
transform.position = Vector3.Lerp (origPos, targetPos, (elapsedTime / timeToMove));//modifica as posições interpolando linearmente entre dois vectores
elapsedTime += Time.deltaTime;
yield return null;
}
transform.position = targetPos;
isMoving = false;
if (FuelBar.Fuel > 0) {
FuelBar.Fuel -= 1.0f;
transform.position = targetPos;
} else {
SceneManager.LoadScene (1);
}
}
public void changeSprite(Sprite sprite){
spritePlayerRenderer = GetComponent<SpriteRenderer> ();
if (readyToChangeSprite == true)
{
spritePlayerRenderer.sprite = sprite ;
}
}
Pokedlg- ProgramadorMaster
- PONTOS : 2336
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: Problema mudar de sprite sempre que seja adicionado um novo sprite a lista
Provavelmente isso nao irá funcionar precisamente, mas ele irá esperar todas movimentações para aí sim poder fazer a alteração do sprite.
Pokedlg- ProgramadorMaster
- PONTOS : 2336
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: Problema mudar de sprite sempre que seja adicionado um novo sprite a lista
Já fiz o teste. As movimentações estão corretas mas não muda de sprite vai sempre com o mesmo sprite que começo. O jogo até ao fimPokedlg escreveu:Provavelmente isso nao irá funcionar precisamente, mas ele irá esperar todas movimentações para aí sim poder fazer a alteração do sprite.
Xremix30- Membro
- PONTOS : 2355
REPUTAÇÃO : 3
Pokedlg- ProgramadorMaster
- PONTOS : 2336
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: Problema mudar de sprite sempre que seja adicionado um novo sprite a lista
Voce poderia mandar um print do finalTarget quando terminar a movimentação?
Pokedlg- ProgramadorMaster
- PONTOS : 2336
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: Problema mudar de sprite sempre que seja adicionado um novo sprite a lista
O script onde faço a ligaçao ao botao é este:Pokedlg escreveu:Que estranho
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class PlayInstructions : MonoBehaviour {
//Declaração do botão em modo publico
public Button btnPlay;
//Declaração da classe em modo publico
public PlayerMoviment playerMoviment;
//Declaração da classe em modo privado
private Player player;
// Use this for initialization
void Start () {
btnPlay.interactable = true;
player = GameObject.FindGameObjectWithTag("Player").GetComponent<Player> ();
//playerMoviment = GetComponent<PlayerMoviment> ();
btnPlay = GetComponent<Button> ();
btnPlay.onClick.AddListener (MovimentOnClick);
}
//função que inicia os movimentos ao ser clicado no botão play
public void MovimentOnClick ()
{
playerMoviment.startMoviments ();
playerMoviment.movimentsPlayer ();
playerMoviment.rotateSpritePlayer ();
//playerMoviment.handleCatchItems ();
// btnPlay.interactable = true;
}
}
imagem da posição final no jogo do robo
Xremix30- Membro
- PONTOS : 2355
REPUTAÇÃO : 3
Pokedlg- ProgramadorMaster
- PONTOS : 2336
REPUTAÇÃO : 198
Áreas de atuação : Iniciante: ShaderLab, Blender, Java, C++, ASP.NET.
Intermediário: C#.NET, Unity, Shader Graph.
Respeito as regras :
Página 1 de 2 • 1, 2
Tópicos semelhantes
» Problema ao mudar sprite entre objetos por conta do uso de joystick
» Como mudar a cor de um sprite?
» Como mudar o sprite?
» [DÚVIDA] [2D] ALTERAR SPRITE SEM PRECISAR IMPORTAR DE NOVO
» Como mudar animação do sprite automaticamente?
» Como mudar a cor de um sprite?
» Como mudar o sprite?
» [DÚVIDA] [2D] ALTERAR SPRITE SEM PRECISAR IMPORTAR DE NOVO
» Como mudar animação do sprite automaticamente?
Página 1 de 2
Permissões neste sub-fórum
Não podes responder a tópicos