Neste artigo vamos fazer um jogo simples, o clássico Pacman em 3D. Para isso vamos utilizar o Unity 3D, claro.
Vamos começar por criar um projeto novo.
O jogo vai começar num menu simples e é por aí que vamos começar. Assim vamos adicionar um botão.
Ao adicionar o botão o Unity adiciona um Canvas. Este elemento configura a visualização do nosso menu pelo utilizador, assim é fundamental posicionar o botão dentro do canvas para que este seja visível.
O passo seguinte é adicionar um ficheiro de código C# e criar a função que vamos associar com o evento clique no botão. Com o botão direito do rato clicar na janela do projeto escolher create C# script.
Abre o ficheiro com duplo clique e insere o seguinte código.
public class Menu : MonoBehaviour {
//function click for the button
public void button_click()
{
SceneManager.LoadScene(1);
}
}
Nesta nova cena vamos adicionar um plano para servir de chão e uns cubos para servirem de paredes.
Para cada um destes elementos vamos criar um material. No caso do chão pretendemos utilizar uma textura, assim adicionamos um material novo ao projeto e configuramos de acordo com a imagem.
O campo Albedo tem uma textura adicionada e os campos metallic e smoothness foram alterados para ajustar a textura ao aspeto pretendido. Quanto ao Tiling (repetição da textura) ficou em 5 para X e para Y.
Ao posicionar os elementos é importante controlar as suas coordenadas assim o chão deve ficar em 0,0,0 e os restantes objetos posisionados com o chão como referência.
A cena/nível deve ficar como a seguir se apresenta.
Agora vamos criar o jogador. Para isso vamos utilizar uma esfera e código fornecido pelo Unity, graças ao criador, do Unity.
Vamos a GameObject, o menu, e escolhemos 3D Object e, dentro deste, Sphere.
O código que vamos utilizar faz parte dos Assets do Unity, assim há-que o importar. Em Assets escolher Import Package e depois Characters.
Navegar até à pasta Scripts, dentro de RollerBall, dentro de Characters, dentro de Standar Assets.
Encontra lá dois ficheiros (Ball e BallUserControl) que deve associar à esfera que representará o jogador.
De seguida adicionamos um Rigidbody à esfera, assim.
Um rigidbody é um componente que atribui ao objeto um comportamento em conformidade com as leis da física, como a gravidade.
Neste momento a esfera já deve responder ao input do jogador. Pode ser necessário ajustar algumas propriedades do código da esfera como por exemplo Move Power e também é importar posicionar a câmara para que o nível esteja totalmente visível.
A esfera deve ter uma tag do tipo Player. As tags permitem agrupar os objetos por forma que seja possível aplicar código a um grupo de elementos,
Quem é que vais chamar? Os caça fantasmas! Sim agora temos os fantasmas que vão perseguir o jogador pelo nível.
O fantasma é composto por uma cápsula (capsule) e um ficheiro de código que vamos criar mas o mais importante é o componente que vai permitir ao fantasma percorrer o nível em busca do jogador que é um Nav Mesh Agent. Para que as colisões com o jogador sejam detetadas corretamente adicionamos um Character Controller, sem este elemento não são detetadas colisões quando o jogador não se move.
Agora adicionamos um script novo com o nome GhostScript e vamos inserir o código.
public class ghostScript : MonoBehaviour {
public GameObject target; //this is the player or a reference for him
NavMeshAgent agent; //this is a reference for the ghost navmeshagent component
// Use this for initialization
void Start () {
agent = GetComponent<NavMeshAgent>();
if (target == null)
target = GameObject.FindGameObjectWithTag("Player");
}
// Update is called once per frame
void Update () {
//this is for updating the target location
agent.destination = target.transform.position;
}
//function to detect when the ghost gets the player
public void OnCollisionEnter(Collision collision)
{
if (collision.gameObject.tag == "Player")
SceneManager.LoadScene("menu");
}
}
Para que o componente Nav Mesh Agent funcione é necessário definir o plano do chão como estático e depois na barra Navigation fazer o Bake da informação necessário para o pathfinding do fantasma.
As áreas que são "caminháveis" estão a azul.
Neste momento o fantasma já deve mover-se e perseguir o jogador para onde quer que ele vá. Ao colidir com o jogador o jogo deve apresentar o menu de novo, para isso é necessário definir as cenas que fazem parte do projeto assim é necessário ir a File - Build Settings e adicionar os níveis pretendidos, para isso basta arrasta-los da barra do projeto.
Só falta definir a área que permite passar para o nível seguinte. Para isso vamos adicionar um Empty Game Object e adicionar-lhe um Box Collider definido como trigger, para que seja possível entrar dentro dele. Como se vê na imagem seguinte.
E agora o código.
public class nextLevelScript : MonoBehaviour {
public void OnTriggerEnter(Collider collider)
{
if (collider.tag == "Player")
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex + 1);
}
}
Este tutorial está disponível em vídeo.
O código do projeto está disponível no GitHub
Vamos começar por criar um projeto novo.
O jogo vai começar num menu simples e é por aí que vamos começar. Assim vamos adicionar um botão.
Ao adicionar o botão o Unity adiciona um Canvas. Este elemento configura a visualização do nosso menu pelo utilizador, assim é fundamental posicionar o botão dentro do canvas para que este seja visível.
O passo seguinte é adicionar um ficheiro de código C# e criar a função que vamos associar com o evento clique no botão. Com o botão direito do rato clicar na janela do projeto escolher create C# script.
Abre o ficheiro com duplo clique e insere o seguinte código.
public class Menu : MonoBehaviour {
//function click for the button
public void button_click()
{
SceneManager.LoadScene(1);
}
}
O ficheiro criado pelo Unity é uma classe derivada da classe MonoBehaviour e que inclui duas funções (Start e Update) que, para este caso, não necessitamos, por isso foram eliminadas.
Agora adicionamos o script criado ao canvas. De seguida selecionamos o botão e configuramos o evento On Click associando ao canvas e depois à função button_click.
Agora que temos o menu pronto vamos guardar a cena com nome menu e adicionar uma cena nova.
Para cada um destes elementos vamos criar um material. No caso do chão pretendemos utilizar uma textura, assim adicionamos um material novo ao projeto e configuramos de acordo com a imagem.
O campo Albedo tem uma textura adicionada e os campos metallic e smoothness foram alterados para ajustar a textura ao aspeto pretendido. Quanto ao Tiling (repetição da textura) ficou em 5 para X e para Y.
Ao posicionar os elementos é importante controlar as suas coordenadas assim o chão deve ficar em 0,0,0 e os restantes objetos posisionados com o chão como referência.
A cena/nível deve ficar como a seguir se apresenta.
Agora vamos criar o jogador. Para isso vamos utilizar uma esfera e código fornecido pelo Unity, graças ao criador, do Unity.
Vamos a GameObject, o menu, e escolhemos 3D Object e, dentro deste, Sphere.
O código que vamos utilizar faz parte dos Assets do Unity, assim há-que o importar. Em Assets escolher Import Package e depois Characters.
Navegar até à pasta Scripts, dentro de RollerBall, dentro de Characters, dentro de Standar Assets.
Encontra lá dois ficheiros (Ball e BallUserControl) que deve associar à esfera que representará o jogador.
De seguida adicionamos um Rigidbody à esfera, assim.
Um rigidbody é um componente que atribui ao objeto um comportamento em conformidade com as leis da física, como a gravidade.
Neste momento a esfera já deve responder ao input do jogador. Pode ser necessário ajustar algumas propriedades do código da esfera como por exemplo Move Power e também é importar posicionar a câmara para que o nível esteja totalmente visível.
A esfera deve ter uma tag do tipo Player. As tags permitem agrupar os objetos por forma que seja possível aplicar código a um grupo de elementos,
Quem é que vais chamar? Os caça fantasmas! Sim agora temos os fantasmas que vão perseguir o jogador pelo nível.
O fantasma é composto por uma cápsula (capsule) e um ficheiro de código que vamos criar mas o mais importante é o componente que vai permitir ao fantasma percorrer o nível em busca do jogador que é um Nav Mesh Agent. Para que as colisões com o jogador sejam detetadas corretamente adicionamos um Character Controller, sem este elemento não são detetadas colisões quando o jogador não se move.
Agora adicionamos um script novo com o nome GhostScript e vamos inserir o código.
public class ghostScript : MonoBehaviour {
public GameObject target; //this is the player or a reference for him
NavMeshAgent agent; //this is a reference for the ghost navmeshagent component
// Use this for initialization
void Start () {
agent = GetComponent<NavMeshAgent>();
if (target == null)
target = GameObject.FindGameObjectWithTag("Player");
}
// Update is called once per frame
void Update () {
//this is for updating the target location
agent.destination = target.transform.position;
}
//function to detect when the ghost gets the player
public void OnCollisionEnter(Collision collision)
{
if (collision.gameObject.tag == "Player")
SceneManager.LoadScene("menu");
}
}
Para que o componente Nav Mesh Agent funcione é necessário definir o plano do chão como estático e depois na barra Navigation fazer o Bake da informação necessário para o pathfinding do fantasma.
As áreas que são "caminháveis" estão a azul.
Neste momento o fantasma já deve mover-se e perseguir o jogador para onde quer que ele vá. Ao colidir com o jogador o jogo deve apresentar o menu de novo, para isso é necessário definir as cenas que fazem parte do projeto assim é necessário ir a File - Build Settings e adicionar os níveis pretendidos, para isso basta arrasta-los da barra do projeto.
Só falta definir a área que permite passar para o nível seguinte. Para isso vamos adicionar um Empty Game Object e adicionar-lhe um Box Collider definido como trigger, para que seja possível entrar dentro dele. Como se vê na imagem seguinte.
E agora o código.
public class nextLevelScript : MonoBehaviour {
public void OnTriggerEnter(Collider collider)
{
if (collider.tag == "Player")
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex + 1);
}
}
Este tutorial está disponível em vídeo.
O código do projeto está disponível no GitHub
Comentários
Enviar um comentário