Thursday, February 25, 2016

Adding GAME OVER and YOU WIN

You can download the unity file here LINK.

The changes are:

In Unity add a box at the goal area, set its collision box to be a trigger and add a script called GoalAI, here is the code:

using UnityEngine;
using System.Collections;

public class GoalAI : MonoBehaviour {
    public PlayerController playerControl;
    public ManagerAI manager;
// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {

}
    void OnTriggerEnter(Collider other)
    {
        if (other.tag == "Player")
        {
            manager.playerWon();
            playerControl.playerWon();
        }
    }
}


Now update the playerController script, here is the script updated:

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

public class PlayerController : MonoBehaviour {

    public ManagerAI manager;
private int health;
    private bool playerWonFlag;
    public List<GameObject> bullets;

// Use this for initialization
void Start () {
health =3;
        playerWonFlag = false;
}

private void shoot (Vector3 startPoint, Vector3 target)
{
foreach(GameObject bullet in bullets)
{
if(bullet.GetComponent<bulletAI>().isFree())
{
bullet.GetComponent<bulletAI>().shoot(startPoint, target);
break;
}
}

}
// Update is called once per frame
void Update () {
if(health <1 || playerWonFlag == true)
{
return;
}
float speed = 10 * Time.deltaTime;
Vector3 pos = this.GetComponent<Transform>().position;

Vector3 mousePoint = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 10f ));
mousePoint.y = pos.y;

if(Input.GetKeyDown(KeyCode.Mouse0))
{
shoot(pos, mousePoint);
}

if(Input.GetKey(KeyCode.UpArrow))
{
pos.z += speed;
}
if(Input.GetKey(KeyCode.DownArrow))
{
pos.z -=speed;
}
if(Input.GetKey(KeyCode.RightArrow))
{
pos.x += speed;
}
if(Input.GetKey(KeyCode.LeftArrow))
{
pos.x -= speed;
}
this.GetComponent<Transform>().position = pos;


  this.GetComponent<Transform>().LookAt(mousePoint);

}

public void playerHit(Vector3 hitPoint)
{
Vector3 direction = this.GetComponent<Transform>().position - hitPoint;

this.GetComponent<Rigidbody>().velocity = direction.normalized * 20;
AudioSource source = this.GetComponent<AudioSource>();
source.Play();

health = health-1;
if(health <1)
{
die();
}

//Debug.Log ("Hit");
}

private void die ()
{
this.GetComponent<Transform>().Rotate(new Vector3 (90.0f, 0, 0));
        manager.playerLost();
}

    public void playerWon()
    {
        playerWonFlag = true;
    }
}

Now update the ManagerAI script, here is the updated code:

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

public class ManagerAI : MonoBehaviour {

    private float GENERATE_TIME_INTERVAL = 2;
    private int GAMESTATE_PLAYING = 0;
    private int GAMESTATE_DEAD    = 1;
    private int GAMESTATE_WIN     = 2;

    public Text UIText;

    public List<GameObject> enemies;
    public List<GameObject> generators;

    private int gameState;

    public GameObject player;

    private float curTime;
    
    // Use this for initialization
void Start ()
    {
        UIText.text = "";
        gameState = GAMESTATE_PLAYING;
        curTime = 0;
}
// Update is called once per frame
void Update () 
    {
        if (gameState == GAMESTATE_PLAYING)
        {
            curTime += Time.deltaTime;
            if (curTime > GENERATE_TIME_INTERVAL && enemyIsAvailable())
            {
                //Debug.Log("Update Manager AI");
                curTime = 0;
                generateEnemyCloseToPlayer();
            }
        }
}

    private void idleEnemies()
    {
        foreach(GameObject enemy in enemies)
        {
            enemy.GetComponent<EnemyAI>().stopHunting();   
        }
    }

    public void playerWon()
    {
        gameState = GAMESTATE_WIN;
        idleEnemies();
        UIText.text = "YOU WIN!";
    }

    public void playerLost()
    {
        gameState = GAMESTATE_DEAD;
        idleEnemies();
        UIText.text = "GAME OVER";
    }

    private bool enemyIsAvailable()
    {
        foreach (GameObject enemy in enemies)
        {
            if (enemy.GetComponent<EnemyAI>().isEnemyIdle())
            {
                return true;
            }
        }

        return false;
    }

