Clicar em um Sprite e realizar uma ação
4 participantes
Página 1 de 1
Clicar em um Sprite e realizar uma ação
Oi...
Sei que posso clicar em um gameObject primitivo como cubo, plano ou outro na tela e fazer uma ação no próprio ou em outro...
Mas, não consigo fazer com Sprite 2D ou 3D... sendo assim, pergunto...
É possível fazer uma ação através de um script ao se clicar em um sprite?
Att
Sei que posso clicar em um gameObject primitivo como cubo, plano ou outro na tela e fazer uma ação no próprio ou em outro...
Mas, não consigo fazer com Sprite 2D ou 3D... sendo assim, pergunto...
É possível fazer uma ação através de um script ao se clicar em um sprite?
Att
joffersoju- Avançado
- PONTOS : 2317
REPUTAÇÃO : 4
Respeito as regras :
Re: Clicar em um Sprite e realizar uma ação
Sim, basta usar a void OnMouseDown
https://unity3d.com/pt/learn/tutorials/topics/scripting/onmousedown
https://unity3d.com/pt/learn/tutorials/topics/scripting/onmousedown
Re: Clicar em um Sprite e realizar uma ação
Valew...
Não funfava antes pq eu precisava pôr rigidbody e boxcollider...
Deu certinho!!!
Não funfava antes pq eu precisava pôr rigidbody e boxcollider...
Deu certinho!!!
joffersoju- Avançado
- PONTOS : 2317
REPUTAÇÃO : 4
Respeito as regras :
Re: Clicar em um Sprite e realizar uma ação
oi... depois eu fui ver no joguinho e não deu certo, mas, acho que é só problema no código...
Eu fiz uma gambiarra funcional assim... inseri esse script em um gameObject Plane oculto...
E esse outro script em um Sprite...
Então associo o Sprite ao public gameObject "negro" do Plane... o outro gameObject vazio é indiferente.
O que o joguinho faz é o Sprite se movimentar de um ponto ao outro pre-determinado em x, y e z...
Funciona, mas é uma gambiarra...
Testei o OnMouseDown e funciona no Sprite, mas, ele não vai diretamente para o ponto pré-determinado, e sim, tem que clicar várias vezes sobre o Sprite para que ele ande "quadro a quadro" até chegar lá...
O que eu gostaria é que ao clicar diretamente no Sprite, ele se movimentasse para o ponto pre-determinado em x, y e z... sem a gambiarra do uso do gameObject Plane (primitivo)...
Dá de fazer???
Eu fiz uma gambiarra funcional assim... inseri esse script em um gameObject Plane oculto...
- Código:
using UnityEngine;
public class AtivarObjeto : MonoBehaviour
{
bool mouseDentroDoObjeto;
public GameObject negro, vazio;
void Start()
{
mouseDentroDoObjeto = false;
}
void Update()
{
if (mouseDentroDoObjeto == true)
{
if (Input.GetMouseButtonDown(0))
{
Destroy(this.gameObject);
negro.SetActive(true);
vazio.SetActive(false);
}
}
}
void OnMouseEnter()
{
mouseDentroDoObjeto = true;
}
void OnMouseExit()
{
mouseDentroDoObjeto = false;
}
}
E esse outro script em um Sprite...
- Código:
using UnityEngine;
public class MudarPosicaoObjeto : MonoBehaviour
{
public float x, y, z;
// Update is called once per frame
void Update()
{
transform.position = Vector3.Lerp(transform.position, new Vector3(x, y, z), Time.deltaTime);
}
}
Então associo o Sprite ao public gameObject "negro" do Plane... o outro gameObject vazio é indiferente.
O que o joguinho faz é o Sprite se movimentar de um ponto ao outro pre-determinado em x, y e z...
Funciona, mas é uma gambiarra...
Testei o OnMouseDown e funciona no Sprite, mas, ele não vai diretamente para o ponto pré-determinado, e sim, tem que clicar várias vezes sobre o Sprite para que ele ande "quadro a quadro" até chegar lá...
O que eu gostaria é que ao clicar diretamente no Sprite, ele se movimentasse para o ponto pre-determinado em x, y e z... sem a gambiarra do uso do gameObject Plane (primitivo)...
Dá de fazer???
joffersoju- Avançado
- PONTOS : 2317
REPUTAÇÃO : 4
Respeito as regras :
Re: Clicar em um Sprite e realizar uma ação
joffersoju escreveu:oi... depois eu fui ver no joguinho e não deu certo, mas, acho que é só problema no código...
Eu fiz uma gambiarra funcional assim... inseri esse script em um gameObject Plane oculto...
- Código:
using UnityEngine;
public class AtivarObjeto : MonoBehaviour
{
bool mouseDentroDoObjeto;
public GameObject negro, vazio;
void Start()
{
mouseDentroDoObjeto = false;
}
void Update()
{
if (mouseDentroDoObjeto == true)
{
if (Input.GetMouseButtonDown(0))
{
Destroy(this.gameObject);
negro.SetActive(true);
vazio.SetActive(false);
}
}
}
void OnMouseEnter()
{
mouseDentroDoObjeto = true;
}
void OnMouseExit()
{
mouseDentroDoObjeto = false;
}
}
E esse outro script em um Sprite...
- Código:
using UnityEngine;
public class MudarPosicaoObjeto : MonoBehaviour
{
public float x, y, z;
// Update is called once per frame
void Update()
{
transform.position = Vector3.Lerp(transform.position, new Vector3(x, y, z), Time.deltaTime);
}
}
Então associo o Sprite ao public gameObject "negro" do Plane... o outro gameObject vazio é indiferente.
O que o joguinho faz é o Sprite se movimentar de um ponto ao outro pre-determinado em x, y e z...
Funciona, mas é uma gambiarra...
Testei o OnMouseDown e funciona no Sprite, mas, ele não vai diretamente para o ponto pré-determinado, e sim, tem que clicar várias vezes sobre o Sprite para que ele ande "quadro a quadro" até chegar lá...
O que eu gostaria é que ao clicar diretamente no Sprite, ele se movimentasse para o ponto pre-determinado em x, y e z... sem a gambiarra do uso do gameObject Plane (primitivo)...
Dá de fazer???
--Olha cara eu tentei de varias formas só pra não usar um raycast, e consegui de uma forma--
- Código:
Vector2 velocity = Vector2.zero;
float time = 5.0f;
public float TargetPosition = -9.04f; // Posição até onde vai ir
float distance; //essa variavel vai receber a distancia entre voce e o seu alvo de destino
void Update()
{
distance = Vector2.Distance(transform.position, new Vector2(TargetPosition,0)); //Distancia entre eu e o target final
}
private void OnMouseDown()
{
InvokeRepeating("irateposicao", 0.01f, 0.01f);
}
void irateposicao()
{
transform.position = Vector2.Lerp(transform.position, new Vector2(TargetPosition, 0), Time.deltaTime * time / distance);
}
Quem souber uma outra forma posta ai pra agregar conheçimento
nibirou- MembroAvançado
- PONTOS : 1887
REPUTAÇÃO : 15
Áreas de atuação : C#,C++,produção de audio
Respeito as regras :
Re: Clicar em um Sprite e realizar uma ação
- Código:
RaycastHit2D hit;
public Vector2 posicaoAlvo;
private void Update()
{
if (Input.GetMouseButtonDown(0))
{
Vector2 worldpoint = Camera.main.ScreenToWorldPoint(Input.mousePosition);
hit = Physics2D.Raycast(worldpoint, Vector2.zero);
if (hit.collider != null && hit.collider.CompareTag("COLOQUE A TAG DO OBJETO AQUI"))
{
InvokeRepeating("irateposicao", 0.01f, 0.01f);
}
}
}
void irateposicao()
{
transform.position = Vector2.Lerp(transform.position, posicaoAlvo, Time.deltaTime);
}
//Esse ja é com raycast, acredito eu que seja uma má pratica de programação utilizar o invokerepeating pra isso, pois tem varios motivos e bugs
//Tentei pensar em outra forma de chegar a isso e no momento não consegui algo melhor, se alguem conseguir ou conseguires, gostaria de saber como fez kkk
nibirou- MembroAvançado
- PONTOS : 1887
REPUTAÇÃO : 15
Áreas de atuação : C#,C++,produção de audio
Respeito as regras :
Re: Clicar em um Sprite e realizar uma ação
- Código:
RaycastHit2D hit;
public Vector3 posicaoAlvo; //Posição que o objeto ira quando clicares nele "modificado no inspector"
float time = 0.5f; // Velocidade que vai de um ponto ao outro
public float speed = 2.5f;
Vector3 velocity; // Velocity sendo usada como velocidade atual no smoothdamp
private void Start()
{
posicaoAlvo = new Vector3();
}
private void Update()
{
if (Input.GetMouseButtonDown(0))
{
Vector3 worldpoint = Camera.main.ScreenToWorldPoint(Input.mousePosition);
hit = Physics2D.Raycast(worldpoint, Vector3.zero);
if (hit.collider != null && hit.collider.CompareTag("COLOQUE A TAG DO SEU OBJETO AQUI"))
{
if (transform.position != posicaoAlvo)
{
InvokeRepeating("irateposicao", 0.01f, 0.01f);
}
}
}
if (transform.position == posicaoAlvo)
{
if (IsInvoking("irateposicao"))
{
CancelInvoke();
}
}
}
void irateposicao()
{
transform.position = Vector3.SmoothDamp(transform.position, posicaoAlvo,ref velocity,time,10.0f,speed*Time.deltaTime);
// o 10.0f é apenas a velocidade maxima que ele pode atingir
}
/*
Dentro do update tem um if que pergunta se a função "irateposicao" está sendo invokada, se estiver então é cancelado com o "CancelInvoke()"
Tem que cancelar pois se não cancelar e o objeto for até o destino, se tu tentar arrastar o objeto, ele ficara sempre indo até o ponto
como se fosse um chiclete, ai pra mudar a posição tem que tirar do play e dar play novamente
por isso o CancelInvoke */
Ultimo post meu, esse é a ultima sem bugs, só editar ao teu gosto de como vai querer usar
nibirou- MembroAvançado
- PONTOS : 1887
REPUTAÇÃO : 15
Áreas de atuação : C#,C++,produção de audio
Respeito as regras :
Re: Clicar em um Sprite e realizar uma ação
Olá, eu fiz algo similar com as peças de um quebra-cabeças. Veja que quando a peça não se encaixa, ela volta para seu ponto inicial (um ponto alvo):
O código é simplesmente o abaixo:
O código é simplesmente o abaixo:
- Código:
public class GoToTarget : Monobehaviour {
public Vector3 targetPosition; // insira através do inspector a posição para onde o GameObject deve ir
public float speed; // selecione uma velocidade para o objeto ir até o alvo
private bool canMove;
void OnMouseDown(){
if(!canMove)
canMove = true;
return;
}
void Update(){
if(canMove){
this.transform.position = Vector3.MoveTowards(
transform.position, targetPosition, speed*Time.deltaTime);
CheckPosition();
} else
return;
}
void CheckPosition(){
if(canMove && transform.position == targetPosition){
canMove = false;
Destroy(this.GetComponent<GoToTarget>());
}
}
}
Tópicos semelhantes
» [ AJUDA] Estou com problemas para acessar índice de uma Lista e realizar uma acao
» Clicar no botão
» Problema mudar de sprite sempre que seja adicionado um novo sprite a lista
» Ponteiro do Mouse some ao clicar
» Como criar um cabo e realizar conexões
» Clicar no botão
» Problema mudar de sprite sempre que seja adicionado um novo sprite a lista
» Ponteiro do Mouse some ao clicar
» Como criar um cabo e realizar conexões
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos