SchultzGames
Para tirar dúvidas, crie um tópico especifico na área "Dúvidas em Geral" e aguarde ser respondido. Evite comentar em tópicos não relacionados a sua dúvida Very Happy
TÓPICOS RECENTES:
Tópico:
Postado em:
Postado por:
Otimizacoa por Colisor - (Desativar/Ativar)
Como Editar um tópico ;---; (tópico desse site mesmo)
duvida sobre prefab, object e gameobject
Como arrumar camera atravessando paredes?
Package character
Problema com script para captura de texto
Dúvidas Sobre OnCollider
Error NullReferenceException: Object reference not set to an instance of an object
[____ADMINISTRAÇÃO____] PRECISO DE AJUDA [DICA PARA SER AJUDADO]
[____APOIE O FÓRUM E O CANAL E GANHE RECOMPENSAS____]
Qual versão da unity é recomendada HOJE?
Criar Chuva?
Tem como eu Salvar os Dados de Um Terreno?
Unity crashando depois que eu tento abrir
Como fazer skins completa de battle Royale
Como faço para este item aparecer no meu inventário de forma correta?
Unity Banco de Dados
Meu primeiro projeto
photonnetwork vale a pena ?
[RESOLVIDO] Como ajustar o volume em todo o jogo
[____TÓPICO LIVRE____] FALE O QUE QUISER (Parte 2)
Desativar butão de acordo valor em seu script [Avançado]
Controle de Personagem
[TUTORIAL] DEBUG DE TEMPO
[Alpha Android] - Winthia Chronicles (Alpha Devlog, 20 de fevereiro de 2018). Lançamento!
FantasyDragon Online - Formação de Equipe (P.A / Designer Gráfico )
Como "grudar" objetos no unity?
Slime Shop: Multiplayer (Teste De Jogo :D )
Monitorar Usuarios
Dúvida sobre animação
Alpha Fossil
Configuração de efeitos com água na Unity
Dúvida sobre o uso da Unity em fonte de 47-63hz
Como fazer 1 gerador
[TUTORIAL] Explodir Mesh "Explodir Objeto"
[Asset]Terreno .dae
[Asset] Personagem 3d basico sem uso
Erro ai importar
[Duvida] Menu Input
[RESOLVIDO] Adaptar o script para mostrar o erro
Objetos girando em órbita de outro
Erro Build Android
[RESOLVIDO] Não consigo alterar o shader de modelo feito no makehuman
[TUTORIAL]Sistema de Pet Virtual -AULA 3 NOVO[20/02/2018]
Pack de animações para jogos de Luta
GamePad Android!
Mudar um .TXT usando um site
"Simular" uma VPS
Velocimetro de Ponteiro!
[TUTORIAL] Unity 5 - Wheel Collider, veículos, suspensão realista.
Formação de Equipe
[ENCERRADO] Preciso de Programadores para equipe
GC.Collect
[Duvida] Como acessar uma variavel nãa estatica(static).
Inserir Trigger
Fps Caindo Instanteneamente
LoadSceneAsync em varias cenas e escolher qual chamar
Script de Semaforo
duvida de desempenho ao Instanciar Gameobject
[RESOLVIDO] Bug provavelmente pivot
[TUTORIAL]Sistema de Pet Virtual -AULA 2 [Tamagotchi](ANDROID/PC)
[TUTORAIL] Loja Virtual Fácil e Grátis
Fiz esse jogo a bastante tempo que tipo de mecanica eu poderia adicionar?
Carregar um prefab usando byte[]
[RESOLVIDO] Tem como Um Script rodar antes de Outro
Procuro modelador
Duvida com velocidade X e velocidade Z
Problemas para criar um BackGround
[TUTORIAL] Calculando distância entre gameObjects
Restringir InpultField!
Preciso Modelador com experiencia em Modelar Veículos
Script inimigo x Player
Novo Jogo (BETA ~ Sem Nome)
Multiplayer Unet: no meio da partida os client saem do nada(sistema de Checar conexão)
[RESOLVIDO] Não Consigo Acessar meus Materiais do Modelo !
como alterar o Rect Transform?
[WIP] Projeto ainda sem título
Mudar a densidade de Pixels na tela
O que fazer para ser um programador
[TUTORIAL] Capturar Imagem da WebCam e Salvar No seu Pc
tem como criar Uma Imagem no Canvas?
Membro Avançado
Tem como fazer um cube 3d invisível?
Player não acompanha plataforma
Jogo de plataforma que eu fiz
Alguém para testar alguns jogos meus (Saber se estão legais, se tem bugs e tals)
(Duvida) Como criar um sistema de dialogos?
Equipe para criação de jogo de terror.
Espelho Realista
[TUTORIAL]Sistema de Pet Virtual [Tamagotchi] Completo (ANDROID/PC)
Equipe para criação de assets
Procuro Modelador Low Poly
Unity não reconhece meu celular
[TUTORIAL]Sistema Basico de Combustivel (PC e Android)
[ Run Sara, run ! ] Em desenvolvimento para android.
[SCRIPT] Controle Simples com movimento e rotação
Metodos Assincrono na Unity
Alterar componentes de todos os objeto de um array
Duvida com spawn de IA
Hoje à(s) 12:33 am
Hoje à(s) 12:26 am
Hoje à(s) 12:25 am
Hoje à(s) 12:11 am
Ontem à(s) 11:45 pm
Ontem à(s) 10:13 pm
Ontem à(s) 10:12 pm
Ontem à(s) 9:04 pm
Ontem à(s) 8:50 pm
Ontem à(s) 8:49 pm
Ontem à(s) 8:26 pm
Ontem à(s) 7:23 pm
Ontem à(s) 7:20 pm
Ontem à(s) 6:45 pm
Ontem à(s) 6:33 pm
Ontem à(s) 3:25 pm
Ontem à(s) 3:21 pm
Ontem à(s) 2:19 pm
Ontem à(s) 1:31 pm
Ontem à(s) 2:29 am
Qui Fev 22, 2018 8:44 pm
Qui Fev 22, 2018 8:13 pm
Qui Fev 22, 2018 5:49 pm
Qui Fev 22, 2018 4:29 pm
Qui Fev 22, 2018 2:42 pm
Qui Fev 22, 2018 2:36 pm
Qui Fev 22, 2018 1:50 am
Qua Fev 21, 2018 10:36 pm
Qua Fev 21, 2018 8:53 pm
Qua Fev 21, 2018 8:35 pm
Qua Fev 21, 2018 7:55 pm
Qua Fev 21, 2018 7:37 pm
Qua Fev 21, 2018 7:00 pm
Qua Fev 21, 2018 6:33 pm
Qua Fev 21, 2018 5:58 pm
Qua Fev 21, 2018 3:55 pm
Qua Fev 21, 2018 3:21 pm
Qua Fev 21, 2018 2:57 pm
Qua Fev 21, 2018 2:35 pm
Qua Fev 21, 2018 12:46 pm
Qua Fev 21, 2018 11:40 am
Qua Fev 21, 2018 10:32 am
Qua Fev 21, 2018 10:03 am
Ter Fev 20, 2018 11:43 pm
Ter Fev 20, 2018 8:55 pm
Ter Fev 20, 2018 7:51 pm
Ter Fev 20, 2018 7:48 pm
Ter Fev 20, 2018 7:20 pm
Ter Fev 20, 2018 7:12 pm
Ter Fev 20, 2018 7:11 pm
Ter Fev 20, 2018 6:54 pm
Ter Fev 20, 2018 6:15 pm
Ter Fev 20, 2018 5:52 pm
Ter Fev 20, 2018 5:14 pm
Ter Fev 20, 2018 4:49 pm
Ter Fev 20, 2018 4:48 pm
Ter Fev 20, 2018 4:42 pm
Ter Fev 20, 2018 4:38 pm
Ter Fev 20, 2018 4:30 pm
Ter Fev 20, 2018 4:25 pm
Ter Fev 20, 2018 1:31 pm
Ter Fev 20, 2018 12:20 pm
Ter Fev 20, 2018 12:56 am
Ter Fev 20, 2018 12:21 am
Seg Fev 19, 2018 8:29 pm
Seg Fev 19, 2018 12:19 pm
Seg Fev 19, 2018 9:23 am
Seg Fev 19, 2018 12:35 am
Dom Fev 18, 2018 9:57 pm
Dom Fev 18, 2018 7:51 pm
Dom Fev 18, 2018 5:03 pm
Dom Fev 18, 2018 3:56 pm
Dom Fev 18, 2018 2:41 pm
Dom Fev 18, 2018 1:21 pm
Dom Fev 18, 2018 12:09 pm
Dom Fev 18, 2018 11:45 am
Dom Fev 18, 2018 3:03 am
Dom Fev 18, 2018 2:24 am
Sab Fev 17, 2018 10:41 pm
Sab Fev 17, 2018 7:25 pm
Sab Fev 17, 2018 7:09 pm
Sab Fev 17, 2018 6:58 pm
Sab Fev 17, 2018 5:35 pm
Sab Fev 17, 2018 4:37 pm
Sab Fev 17, 2018 3:15 pm
Sab Fev 17, 2018 2:52 pm
Sab Fev 17, 2018 1:23 pm
Sex Fev 16, 2018 11:43 pm
Sex Fev 16, 2018 11:15 pm
Sex Fev 16, 2018 10:54 pm
Sex Fev 16, 2018 10:18 pm
Sex Fev 16, 2018 10:17 pm
Sex Fev 16, 2018 6:27 pm
Sex Fev 16, 2018 6:09 pm
Sex Fev 16, 2018 5:18 pm
Sex Fev 16, 2018 4:56 pm
Sex Fev 16, 2018 3:57 pm
Sex Fev 16, 2018 1:59 pm
Sex Fev 16, 2018 1:56 pm
RonilddoRR
felipehobs1
Zack2
Extreme Craft
Zack2
otavio00augusto
ffabim
junior93
dstaroski
dstaroski
ÁguaMineral
Phph09
Dom3000
Souris
Callyde Jr
Fluttershy28
natanael.olimpio
Souris
marcos4503
Samuelsk
felipehobs1
Felipe Costa
felipehobs1
luKkaSs
marcos4503
Dom3000
rafaelllsd
marcos4503
natanael.olimpio
Souris
Édipo
dstaroski
dstaroski
Souris
Samuelsk
Dom3000
felipehobs1
Dom3000
marcos4503
marcos4503
Phph09
maxwell111
Gilberto555
marcos4503
GameLACK
felipehobs1
Souris
Souris
Souris
Zack2
Zack2
marcos4503
Duarte
MarcosSchultz
michelly
MarcosSchultz
MarcosSchultz
MarcosSchultz
MarcosSchultz
MarcosSchultz
marcos4503
fecirineu
felipehobs1
Zecker
Dom3000
alexs
AlvaroWalker
felipehobs1
recagonlei
Weslley
Jhonatham1
dstaroski
fabriciorsz34
recagonlei
nicolasfive
Dom3000
rafaelllsd
rafaelllsd
marcos4503
felipehobs1
Phph09
Phph09
Daniel Dória
Simplizãum S
Daniel Pires da Silva
GamersBR
Bruno
ÁguaMineral
Souris
fecirineu
minosso
minosso
otavio00augusto
fecirineu
ruanzikaad
Simplizãum S
junkflash30
MarcosSchultz
MarcosSchultz

SISTEMA DE PORTA COM SENHA

Ir em baixo

EM TESTE SISTEMA DE PORTA COM SENHA

Mensagem por Weslley em Dom Jun 12, 2016 10:16 am

Sistema de porta com Senha parecido Com Rusts



Script Da Porta

Código:

using UnityEngine;
using System.Collections;

[RequireComponent(typeof(LockDoorController))]
[RequireComponent(typeof(ChangePasswordDoor))]
public class DoorController : MonoBehaviour
{

    public float speedOpen = 3;
    public float speedClosed = 5;

    private float angle = 0;
    private bool open = false;

    public AudioSource openDoorSound;
    public AudioSource closedDoorSound;
    public AudioSource erroPassword;

    private LockDoorController lockDoorController;

    void Start()
    {
        lockDoorController = GetComponentInChildren<LockDoorController>();
   
    }

    void Update()
    {
        Open();
    }

    private void Open()
    {
        angle = open == true ? Mathf.LerpAngle(angle, -90, speedOpen * Time.deltaTime) : Mathf.LerpAngle(angle, 0, speedClosed * Time.deltaTime);
        Vector3 endRotation = new Vector3(0, angle, 0);
        transform.eulerAngles = endRotation;
    }

    public void OpenDoor()
    {
        if (Input.GetKeyDown(KeyCode.E))
        {
            if (!lockDoorController.IsLocked)
            {
                if (!open)
                {
                    open = true;
                    openDoorSound.Play();
                }
                else
                {
                    open = false;
                    closedDoorSound.Play();
                }
            }
            else
            {
                erroPassword.Play();
            }
        }
    }

    public bool GetStateDoor()
    {
        return open;
    }
}
[size][size]

Script De Trancar a Porta

[/size][/size]
Código:

using UnityEngine;
using UnityStandardAssets.Characters.FirstPerson;
using System.Collections;

public class LockDoorController : MonoBehaviour
{
    private string password = string.Empty;
    public AudioSource erroPassword;
    public AudioSource bip;

    public GameObject redLed;
    public GameObject greenLed;

    public bool withPassword = false;
    public bool switchOff = false;

    private bool interacting = false;
    private bool locked;

    void Start()
    {
        interacting = false;
        password = string.Empty;
    }

    void Update()
    {
        CheckPassword();
        LedsController();
    }

    private void LedsController()
    {
        redLed.SetActive(locked);
        greenLed.SetActive(!locked);
    }

    private void CheckPassword()
    {
        if (password.Length >= 4)
            withPassword = true;

        if (!interacting)
            return;

        if (locked)
        {
            if (CheckPasswordTyped())
            {
                StartCoroutine(Validate());
            }

            if (ElectronicLookController.lockController.currentPasswordTyped.Length >= 4 && !CheckPasswordTyped())
            {
                erroPassword.Play();
                ElectronicLookController.lockController.Reset();
                switchOff = true;
            }
        }
    }

    private bool CheckPasswordTyped()
    {
        if ( ElectronicLookController.lockController.currentPasswordTyped == password && password != string.Empty)
        {
            return true;
        }
        return false;
    }

    public void EnterCode(FirstPersonController firstPersonController)
    {
        ComeBack(firstPersonController);
        InteractWithDoor(firstPersonController);
    }

    private void InteractWithDoor(FirstPersonController firstPersonController)
    {
        if (Input.GetKeyDown(KeyCode.E))
        {
            if (GetComponent<DoorController>().GetStateDoor() && withPassword)
                return;
           
            Cursor.lockState = CursorLockMode.None;
            Cursor.visible = true;

            interacting = true;
            firstPersonController.enabled = false;

            if (!withPassword)
            {
                MenuLock.GetMenuLock.Change();
            }
            else
            {
                if (!locked)
                {
                    MenuLock.GetMenuLock.OpenMenu();
                }
                else
                {
                    ElectronicLookController.lockController.OpenLockController();
                }
            }
        }  
    }

    private void ComeBack(FirstPersonController firstPersonController)
    {
        if (Input.GetKeyDown(KeyCode.Escape) || switchOff)
        {
            ElectronicLookController.lockController.Reset();

            if (MenuLock.GetMenuLock.gameObject.activeSelf)
            {
                MenuLock.GetMenuLock.Reset();
            }

            firstPersonController.enabled = true;
            interacting = false;
            switchOff = false;
        }
    }

    public IEnumerator Validate()
    {
        interacting = false;
        yield return new WaitForSeconds(0.3f);
        switchOff = true;
        locked = false;

        bip.Play();
        yield return new WaitForSeconds(bip.clip.length / 2);
        bip.Play();

        Debug.Log("Vaidando");
    }

    public bool IsLocked
    {
        get{ return locked; }
        set{ locked = value; }
    }

    public bool ThisInteracting
    {
        get{ return interacting; }
        set{ interacting = value; }
    }

    public string GetPassword
    {
        get{ return password; }
        set{ password = value; }
    }
}
[size][size]

Script De Trocar a Senha

[/size][/size]
Código:

using UnityEngine;
using System.Collections;

public class ChangePasswordDoor : MonoBehaviour {

    private LockDoorController lockDoorController;

    public AudioSource accept;
    public AudioSource locked;

    private bool toExchange;

    void Start ()
    {
        lockDoorController = GetComponentInChildren<LockDoorController>();
    }

