Unity 3D – Dica para criação de scripts c#

Quando estou programando no Unity 3D minha linguagem de script preferida é C#, utilizo o Microsoft Visual Studio Express (de graça AQUI) para me ajudar.

Mas sempre que crio um script no Unity 3D tenho que renomear o arquivo e também trocar o nome dentro do script e isso é bem chato.

Mas com o Visual Studio a coisa fica mais fácil, criaremos os scripts diretamente por ele, utilizando um template customizado para criação de um novo script.

Siga o passo-a-passo:

1 – Baixe o template customizado

DOWNLOAD

2 – Coloque o arquivo zipado mesmo na pasta …\Documents\Visual Studio 2008\Templates\ItemTemplates e abra o Visual Studio

3 – Na aba Solution Explorer, clique com o botão direito na pasta onde será criado o novo script e vá em Add – New Item…

4 – Coloque o nome para o novo script e desça a barra de rolagem até achar o icone do MonoBehavior ( se não estiver na lista, alguma coisa foi feita errada nos primeiros passos), selecione o item e clique em Add.

Pronto, um novo arquivo de script será criado, com todos os nomes certos.

Você pode abrir o arquivo zip e alterar o .cs que tem lá dentro com as coisas que você mais usa, para que sempre que criar um arquivo de script novo já venha tudo pronto.

Share

PDA – Mac OS + Mysql

Por Ricardo Valim:

Como instalar e o principal, fazer funcionar o banco de dados MySQL no Mac OSX Snow Leopard.

Assim como muitas pessoas, sempre achei os Macbooks simplesmente maravilhosos e sempre desejei ter um. Até que um belo dia, comprei um para mim. E já ia comprar resolvi comprar um “senhor“ MacBook. Comprei logo um MacBook Pro. Diríamos que meu sonho estava se realizando. De fazer parte do seleto grupo de usuários que possuíam um MacBook. Todas as minhas expectativas estavam se confirmando. Além de ser um computador muito bonito fisicamente, é um computador bastante poderoso, rápido e o melhor, não possui a famosa tela azul e raramente trava. Mas como nem tudo na vida são flores, junto com a minha felicidade em ter um MacBook ganhei um problema chamado Mac OS.
Tinha certeza que conseguiria me entender facilmente com o famoso sistema operacional e caso tivesse alguma dificuldade apelaria para o todo poderoso Google. E assim foi bom um bom tempo. Quando tinha alguma dúvida corria para o Google e depois de procurar bem acabava resolvendo meu problema.
Certa vez, precisei instalar o banco de dados MySQL no meu MacBook Pro e nem imaginava por onde começar. Foi quando como sempre que possui essas dúvidas, fui para o Google procurar. Para a minha surpresa, não encontrava informações consistentes. Cada fórum, lista de discussão, blogs, etc falavam uma coisa de uma maneira completamente distinta da outra. Informações completamente desencontradas e nada de resolver o meu problema.
Após vários e vários cliques, resolvi o meu problema. Meu MySQL estava devidamente instalado, configurado e principalmente, funcionando com o meu Mac OSX.
Diante de todos os problemas que enfrentei, resolvi escrever esse artigo para ajudar aos demais usuários que tiverem algum tipo de dificuldade ou até mesmo queiram utilizar esse artigo como tutorial para atingir o sucesso utilizando Mac OSX Snow Leopard + MySQL.

Depois de muito alterar o formato do artigo, achei a melhor forma escreve-lo em forma de passo a passo para facilitar o entendimento e possíveis esclarecimentos de dúvidas posteriormente.

Passo 1: Efetuar download.

Faça o download da última versão do MySQL para Mac OS. Escolha sempre a versão que está empacotada como DMG para facilitar a nossa instalação.

Passo 2: Instalação

Após terminar o download do MySQL, de um duplo clique para desempacotar o arquivo que baixou e uma tela com 4 arquivos se abrirá conforme a figura abaixo.

Caso queira dar uma lida no Readme, sinta-se a vontade, sinceramente não vejo o porque tendo em vista que está com esse tutorial em mãos.

O primeiro arquivo a ser instalado é o MySQL-versão. É bem simples sua instalação. Praticamente uma instalação de programas no Windows (next, next, next, finish).

Após concluir com êxito a instalação do banco de dados, instale o arquivo MySQLStartupItem.pkg. Este programa é o responsável por criar a configuração de inicialização do mySQL.

Em seguida, instale o arquivo MySQL.prefPane. que basicamente irá nos colocar um ícone de gerenciamento na janela de Preferencias do Sistema, conforme figura abaixo.

Acessando esse programa, conseguimos identificar qual o status da instancia do mysql, ou seja, se esta em execução ou está parado.

O próximo passo, é definirmos a senha do usuário “root” do MySQL. Para isso, abra uma janela do Terminal (Finder, Utilitários, Terminal) e digite a seguinte linha de comando:

 

/usr/local/mysql/bin/mysqladmin -u root password <sua_senha>

/usr/local/mysql/bin/mysqladmin -u root -h `hostname` password <sua_senha>

 

Após definir sua senha do usuário “root”, digite exit para fechar o processo. Em seguida, pode fechar o terminal.

A partir de agora, temos o nosso MySQL devidamente instalado e configurado no MacOS X Snow Leopard pronto para usar.

Bons códigos a todos e até a próxima.

 

Ricardo Valim: Atuando com linguagem de programação a 15 anos e com Java a 10, já atuou em várias empresas de diversos segmentos como CPqD, Pósitron, Natura, Borland at Microfocus Company e atualmente é Arquiteto da Microdata Sistemas atuando em projetos da área têxtil. Também foi professor em diversas instituições de ensino como Unisal Americana, Grupo Anhanguera Educacional, Fatec entre outros. Palestrante em alguns dos principais eventos Java e Software Livre do país e fundador do grupo de usuários Java de Americana – Java Americana. Nas horas vagas, diverte-se jogando PS3 e curtindo seus sobrinhos, sua maior paixão.


Share

Nova seção – Post dos Amigos

Quando criei esse blog estabeleci uma regra, nunca copiar um post, tudo que tiver nele será único ou pelo menos de criação própria, está a um ano no ar e vem seguindo essa linha sempre.
Mas em uma conversa com um amigo foi proposto uma coisa interessante, que eu abrisse espaço para posts de outras pessoas, de amigos meus que querem passar algum conhecimento para frente.
Achei a idéia muito boa, pois não fere a regra, serão artigos escritos por eles mesmos, apenas empresto o espaço, por isso estou criando a seção PDA – Post do Amigos.
Aguardem que muita coisa boa virá por ai.

Share

Volante bluetooth – lego nxt + unity3d

Ter idéias boas para desenvolver coisas com o lego nxt é muito difícil, um dia jogando Dirt 2 no Xbox com o volante wireless tive a idéia de fazer um volante desse com o lego, isso ficou na minha cabeça por um tempo, com esse feriado de páscoa, resolvi por em prática já que não tinha nada para fazer mesmo.
O negócio funciona assim, o lego manda para um servidor socket escrito em java os dados de rotação e de dois botões(acelerador e freio, os dois juntos da a marcha ré), esse servidor manda para o unity3D uma string com as informações concatenadas, o unity processa a string e separa as informações.
Utilizei um jogo de carro de corrida já pronto, disponível em : JCar Demo , Todos os créditos para o autor, apenas modifiquei um script que controla o carro para adaptar na minha lógica.

O vídeo abaixo demonstra o funcionamento.


Para essa brincadeira foi desenvolvido 3 códigos.
O primeiro é para o cérebro do Lego, que apenas pega os dados de rotação de um motor e os estados de 2 sensores do toque, concatena em uma string separando por “/” as informações, exemplo:
“-20/true/false”, que seria -20 graus , acelerador apertado e freio não apertado.

import lejos.nxt.*;
import lejos.nxt.comm.*;
import java.io.*;

public class VolanteLego {

	public static void main(String [] args)  throws Exception 
	{
		String connected = "Conectando";
        String waiting = "Aguardando...";
        String closing = "Fechando...";
        String texto;
        //Tira a força do Motor para poder girar manualmente
        Motor.A.setPower(0);
        //Pega os sensores
        TouchSensor acelerador = new TouchSensor(SensorPort.S1);
        TouchSensor freio = new TouchSensor(SensorPort.S2);
		
			LCD.drawString(waiting,0,0);
			LCD.refresh();
			//fica aguardando o pc conectar
	        BTConnection btc = Bluetooth.waitForConnection();
	        
			LCD.clear();
			LCD.drawString(connected,0,0);
			LCD.refresh();	
			//cria o canal de saida
			DataOutputStream dos = btc.openDataOutputStream();
			
			while (!Button.ENTER.isPressed()) {
				LCD.clear();
				//monta uma string com os dados, eles serão filtrados no unity
				texto = Motor.A.getTachoCount() + "/" + acelerador.isPressed() + "/" + freio.isPressed();
				//apenas para Debug
				LCD.drawString(texto, 0, 0);
				LCD.refresh();
				//envia os daos e atualiza o canal
				// \n necessario para falar que acabou a string
				dos.writeBytes(texto + "\n");
				dos.flush();				
			}	
			//fecha e limpa tudo depois que terminou
			dos.close();
			Thread.sleep(100); 
			LCD.clear();
			LCD.drawString(closing,0,0);
			LCD.refresh();
			btc.close();
			LCD.clear();		
	}
}



O segundo código é um servidor em java, ele se conecta com o lego, pega os dados e transmite via socket, para ser capturado no unity3D.

import lejos.pc.comm.*;
import java.io.*;
import java.net.*;


public class VolantePC {	
	// variaveis para UDP socket
	static DatagramSocket udpSocket;
	static int porta = 23175;
	static InetAddress localhost;	
	static DataOutputStream dos ;
	static DataInputStream dis ;
	//string que será compartilhada
	static String bufferStr="";
	
	public static void main(String[] args) {
		// Conecta o nxt
		NXTConnector conn = new NXTConnector();				
		boolean connected = conn.connectTo("btspp://");
		
		if (!connected) {
			System.err.println("Falhou a conexao com o NXT");
			System.exit(1);
		}
		
		//canais de entrada e saida
		 dos = conn.getDataOut();
		 dis = conn.getDataIn();
		
		// cria o socket para enviar
		try
		{
			localhost = InetAddress.getLocalHost();
			udpSocket = new DatagramSocket();
		}
		catch(SocketException e)
		{
			System.out.println("Não abriu o socket");
		}
		catch(UnknownHostException e)
		{
			System.out.println("Não achou o localhost!");
		}
		
		// Inicia uma nova thread para enviar os dados para o pc
		System.out.println("Transmitindo dados UDP na porta "+porta);
		(new Thread(new EnviarDados(udpSocket))).start();
		
		//loop de leitura dos dados do lego
		while(true)
		{			
			try {
				bufferStr = dis.readLine() + "\n";				
			} catch (IOException ioe) {
				System.out.println("IO Exception lendo os bytes:");
				System.out.println(ioe.getMessage());
				break;
			}
		}
		
	}
//  thread para enviar os dados
	public static class EnviarDados implements Runnable
	{
				DatagramSocket datagrama;
		
		public EnviarDados(DatagramSocket datagrama)
		{
			this.datagrama = datagrama;
		}
		
		public void run()
		{			
			// buffer para os dados de saida
			DatagramPacket pacote;
			byte[] pacoteBuffer;
						
			try
			{
				// le os dados para o buffer
				while(true)
				{				
					// converte para byte array para enviar o pacote
					pacoteBuffer = stringToByteArray(bufferStr);
					pacote = new DatagramPacket(pacoteBuffer, pacoteBuffer.length, VolantePC.localhost, VolantePC.porta);
					datagrama.send(pacote);		
					System.out.println(bufferStr);					
					Thread.sleep(33);
				}				
			}catch(IOException e){
				System.out.println("erro");
			}catch(InterruptedException e) {				
				e.printStackTrace();
			}
		}		
		//le a string e converte para um array de bytes
		byte[] stringToByteArray(String str)
		{
			int length = str.length();
			byte[] byteArray = new byte[length];
			for(int i=0; i<length; i = i + 1)
			{
				byteArray[i] = (byte)(str.charAt(i) & 0xff);
			}
			return byteArray;
		}
	}
}

O terceiro é um javascript que se conecta com o servidor socket, filtra a string com os dados e fornece funções para passar os dados para o jogo.

#pragma strict

import System.Net.Sockets;
import System.Net;
import System.Text;

// qual porta o socket usará
var porta:int = 23175;
//string recebida no socket
private var dados:String = "";
// buffer dos dados pegos
private var buffer:byte[];
// Referencia para o socket UDP
private var cliente:UdpClient;
private var source:IPEndPoint;
private var rotacao:String;
private var aceleracao:String;
private var freio:String;

//inicia o socket
function Awake()
{
	IniciarSocket();
}
//le os dados
function Update()
{
	buffer = cliente.Receive(source);
	dados = Encoding.ASCII.GetString(buffer);
	dados = dados.Replace("\n", "");//limpa o finalizador da string
	//filtra os dados
	rotacao = dados.Substring(0,dados.IndexOf("/"));
	dados = dados.Substring(dados.IndexOf("/")+1);
	aceleracao = dados.Substring(0,dados.IndexOf("/"));
	freio = dados.Substring(dados.IndexOf("/")+1);
}
public function getRotation():float{
	//transforma os dados em um range de -1 até 1, depois inverte o sinal 
	return parseFloat(Mathf.Clamp(parseInt(rotacao), -90, 90)/100.0f)*-1.0f;
}
function getAcceleration():float{
	//se só acelerar vai para frente, se aceletar e freiar da ré , ou desacelera
	return aceleracao=="true"?(freio=="true"?-1:1):0;
}
function getBrake():boolean{
	//só freiará se apenas o freio estiver apertado
return (freio=="true" && aceleracao=="false");
}

/**
* Inicia a comunicação com o servidor
*/
function IniciarSocket()
{
	try
	{
		cliente = new UdpClient(porta);		
		source = new IPEndPoint(IPAddress.Any, 0);
	}
	catch(e:System.Exception)
	{
		Debug.Log(e.ToString());
	}
}

Mais um código em C# foi modificado no JCar, para ler as informações desse último código, ele apenas pega os dados e utiliza no jogo.
Para você refazer esse negócio na sua casa, coloquei os códigos para download, apenas tenho umas observações.
O código javascript deve ficar dentro da pasta plugin, pois o unity tem uma frescura no compilador que atrapalha a referência na chamada de um código javascript por um script em c#, colocando dentro da pasta chamada plugins ele é compilado antes, não causando mais problemas.
Passos para refazer:
- Baixar o demo do JCar que está no link acima e substituir o arquivo JControlledCar.cs.
- Copiar a pasta Plugins que contem o arquivo ClienteSocket.js na pasta Assets.
- Dentro do unity3D, colocar o ClienteSocket.js no gameobject Car.
- O JCar usa o torque do motor em 560, acho muito, então diminui para 400, para ficar mais fácil de controlar.

Depois disso é só executar os programas na sequência – Lego , servidor , jogo no Unity e pronto.

PS: Se alguém tiver uma idéia boa de algum projeto bacana que seria legal desenvolver com o lego e quiser compartilhar, posta nos comentários.

DOWNLOADS:
Código fonte

Share

Quest3D + Kinect – Demonstração de carro

Todo mundo já ouviu falar do Kinect da microsoft, é um aparelho que utiliza várias câmeras e sensores para captar os movimentos do corpo e transmitir para XBOX 360 fazer a integração nos seus jogos.

Como era de se prever, foi hackeado rapidamente para funcionar no PC e inúmeros aplicativos foram desenvolvidos, alguns muito interessantes por sinal.

Eu comprei o meu Kinect, joguei um pouco e logo estava espetado no meu computador, pesquisei no forum do Quest 3D e achei um channel que usa VRPN para pegar os dados passados pelo FAAST, que faz todo o trabalho de conversar com o Kinect para agente.

Com isso desenvolvi um teste utilizando um aplicativo de carro que eu já tinha, o vídeo está logo abaixo, espero que gostem.

 

 

O Kinect me abriu um leque enorme de possibilidades para desenvolver aplicativos para meus clientes na Immersive, especialmente os que são exibidos em feiras, chama muita atenção e é divertido de usar.

Share

Unity 3d- Criação de polígono

Estava curioso sobre como o Unity3D manipulava polígonos via script e fiz um teste seguindo o estilo da ferramenta Lathe do 3Ds Max, que pega uma linha e de acordo com um eixo é criado copias dessa linha de forma circular, com os novos pontos criados é feita a triangularização para formar o polígono.

Quadro 1.

Mostra os vértices que são usados para formar a linha.

Quadro 2.

A Linha amarela mostra o eixo que será usado para fazer a rotação dos pontos ao seu redor.

Quadro 3.

Mostra o polígono já formado e triangularizado (não sei se essa palavra existe), com uma textura e reflexo aplicado.

Note as linhas cinzas mostrando quantas vezes a linha original foi copiada, no caso coloquei 30 cópias, no mínimo são 3 e quanto mais cópias mais definido e mais pesado, isso é configurável.

O teste utilizou lógicas diversas, como contas com ângulos para criação dos pontos , para triangularizar os pontos e para formar o polígono com UV , Normais, etc, claro que não são as formas mais otimizadas, pois fiz tudo da minha cabeça sem utilizar técnicas conhecidas, mas deu certo para o que eu queria.

Abaixo o arquivo do teste para download.

DOWNLOAD

Share

Immersive – Um novo desafio

 



 
Andei um tempo afastado dos posts para o blog, mas por um bom motivo, depois de 11 anos trabalhando em empresas 3D finalmente surgiu a oportunidade e coragem de abrir a minha própria empresa, chama-se Immersive – Interatividade Digital.
A Immersive é formada por pessoas experientes no mercado 3D e marketing, que tem o mesmo pensamento, que algo não precisa ser chato para ser educativo, estamos entrando no mercado para oferecer alternativas aos modelos padrões de treinamentos e quaisquer outros segmentos que caiba um toque de tecnologia e interatividade.
Não seja tímido, visite nosso site, será muito bem vindo.

 

Share

Unity 3D – Teste tiro de canhão

Esse foi um teste que fiz de disparo de canhão com Unity 3D, tem física, partículas, rotação das partes do canhão com as setas do teclado, animação do canhão quando dispara, explosão de fogo quando acerta uma caixa e troca da textura da caixa quando ela é atingida pela bala do canhão. Abaixo do vídeo tem o código fonte.

Código Fonte:
DOWNLOAD

Share

Demo Reel – 2009 – 2010

Fiz uma coletânea dos meus últimos trabalhos e coloquei em vídeo, ficou com 8:40 minutos, um pouco comprido mas não custa nada assistir né.

Share

Tutorial Flash – Arrastando MovieClips – AS3

Hoje vou mostrar quatro modos de arrastar objetos no flash, mais conhecido como “DRAG”.
Drag é quando você clica sobre o objeto, segura o botão apertado e move o mouse, o objeto segue seu movimento, soltando o botão o objeto deixa de seguir.
O objeto pode seguir a partir do ponto que foi clicado ou do ponto (0,0) de si mesmo.

Primeiro modo de DRAG – (BOLA AMARELA)
startDrag() e stopDrag() a partir do ponto clicado;

Esse é o modo mais fácil de fazer, primeiro se adiciona um ouvinte para o evento MOUSE_DOWN que é quando você está com o mouse sobre o objeto e pressiona o botão esquerdo do mouse, depois adiciona outro ouvinte para o evento MOUSE_UP que captura quando você solta o botão esquerdo do mouse sobre o objeto.
O evento MOUSE_UP foi colocado no stage pois dependendo do tipo de drag o mouse nem sempre estará sobre o objeto quando o botão esquerdo for solto.
Esses dois eventos chamam a função controleBola que verifica o event.type, verifica se foi o MOUSE_DOWN ou MOUSE_UP que foi executado, claro que poderia ter sido feito de outra forma, como por exemplo duas funções diferentes, uma para cada tipo de evento , mas assim o código fica mais curto.
Se o evento foi MOUSE_DOWN usamos o startDrag() que manda o objeto seguir o mouse.
Se o evento foi MOUSE_UP usamos o stopDrag() que manda o objeto parar de seguir o mouse.

bolaMC.addEventListener(MouseEvent.MOUSE_DOWN , controleBola);stage.addEventListener(MouseEvent.MOUSE_UP , controleBola);
function controleBola(event:MouseEvent):void {
	switch (event.type) {
		case "mouseDown" :
			bolaMC.startDrag();
			break;
		case "mouseUp" :
			bolaMC.stopDrag();
			break;
	}
}

Segundo modo de DRAG – (ESTRELA AZUL)
startDrag() e stopDrag() a partir do seu ponto (0,0);

Para fazer isso apenas coloque true no parâmetro lockCenter do startDrag():

bolaMC.startDrag(true);

O objeto se deslocará colocando o seu ponto(0,0) na posição do mouse.

Terceiro modo de DRAG – (QUADRADO VERDE)
Coloca o ponto (0,0) do objeto no valor x e y do mouse, similar ao startDrag(true).

Como no primeiro iniciamos pegando os eventos MOUSE_DOWN e MOUSE_UP do objeto, mas agora iremos também usar o evento ENTER_FRAME para executar a função que moverá o objeto para a posição do mouse.
Primeiro declaramos a variável booleana quadradoDrag que nos dirá se o objeto deverá ou não seguir o mouse.
Na função controleQuadrado dizemos para a variável quadradoDrag que deve seguir quando o evento for MOUSE_DOWN e que não deve quando for o evento MOUSE_UP.
Na função loop que é chamada a cada frame devido ao evento ENTER_FRAME, verificamos se o quadradoDrag está sinalizando para mover e atribuímos o valor x e y do mouse para o valor x e y do objeto respectivamente.

quadradoMC.addEventListener(Event.ENTER_FRAME , loopQuadrado);
quadradoMC.addEventListener(MouseEvent.MOUSE_DOWN , controleQuadrado);
stage.addEventListener(MouseEvent.MOUSE_UP , controleQuadrado);
var quadradoDrag:Boolean = false;
function controleQuadrado(event:MouseEvent):void {
	switch (event.type) {
		case "mouseDown" :
			quadradoDrag = true;
			break;
		case "mouseUp" :
			quadradoDrag = false;
			break;
	}
}
function loopQuadrado(event:Event):void{
	if(quadradoDrag){
		quadradoMC.x = mouseX;
		quadradoMC.y = mouseY;
	}
}

Quarto modo de DRAG – (TRIÂNGULO VERMELHO)
Calculando a posição do mouse e subtraindo a posição de onde foi clicado sobre o objeto, similar ao startDrag().

Funciona da mesma forma que o terceiro tipo, mas agora ao invés de uma variável dizer que deve seguir, usaremos um objeto Pointer, que serve para armazenar dois pontos, x e y, acessível via ponto.x e ponto.y
Iniciamos com a variável offset do tipo Point setada em null, que quer dizer que não tem nada armazenado nela.
Quando a função de controle é chamada pelo evento MOUSE_OVER, pegamos a posição do mouse relativa ao ponto (0,0) do objeto, como mostra a imagem abaixo.

Quando a função de controle é chamada pelo evento MOUSE_UP, setamos null novamente, para offset para zerar o objeto.
E na função de loop verificamos se o offset não é null, se for não fazemos nada, se tiver valores dentro dele, pegamos a posição do mouse e subtraímos a posição do mouse relativa que foi setada no evento MOUSE_OVER e passamos para o objeto.

trianguloMC.addEventListener(Event.ENTER_FRAME , loopTriangulo);
trianguloMC.addEventListener(MouseEvent.MOUSE_DOWN , controleTriangulo);
stage.addEventListener(MouseEvent.MOUSE_UP , controleTriangulo);
var offset:Point = null;
function controleTriangulo(event:MouseEvent):void {
	switch (event.type) {
		case "mouseDown" :
			offset = new Point(event.localX , event.localY);
			break;
		case "mouseUp" :
			offset = null;
			break;
	}
}

function loopTriangulo(event:Event):void{
	if(offset != null){
		trianguloMC.x = mouseX - offset.x;
		trianguloMC.y = mouseY - offset.y;
	}
}

No exemplo coloquei mais um função que faz o objeto clicado ficar sobre os demais, não vou explicar isso, pois não é o foco deste post, mas está aplicado no .fla que está para download abaixo.

DOWNLOAD
startDrag.zip

Share