Posts Tagged ‘unity3d’

detonator – unity3D

October 9th, 2009


Show de biblioteca de explosoes para unity3D !!

unity3d passo 6 – tudo junto num jogo

September 30th, 2009

drop than all alpha1
Esta eh uma versao mais arrumada destas minhas investigacoes do Unity3D.

Alguns comentarios sobre o codigo abaixo que eh novinho em folha.

static var dead:int = 0;

function Awake () {
	dead = 0;
}

function OnCollisionEnter(collision : Collision) {

	if( collision.collider.name == "bottom" || collision.collider.tag == "enemy"){
		dead = 1;
		var message = GameObject.Find("end of level");
		var message2 = GameObject.Find("end of level2");
		message.guiText.text = "You failed.";
		message2.guiText.text = "Click to restart";
		audio.Play();
	}
}

function Update () {

	if( dead == 1 ){
		if (Input.GetButtonDown("Fire1")) {
			Application.LoadLevel (Application.loadedLevel);
		}
	}

}

Este codigo esta associado ao personagem que esta em movimento, ou seja se o danado colidir com o plano chamado “bottom” que esta abaixo das plataformas, ou com algum dos inimigos a variavel dead eh setada para 1, algumas mensagens sao exibidas e o som correspondente toca.

Quando estiver neste estado de “morto” (dead==1) o update deste mesmo script vai verificar se o click foi pressionado para ai entao recarregar a cena atual, detalhe que a funcao Awake garante que nao reiniciamos a cena com o personagem morto :) porque a variavel eh static e portanto o reload da cena nao apaga seu valor.

usei esta variavel em outros pontos do de outros scripts, como por exemplo para impedir que o tiro fosse disparado ou o personagem movimentado se estivesse no estado de morto, veja como foi usado

var speed:int = 10.0;

function FireRocket () {
	// dont fire if the char is dead
	if (restart_if_char_die.dead == 1) return;
	if( count_enemies.end_level == 1) return;

	var bullet = GameObject.CreatePrimitive(PrimitiveType.Sphere);
	bullet.tag = "bullet";
	bullet.AddComponent(Rigidbody);

	bullet.transform.position = transform.position;
	bullet.transform.rotation= transform.rotation;
	bullet.transform.localScale= transform.localScale;

    bullet.rigidbody.velocity = transform.forward * speed * -1;
	bullet.rigidbody.mass = 5;
	audio.Play();
}

function Update () {
    if (Input.GetButtonDown("Fire1")) {
        FireRocket();
    }
}

bom eh isto ae divirta-se jogando as caixinhas do alto, pena que elas nao gritam :)

unity3d passo 5 – quero te falar …

September 30th, 2009

Alem das coisas em 3D que giram explodem e coisa e tal precisamos de textos 2D pendurados em alguns lugares da tela, para isto adicionamos um GUIText, e o legal do GUIText eh o seu posicionamento na tela, que eh bem simples usando somente as coordenadas X e Y (2D pelamordeDEus) no intervalo de 0 a 1.

canto superior esquerdo : X=0 e Y=1
canto superior direito : X=0.9 e Y=1
canto inferior esquerdo : X=0 e Y=0.1
canto inferior direito : X=0.9 e Y=0.1

bons texto pra vc :)

unity3d passo 4 – quando as coisas se encontram

September 30th, 2009

Nada como controlar colisao para fazer as coisas acontecerem em um jogo, algumas referencias sao base para isto :

ScriptReference/Collision.html
a funcao OnCollisionEnter e os detalhes do objeto de colisao o Collider

para testar quero remover o cubo do jogo se ele colidir com o personagem, considerando que o nome do personagem eh char teriamos algo assim :

function OnCollisionEnter(collision : Collision) {

	if( collision.collider.name == "char" ){
		Destroy( gameObject );
	}
}

E este script deve ser adicionado ao prefab que dara origem a todos os cubos assim nao temos de recriar ou reassociar script a cada um dos elementos da tela.

Contagem de inimigos

Outra funcao importante eh contar itens na tela no caso quero contar quantos inimigos ainda estao na cena, o codigo usa o metodo Find da class GameObject e o metodo de FindGameObjectsWithTag ,

[/code]
function Update () {
var enemies = GameObject.FindGameObjectsWithTag ("enemy");
var counter = GameObject.Find("enemies counter");
counter.guiText.text = "enemies found : " + enemies.length;
}
[/code ]

Note que o "enemies counter" eh um GUIText que esta sendo usado para indicar quantos inimigos estao ativos na cena.

unity3d passo 3 – tiros e mais tiros !

September 30th, 2009

tank drop
jogue a versao atual ! tankdrop-20090929

link que salvou a noite :)
unity3d.com/support/documentation/ScriptReference/index.html

Varias novidades exploradas nesta versao

  • disparo de tiro
  • criacao de cena de menu princial
  • carga de objeto no formato 3ds
  • camera de ladinho
  • Uso de fontes TTF

vamos falar primeiro do disparo do tiro. A ideia inicial era de calcular para que direçao o tanque esta apontando e criar um novo objeto com um rigid body e em alta velocidade na mesma direcao do tanque. Era uma boa intencao mas as contas de determinar para que direcao ficaram um pouco chatinhas, dai tive a ideia de criar um subobjeto do tanque, que eh um quadradinho na posicao onde quero que saia o tiro e adicionei um script a este cubinho, algo assim

var speed = 150.0;

function FireRocket () {
	var bullet = GameObject.CreatePrimitive(PrimitiveType.Sphere);
        bullet.AddComponent(Rigidbody);
	bullet.transform.position = transform.position;
	bullet.transform.rotation= transform.rotation;
	//bullet.transform.localScale= transform.localScale;
    bullet.rigidbody.velocity = transform.forward * speed * -1;
	bullet.rigidbody.mass = 3;
}

function Update () {
    if (Input.GetButtonDown("Fire1")) {
        FireRocket();
    }
}

um detalhe importante que demorei para acertar eh a rotacao do quadradinho de origem do tiro, acabei verificando que rotacionando Y em 270 fica na posicao certa do tiro. e Se for necessario redimensionar o projetil para o tamanho do quadrado por exemplo, basta descomentar o trecho “bullet.transform.localScale= transform.localScale;” que vai reproduzir a mesma escala aplicada ao quadrado para o projetil.

a massa do projetil eh interessante se vc deseja que o tiro vah arrastando coisas com controle fisico pelo caminho, faltou adicionar um som e umas particulas de fumaca na hora do tiro mas jah jah coloco isto :)

A novela do menu principal
para mim o mais dificil foi alinhar a camera com o cubo que resolvi colocar como fundo da tela principal, mas depois me manquei que bastava colocar todo mundo na origem, cubo e camera, e depois ir afastando a camera aos pouquinhos. Nem sei ainda se esta eh a melhor maneira, mas funcionou :)

O efeito de fazer o texto cair, fiz com a criacao de duas caixas, sendo a de cima com rigidbody e suspensa no ar, logo quando inicia a cena a caixa cai, criei um GUI Text como subobjeto da caixa que cai e pronto o texto cai acompanhando a caixa, e para que as caixas em questao nao tivessem nenhum tipo de rederizacao removi o componente Mesh Renderer de cada um.

e para realizar a transicao para a proxima cena, usei o seguinte script que anexei no GuiText “Play”

function Update () {
    if (Input.GetButtonDown("Fire1")) {
		Application.LoadLevel (1);
	}
}

Observe que o numero do level fica determinado na tela de configuracao do build “File / Build Settings”, e lembre-se de nunca ficar mexendo as cenas pelos diretorios :) fiz isto e deu uma baguncada boa nos build settings hehehe.

carga de objeto no formato 3ds
Foi muito sem graça hehehe baixei o arquivo do www.turbosquid.com/ (fica atento que se na hora da busca ordenar pelo menor preco tem varios modelos de graça) descompactei e arrastei sobre o projeto, e arrastei sobre a cena, mudei a escala e pronto todos felizes com o RV2 tank como subobjeto do meu “char”

camera de ladinho
A camera smooth follow nao servia para o que eu queria, o que eu precisava eh uma camera que acompanhasse o tanque mas q quando ele rodasse nao rodasse junto, ou seja uma smotth follow sem rotation :) dei uma canibalizada na smotth follow e sobrou isto aqui

var target : Transform;
var distance = 10.0;
var height = 5.0;

// Place the script in the Camera-Control group in the component menu
@script AddComponentMenu("Camera-Control/Smooth Follow - no rotation")

function LateUpdate () {
	if (!target)	return;

	wantedHeight = target.position.y + height;
	currentHeight = transform.position.y;
	currentHeight = Mathf.Lerp (currentHeight, wantedHeight, Time.deltaTime);

	transform.position = target.position;
	transform.position -= Vector3.forward * distance;

	transform.position.y = currentHeight;
	transform.LookAt (target);
}

O Legal das fontes eh lembrar de criar um objeto de fonte para cada tamanho que sera usado, tirando este detalhe eh bem transparente o uso facim facim, arrasta o arquivo da fonte para o projeto e pimba troca o tamanho e da apply que o unity gera a imagem da fonte no tamanho que eh necessario.

unity3d passo 2

September 25th, 2009

unity screenshot passo 2

Mais coisas interessantes no Unity3D, algumas teclas de atalho interessantes : a sequencia QWER muda a forma de manipulacao dos objetos, e de acordo com a forma que estiver selecionada, quando vc clica no fundo muda a forma como arrastar o mouse sobre a tela vai mudar a sua visualização da scene enquanto estiver trabalhando. isto me deu uma dor de cabeça de primeira heheheh como me achar com os oibjetos 3D :)

outra coisa nova descoberta, como debugar ! basta usar o objeto Debug :) facil facil.

Fiz um script para um elevador, funcionou como esperado veja soh como ficou o codigo :

// smaller value
var start:float;

//greater value
var end:float;
var speed: int = 15;
var direction: int = 1;
var sleep:float = 4000;
var elapsed:float = 0;

function Update () {

	var y = speed * Time.deltaTime * direction;

	// check if the limit is reach and inverse the direction
	if( elapsed <= 0 ){
		if( direction == 1 ){
			if( transform.position.y + y > end ){
				transform.position.y = end;
				elapsed = sleep;
				direction = -1;
			}else {
				transform.Translate(0 , y, 0 );
			}
		} else {
			if( transform.position.y + y < start ){
				transform.position.y = start;
				elapsed = sleep;
				direction = 1;
			}else {
				transform.Translate(0 , y, 0 );
			}
		}
	} else {
		elapsed = elapsed - Time.deltaTime;
	}

	Debug.Log(elapsed);
}

Este codigo eh arrastado sobre um gameObject que no caso eh um plano, e determino o Y inicial do objeto e o Y final, o tempo que o elevador fica parado em sleep, e a velocidade que vai se deslocar. fica assim na interface :
unity script details elevator

Outro aprendizado importante foi como criar materiais, usa Asset / Create / Material e pronto ! dai vc configura os detalhes do material e aplica o material sobre o objeto desejado.

o controle do personagem ainda esta engraçado heheheh tipo quando cai e vira de cabeça para baixo inverte tudo :) ainda estou pensando no que fazer, estou com as seguintes opções em mente :

  • Nao deixar o personagem virar
  • Controlar se ele virou e inverter a transformacao para refletir que esta virado
  • Mudar a forma de controlar para ficar parecido com um carro, usando as setas para controlar o volante, e acelerando com seta para cima

unity3d passo 1

September 22nd, 2009

movebox1
Esta eh a primeira aventura com o Unity3D, graças a um esperto tutorial do Erick consegui dar os primeiros passos no Unity3D !! o resultado pode ser encontrado aqui : move-box1

Quero registrar alguns passos importantes que aprendi :

1. O chao vira chao quando vc chama ele de chao :) hehehehe neste exemplo adicionei um cubo usando a opcao : ‘Game Object / Create Other / Cube’, fiz ele ficar mais larguinho para dar mais estabilidade ao movimento e adicionei o component de corpo rigido atraves de : ‘Component / Physics / Rigid Body’ pronto isto bastaria para todos serem felizes e o cubo nao passar do chao quando dah o play.

2. nao entendi ainda como usar um Shader para cada elemento heheheh quando mudo a cor do plano muda a cor da rampinha que fiz

3. adicionei um codigo javascript e arrastei sobre o cubo, pronto !! o metodo update implementado fica valendo para o objeto, e uma variavel que declarei no codigo : var speed:int ficou on inspector do objeto, simplim simplim

olha o codigo usado para o controle de teclado:

var speed: int;
function Update () {
    var x = Input.GetAxis("Horizontal") * speed * Time.deltaTime;
    var y = 0;
    var z = Input.GetAxis("Vertical") * speed * Time.deltaTime;
    transform.Translate(x , y, z );
}

4. e este links salvaram o dia
documentacao sobre o gameplay
documentacao sobre a fisica
documentacao sobre o input
post sobre movimentacao com teclas

por enquanto eh soh, depois tem mais

thumbledrop in 2

March 21st, 2009

ahhahaha in two moves !
thumbledrop-in-2

http://www.tumbledrop.com/