    void Update ()
    {
        if (!lockDoorController.ThisInteracting)
            return;

        if (MenuLock.GetMenuLock.lockDoor)
        {
            if (lockDoorController.GetPassword != string.Empty)
            {
                lockDoorController.IsLocked = !lockDoorController.IsLocked;
                lockDoorController.ThisInteracting = false;
                MenuLock.GetMenuLock.Reset();
                locked.Play();
            }
            else
            {
                ChangePassword();
            }
        }
        else if (MenuLock.GetMenuLock.changePassWord)
        {
            ChangePassword();
        }
    }

    private void ChangePassword()
    {
        string password =  ElectronicLookController.lockController.currentPasswordTyped;
        ElectronicLookController.lockController.OpenLockController();

        if (password.Length >= 4 && !toExchange)
        {
            toExchange = true;
        }

        if (toExchange)
            StartCoroutine(Validate(password));
    }

    private IEnumerator Validate(string password)
    {
        toExchange = false;
        MenuLock.GetMenuLock.Reset();
        lockDoorController.GetPassword = password;

        yield return new WaitForSeconds(0.3f);

        accept.Play();
        lockDoorController.switchOff = true;
        ElectronicLookController.lockController.Reset();
    }   
}

[size][size]

Script Do Player

[/size][/size]
Código:

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using UnityStandardAssets.Characters.FirstPerson;

public class PlayerBehaviour : MonoBehaviour
{
    private FirstPersonController firstPersonController;

    public Text objectName;
    public Image sight;

    void Start()
    {
        firstPersonController = GetComponent<FirstPersonController>();
    }

    void Update()
    {
        Ray ray = Camera.main.ScreenPointToRay(new Vector3(Screen.width / 2, Screen.height / 2, 0));
        RaycastHit hitInfo;

        bool collided = Physics.Raycast(ray, out hitInfo, 10);

        objectName.enabled = collided;
        sight.enabled = collided;

        if (!collided)
            return;

        ColliderObject(hitInfo);
    }

    private void ColliderObject(RaycastHit hitInfo)
    {
        switch (hitInfo.collider.tag)
        {
            case "Door":
                DoorController doorController = hitInfo.transform.GetComponentInParent<DoorController>();
                objectName.text = doorController.GetStateDoor() == true ? "Closed Door" : "Open Door";
                doorController.OpenDoor();

                break;
            case "Lock":
               
                LockDoorController lockDoorController = hitInfo.transform.GetComponentInParent<LockDoorController>();
                if (!lockDoorController.IsLocked)
                {
                    objectName.text = lockDoorController.withPassword == false ? "Change Password Code" : "Open Menu";
                }
                else
                {
                    objectName.text = "Unlock With Code";
                }

                lockDoorController.EnterCode(firstPersonController);

                break;

            default:
                objectName.text = "";
                break;
        }
    }
}
[size][size]

Script Dos Botões

[/size][/size]
Código:

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using System.Collections.Generic;
using System.Linq;

public class ElectronicLockController : MonoBehaviour
{
   
    public List<Button> buttons;
    public Button deleteButton;
    public Text currentPasswordText;

    public string currentPasswordTyped = string.Empty;

    public static ElectronicLockController lockController;

    void Start()
    {
        AddFuctionsButtons();
        currentPasswordTyped = string.Empty;
        lockController = this;
        gameObject.SetActive(false);
    }

    void Update()
    {
        currentPasswordText.text = currentPasswordTyped;
    }
       
    private void AddFuctionsButtons()
    {
        int value = 0;

        foreach (Button button in buttons)
        {
            for (int i = value; i < buttons.Count; i++)
            {
                button.onClick = new Button.ButtonClickedEvent();
                button.onClick.AddListener(() => EnterCode(i));
                value++;
                break;
            }
        }

        deleteButton.onClick = new Button.ButtonClickedEvent();
        deleteButton.onClick.AddListener(() => Backspace());
    }
     
    public void EnterCode(int value)
    {
        if (currentPasswordTyped.Length < 5)
            currentPasswordTyped += value.ToString();
    }

    public void Backspace()//Gambiarra OBSERVAÇÃO
    {
        if (currentPasswordTyped.Length <= 0)
            return;    

        List<char> lastValue = new List<char>();  
        lastValue.AddRange(currentPasswordTyped.ToCharArray(0,currentPasswordTyped.Length));
        lastValue.RemoveAt((lastValue.Count - 1));

        currentPasswordTyped = string.Empty;

        foreach (char last in lastValue)
        {
            currentPasswordTyped += last.ToString();
        }
    }

    public void OpenLockController()
    {
        gameObject.SetActive(true);
    }

    public void Reset()
    {
        currentPasswordTyped = string.Empty;
        currentPasswordText.text = "";
        gameObject.SetActive(false);
    }
}

[size][size]

Script Do Menu

[/size][/size]
Código:

using UnityEngine;
using System.Collections;
using UnityStandardAssets.Characters.FirstPerson;

public class MenuLock : MonoBehaviour
{

    public bool lockDoor;
    public bool changePassWord;

    public static MenuLock GetMenuLock;

    void Start()
    {
        GetMenuLock = this;
        gameObject.SetActive(false);
    }

    public void locked()
    {
        lockDoor = true;
        gameObject.SetActive(false);
        FirstPersonController firstPersonController = FindObjectOfType(typeof(FirstPersonController)) as FirstPersonController;
        firstPersonController.enabled = true;
    }

    public void Change()
    {
        changePassWord = true;
        gameObject.SetActive(false);
    }

    public void OpenMenu()
    {
        gameObject.SetActive(true);
    }

    public void Reset()
    {
        lockDoor = false;
        changePassWord = false;
        gameObject.SetActive(false);
    }
}



Última edição por weslleyFx em Sex Jul 29, 2016 1:05 pm, editado 1 vez(es)
avatar
Weslley
Moderador

Masculino PONTOS : 2946
REPUTAÇÃO : 606
Idade : 19
Áreas de atuação : C#
Respeito as regras :

Ver perfil do usuário

Voltar ao Topo Ir em baixo

EM TESTE Re: SISTEMA DE PORTA COM SENHA

Mensagem por Manawydan em Dom Jun 12, 2016 1:08 pm

boa, pq não faz um tutorial de como fazer pro pessoal?
avatar
Manawydan
Moderador

PONTOS : 1179
REPUTAÇÃO : 181
Idade : 21
Respeito as regras :

Ver perfil do usuário https://wad.ojooo.com/register.php?ref=ManawydanBr

Voltar ao Topo Ir em baixo

EM TESTE Re: SISTEMA DE PORTA COM SENHA

Mensagem por RenanMSV em Dom Jun 12, 2016 1:54 pm

Mt bom !
avatar
RenanMSV
Instrutor

Masculino PONTOS : 2018
REPUTAÇÃO : 330
Áreas de atuação : Programação em C#, PHP. SQL, JavaScript (Web)
Respeito as regras :

Ver perfil do usuário

Voltar ao Topo Ir em baixo

EM TESTE Re: SISTEMA DE PORTA COM SENHA

Mensagem por ninjaEX em Dom Jun 12, 2016 3:07 pm

faz um tutorial
avatar
ninjaEX
Avançado
Avançado

PONTOS : 725
REPUTAÇÃO : 4
Áreas de atuação : no unity,e eu sei o basico de programaçao e sou pessimo de modelar e AMO particulas
Respeito as regras :

Ver perfil do usuário

Voltar ao Topo Ir em baixo

EM TESTE Re: SISTEMA DE PORTA COM SENHA

Mensagem por Weslley em Dom Jun 12, 2016 6:28 pm

Para fazer um tutorial desse sistema teria que ser em vídeo mais no momento estou sem microfone não que seja muito complicado para fazer um tutorial escrito mais ele bem chatinho de fazer este sistema foi feito com 6 scripts
avatar
Weslley
Moderador

Masculino PONTOS : 2946
REPUTAÇÃO : 606
Idade : 19
Áreas de atuação : C#
Respeito as regras :

Ver perfil do usuário

Voltar ao Topo Ir em baixo

EM TESTE Re: SISTEMA DE PORTA COM SENHA

Mensagem por Weslley em Sex Jul 29, 2016 1:07 pm

@Up scripts usados
avatar
Weslley
Moderador

Masculino PONTOS : 2946
REPUTAÇÃO : 606
Idade : 19
Áreas de atuação : C#
Respeito as regras :

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Voltar ao Topo


 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum