Trocas de personagens de Obscure 2 com Unity 2017

Aprenda a intercalar personagem utilizando o Unity 2017 no estilo do jogo Obscure 2.

Publicado em

ObsCure II é um jogo estilo Survival horror desenvolvido pela Hydravision, lançado em 2007 para Playstation 2, Nintendo Wii e PC. Este é o segundo jogo da série Obscure. Em relação ao primeiro game da série, ObsCure 2 possui melhores gráficos, uma quantidade maior de personagens controláveis, maior dificuldade e tempo de duração. O jogo se passa em diversos cenários, como na faculdade de Fallcreek, Hospital, Florestas, entre muitos outros.  A trilha sonora do jogo também é muito marcante, principalmente em cenas onde os personagens são psicologicamente abalados por alguma tragédia.

O jogo possui diversos puzzles, em alguns dos casos, eles precisam ser solucionados com personagens específicos, como Hackear uma porta logo no início do jogo com a personagem Mei.

O tempo todo o jogador pode intercalar entre personagens, e em lugares específicos quando toda a turma está reunida, você pode escolher quem fará parte da sua dupla. Cada jogador possui determinadas habilidade, como:

Stan Jones: Sua habilidade é destrancar portas com uma espécie de arame.

Amy Brookes: Está é uma garota muito atraente, mas não se deixe levar por isso, ela é extremamente inteligente e responsável por resolver diversos puzzles durante todo o game.

Shannon Matthews: Após uma contaminação com uma flor, ela possui habilidade de controlar áureas negras, assim liberando passagens para que o jogador possa progredir no game.

Agora que você conheceu um pouco do jogo ou relembrou de quando jogava, confira as duas videoaula abaixo de como recriar esta estrutura.

Parte 1 – Preparando o ambiente

Parte 2 – Trocando os personagens

Confira os scripts utilizados nas videoaula.

Player.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{

    private Animator _anima;

    public GameObject _pontToRaycast = null;
    public float _velocidadeRotacao = 10;
    public static bool _controlar = true;
    private bool _proximoPlayer = false;
    private string _playerName = "";
    void Start()
    {
        _anima = this.GetComponent<Animator>();
    }

    void FixedUpdate()
    {
        _proximoPlayer = false;
        if (_pontToRaycast != null)
        {
            RaycastHit hit;

            if (Physics.Raycast(_pontToRaycast.transform.position, _pontToRaycast.transform.forward, out hit, 3))
            {
                Vector3 forward = transform.TransformDirection(Vector3.forward) * 10;
                Debug.DrawRay(_pontToRaycast.transform.position, forward, Color.red);

                if (hit.collider.GetComponent<Player>())
                {
                    _playerName = hit.collider.gameObject.name;
                    _proximoPlayer = true;
                }
            }
        }
    }

    void Update()
    {
        if (_controlar)
        {
            _anima.SetFloat("Andar", Input.GetAxis("Vertical"));
            this.transform.Rotate(0, ((_velocidadeRotacao * Input.GetAxis("Horizontal")) * Time.deltaTime), 0);

            if (_proximoPlayer == true && Input.GetKeyDown(KeyCode.Space))
            {
                PlayerController._playerName = _playerName;
            }
        }
    }
}

PlayerController.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour
{

    public GameObject[] _jogadores = new GameObject[4];
    public int[] _dupla = new int[2];
    public static string _playerName = "";

    private int _playerAtual;
    private int _indiceAtual = 0;
    void Start()
    {
        _playerAtual = _dupla[0];
        AlterarPlayer(_dupla[1]);
    }


    void Update()
    {
        if (_playerName != "")
        {
            int _parceiroPos = TrocarParceiro(_playerName);

            if (_parceiroPos >= 0)
            {
                if (_indiceAtual == 0)
                {
                    _dupla[1] = _parceiroPos;
                    AlterarPlayer(_dupla[0]);
                }
                else
                {
                    _dupla[0] = _parceiroPos;
                    AlterarPlayer(_dupla[1]);
                }
            }
            _playerName = "";
        }


        if (Input.GetKeyDown(KeyCode.Tab))
        {
            if (_playerAtual == _dupla[0])
            {
                _indiceAtual = 1;
                _playerAtual = _dupla[1];
                AlterarPlayer(_dupla[0]);
            }
            else
            {
                _indiceAtual = 0;
                _playerAtual = _dupla[0];
                AlterarPlayer(_dupla[1]);
            }
        }
    }

    private void AlterarPlayer(int _playerAntigo)
    {
        _jogadores[_playerAntigo].GetComponent<Player>().enabled = false;
        _jogadores[_playerAntigo].transform.GetChild(0).gameObject.SetActive(false);

        _jogadores[_playerAtual].GetComponent<Player>().enabled = true;
        _jogadores[_playerAtual].transform.GetChild(0).gameObject.SetActive(true);
    }

    private int TrocarParceiro(string name)
    {
        int _pos = -1;

        for (int i = 0; i < _jogadores.Length; i++)
        {
            if (_jogadores[i].gameObject.name == name)
            {
                _pos = i;
            }
        }

        return _pos;
    }
}

Espero que tenha, gostado, dúvidas, criticas e sugestões são muito bem-vindas!

Gunnar Correa
Gunnar Correa

Autodidata, Graduado em Desenvolvimento Web, Especialista em Tecnologias na Educação e Pós-graduando em Segurança da Informação. Começou seus estudos na área de programação quando era criança, e atualmente, está estudando desenvolvimento de jogos. Fundador da SatellaSoft, criado em 2009 com o intuito de compartilhar conhecimento de forma gratuita e inédita.

Todos os nossos cursos em promoção
Todos os nossos cursos em promoção

Webstories

Todos os nossos cursos em promoção


Deixe um comentário
Aguarde...
Todos os nossos cursos em promoção