    private void generateEnemyCloseToPlayer()
    {
        Vector3 genPos = getGeneratorCloserToPlayer().GetComponent<Transform>().position;
        genPos.y += 0.3f;
        GameObject enemy = null;
        foreach (GameObject curEnemy in enemies)
        {
            //Debug.Log("generateENemy");
            if (curEnemy.GetComponent<EnemyAI>().isEnemyIdle())
            {
                curEnemy.GetComponent<Transform>().position = genPos;
                curEnemy.GetComponent<EnemyAI>().startHunting();
                break;
            }
        }
        
    }

    private GameObject getGeneratorCloserToPlayer()
    {
        GameObject closerGenerator = null;
        foreach(GameObject generator in generators)
        {
            //Debug.Log("getGeneratorCloser");
            if (closerGenerator == null)
            {
                closerGenerator = generator;
            }
            else
            {
                Vector3 posOne      = closerGenerator.GetComponent<Transform>().position;
                Vector3 posTwo      = generator.GetComponent<Transform>().position;
                Vector3 playerPos   = player.GetComponent<Transform>().position;

                float distOne = Vector3.Magnitude(playerPos - posOne);
                float distTwo = Vector3.Magnitude(playerPos - posTwo);
                if (distTwo < distOne)
                {
                    closerGenerator = generator;
                }

            }
        }
        return closerGenerator;
    }

    
}

Update the EnemyAI script, here is the updated script:

using UnityEngine;
using System.Collections;

public class EnemyAI : MonoBehaviour {

private int STATE_IDLE=0;
private int STATE_HUNTING=1;
private int STATE_DEAD=2;

public int aiState;
public GameObject m_player;
private float waitTime;
private Vector3 idlePos; 

// Use this for initialization
void Start () 
    {
idlePos = this.GetComponent <Transform>().position;
        aiState = STATE_IDLE;

}

    public bool isEnemyIdle()
    {
        return (aiState == STATE_IDLE);
    }

    public void startHunting()
    {
        aiState = STATE_HUNTING;
    }

// Update is called once per frame
void Update () 
    {
        
        if(aiState == STATE_HUNTING)
{
if(waitTime >= 0)
{
waitTime -= Time.deltaTime;
//Debug.Log ("time " + waitTime);
}
else
{

Vector3 playerPos = m_player.GetComponent<Transform>().position;
Vector3 pos  = this.GetComponent<Transform>().position;
this.GetComponent<Transform>().position = Vector3.MoveTowards(pos, playerPos, 0.07f);
}
}
else if(aiState == STATE_DEAD)
{
if(waitTime >= 0)
{
waitTime -= Time.deltaTime;

}
else
{
reset ();
}
}
else
{

//Debug.Log ("Idle");
// DO NOTHING
}
}

private void reset()
{
aiState = STATE_IDLE;
this.GetComponent<Transform>().position = idlePos;
this.GetComponent<Rigidbody>().constraints = RigidbodyConstraints.FreezeRotationX | RigidbodyConstraints.FreezeRotationY | RigidbodyConstraints.FreezeRotationZ;
this.GetComponent<Transform>().rotation = Quaternion.Euler(new Vector3(0,0,0));
aiState = STATE_IDLE;
}

void OnTriggerEnter(Collider other)
{
if(aiState == STATE_DEAD )
{
return;
}

if(other.tag == "Player")
{
waitTime = 0.5f;
m_player.GetComponent<PlayerController>().playerHit(this.GetComponent<Transform>().position);
}
else if (other.tag == "bullet")
{
die (m_player.GetComponent<Transform>().position);
}
}
    public void stopHunting()
    {
        aiState = STATE_IDLE;
    }

private void die(Vector3 playerPos)
{
waitTime = 2f;
aiState = STATE_DEAD;
Vector3 pos = this.GetComponent<Transform>().position;
this.GetComponent<Rigidbody>().constraints = RigidbodyConstraints.None;
this.GetComponent<Rigidbody>().AddForce(( pos - playerPos).normalized*600);
}
}


In Unity drag and drop the manager to the player updated script variable (called manager)

Do the same for player and manager into the goal object.

Add a text UI object and place it in the middle of the screen (0,0,0) and drag and drop it into the manager updated script.

Try to run it.

No comments:

Post a Comment