[RESOLVIDO] NAO ARRASTAR CAMERA QUANDO O INVENTARIO ESTIVER ABERTO
2 participantes
SchultzGames :: UNITY 3D :: Resolvidos
Página 1 de 1
[RESOLVIDO] NAO ARRASTAR CAMERA QUANDO O INVENTARIO ESTIVER ABERTO
Bom Dia, meu nome é Vinicius e eu tenho uma dúvida..
Estou criando um jogo tipo Fazenda Iddle, e sou novo na programação, estou indo bem ate agora na criação porem me deparei com um problema.
Então, o meu problema é que eu implementei um script na camera para arrastar o cenario com o mouse, mas eu queria que ele nao funcionasse quando alguma janela estiver aberta, como o inventario (que estou criando ainda) ou qualquer coisa, até mesmo botoes do painel principal, por exemplo um regador, preciso arrastar ele para regar as plantas, sem arrastar a camera...
Aqui está o script da camera que uso para arrasta-la no cenario:
Estou criando um jogo tipo Fazenda Iddle, e sou novo na programação, estou indo bem ate agora na criação porem me deparei com um problema.
Então, o meu problema é que eu implementei um script na camera para arrastar o cenario com o mouse, mas eu queria que ele nao funcionasse quando alguma janela estiver aberta, como o inventario (que estou criando ainda) ou qualquer coisa, até mesmo botoes do painel principal, por exemplo um regador, preciso arrastar ele para regar as plantas, sem arrastar a camera...
Aqui está o script da camera que uso para arrasta-la no cenario:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Toucher : MonoBehaviour {
private Vector3 dragOrigin; //Where are we moving?
private Vector3 clickOrigin = Vector3.zero; //Where are we starting?
private Vector3 basePos = Vector3.zero; //Where should the camera be initially?
void Update() {
if (Input.GetMouseButton(0)) {
if (clickOrigin == Vector3.zero) {
clickOrigin = Input.mousePosition;
basePos = transform.position;
}
dragOrigin = Input.mousePosition;
}
if (!Input.GetMouseButton(0)) {
clickOrigin = Vector3.zero;
return;
}
transform.position = new Vector3(basePos.x + ((clickOrigin.x - dragOrigin.x) * .04f), basePos.y + ((clickOrigin.y - dragOrigin.y) * .04f), -10);
}
}
HeavebRemix- Iniciante
- PONTOS : 1759
REPUTAÇÃO : 4
Respeito as regras :
Re: [RESOLVIDO] NAO ARRASTAR CAMERA QUANDO O INVENTARIO ESTIVER ABERTO
Oi, eu vi a mensagem que você me mandou no Facebook, mas aqui é muito melhor de resolver, pois tem como você me mandar o script.
Eu pensei em diversas formas para resolver o problema, mas acho que a mais interessante seria quando algum elemento de UI estiver ativo, uma variável controladora fique true, impedindo do script acima funcionar.
No script da camera que arrasta, crie essa variável:
E agora dentro do Update faça o seguinte:
Agora crie dois métodos assim:
Agora vamos criar um script base para todas as suas UIs terem o comportamento de desativar o script acima:
Agora sua tarefa é fazer com que todos elementos de UI herdem dessa classe, por exemplo:
Todas elas tem o comportamento de quando abrir enviar uma notificação que está aberta, e quando fechar, também manda a notificação.
Mas como o script de arrastar sabe disso?
Você precisa inscrever os métodos dele que deixam a variável uiIsOpen, true ou false nas notificações das UIs, então dentro do script de arrastar você ainda adiciona esses dois métodos:
É isso.
Eu pensei em diversas formas para resolver o problema, mas acho que a mais interessante seria quando algum elemento de UI estiver ativo, uma variável controladora fique true, impedindo do script acima funcionar.
No script da camera que arrasta, crie essa variável:
- Código:
private float uiIsOpen = false;
E agora dentro do Update faça o seguinte:
- Código:
void Update (){
if(uiIsOpen)
return;
// Resto do seu código
}
Agora crie dois métodos assim:
- Código:
private void EnableAction(){
uiIsOpen = false;
}
private void DisableAction(){
uiIsOpen = true;
}
Agora vamos criar um script base para todas as suas UIs terem o comportamento de desativar o script acima:
- Código:
using System;
using UnityEngine;
public class UIBase : MonoBehaviour {
public static event Action NotifyOpen;
public static event Action NotifyClose;
protected virtual void OnEnable(){
NotifyOpen ();
}
protected virtual void OnDisable(){
NotifyClose ();
}
}
Agora sua tarefa é fazer com que todos elementos de UI herdem dessa classe, por exemplo:
- Código:
public class WindowInvetory : UIBase{}
Todas elas tem o comportamento de quando abrir enviar uma notificação que está aberta, e quando fechar, também manda a notificação.
Mas como o script de arrastar sabe disso?
Você precisa inscrever os métodos dele que deixam a variável uiIsOpen, true ou false nas notificações das UIs, então dentro do script de arrastar você ainda adiciona esses dois métodos:
- Código:
private void Awake(){
UIBase.NotifyOpen += DisableAction;
UIBase.NotifyClose += EnableAction;
}
private void OnDestroy(){
UIBase.NotifyOpen -= DisableAction;
UIBase.NotifyClose -= EnableAction;
}
É isso.
Re: [RESOLVIDO] NAO ARRASTAR CAMERA QUANDO O INVENTARIO ESTIVER ABERTO
Caramba, deu certo!
Muito obrigado may, explicou com detalhes e me ajudou muito, ate mesmo a entender como funciona!
Muito obrigado may, explicou com detalhes e me ajudou muito, ate mesmo a entender como funciona!
MayLeone escreveu:Oi, eu vi a mensagem que você me mandou no Facebook, mas aqui é muito melhor de resolver, pois tem como você me mandar o script.
Eu pensei em diversas formas para resolver o problema, mas acho que a mais interessante seria quando algum elemento de UI estiver ativo, uma variável controladora fique true, impedindo do script acima funcionar.
No script da camera que arrasta, crie essa variável:
- Código:
private float uiIsOpen = false;
E agora dentro do Update faça o seguinte:
- Código:
void Update (){
if(uiIsOpen)
return;
// Resto do seu código
}
Agora crie dois métodos assim:
- Código:
private void EnableAction(){
uiIsOpen = false;
}
private void DisableAction(){
uiIsOpen = true;
}
Agora vamos criar um script base para todas as suas UIs terem o comportamento de desativar o script acima:
- Código:
using System;
using UnityEngine;
public class UIBase : MonoBehaviour {
public static event Action NotifyOpen;
public static event Action NotifyClose;
protected virtual void OnEnable(){
NotifyOpen ();
}
protected virtual void OnDisable(){
NotifyClose ();
}
}
Agora sua tarefa é fazer com que todos elementos de UI herdem dessa classe, por exemplo:
- Código:
public class WindowInvetory : UIBase{}
Todas elas tem o comportamento de quando abrir enviar uma notificação que está aberta, e quando fechar, também manda a notificação.
Mas como o script de arrastar sabe disso?
Você precisa inscrever os métodos dele que deixam a variável uiIsOpen, true ou false nas notificações das UIs, então dentro do script de arrastar você ainda adiciona esses dois métodos:
- Código:
private void Awake(){
UIBase.NotifyOpen += DisableAction;
UIBase.NotifyClose += EnableAction;
}
private void OnDestroy(){
UIBase.NotifyOpen -= DisableAction;
UIBase.NotifyClose -= EnableAction;
}
É isso.
HeavebRemix- Iniciante
- PONTOS : 1759
REPUTAÇÃO : 4
Respeito as regras :
Tópicos semelhantes
» [RESOLVIDO] Player correndo e animação quando estiver colidindo
» saindo do jogo caso um programa não estiver aberto
» [RESOLVIDO] Camera tremendo quando se aproxima de certos objetos, como resolver?
» OBJETO GIRAR QUANDO ARRASTAR O MOUSE
» [RESOLVIDO] Arrastar e conectar
» saindo do jogo caso um programa não estiver aberto
» [RESOLVIDO] Camera tremendo quando se aproxima de certos objetos, como resolver?
» OBJETO GIRAR QUANDO ARRASTAR O MOUSE
» [RESOLVIDO] Arrastar e conectar
SchultzGames :: UNITY 3D :: Resolvidos
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos