I want to attach my Text’s, HealthText and OxygenText to my Player script’s healthText and oxygenText variables so that my scripts can get access to the Text’s (like in the Roguelike Tutorial, the FoodText is assigned to the foodText variable). To do this I get the Text’s from the hierarchy into the Inspector, but for some reason it won’t let me. There aren’t any error or warning messages, it just won’t let me do it. Here’s my script for the Player:
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
namespace Completed
{
//Player inherits from MovingObject, our base class for objects that can move, Enemy also inherits from this.
public class Player : MovingObject
{
public float restartLevelDelay = 1f; //Delay time in seconds to restart level.
public int pointsPerTuna = 10; //Number of points to add to player food points when picking up a food object.
public int pointsPerPotion = 10; //Number of points to add to player food points when picking up a soda object.
public int pointsPerOxygen = 10; //Number of points added to oxygen text when collecting oxygen
private bool weapon = false; //Make weapon a boolean so the player could be carrying it or not
private bool key = false; //Make key boolean so player can gain access to exit if true on higher levels
public int wallDamage = 1; //How much damage a player does to a wall when chopping it.
public Text oxygenText; //Text for oxygen UI
//private int oxygen = 100;
public Text healthText; //Text for health UI
//public int health = 100;
private int health;//Store health points total
private int oxygen; //Store oxygen points total
public AudioClip moveSound1;
public AudioClip moveSound2;
public AudioClip eatSound1;
public AudioClip eatSound2;
public AudioClip drinkSound1;
public AudioClip drinkSound2;
public AudioClip gameOverSound;
private Animator animator; //Used to store a reference to the Player's animator component.
public bool oxygenLevel = false; //Oxygen is made a boolean so it can be set to true on harder levels
//Start overrides the Start function of MovingObject
protected override void Start()
{
//Get a component reference to the Player's animator component
animator = GetComponent<Animator>();
//Get component reference to Player's oxygenText component
oxygenText = GetComponent<Text> ();
//Get component reference to Player's healthText component
healthText = GetComponent<Text> ();
//Get the current health point total stored in GameManager.instance between levels.
health = GameManager.instance.playerHealthPoints;
//Get the current oxygen point total stored in GameManager.instance between levels.
oxygen = GameManager.instance.playerOxygenPoints;
//oxygenText.text = "Oxygen: " + oxygen;
//Call the Start function of the MovingObject base class.
base.Start();
}
//This function is called when the behaviour becomes disabled or inactive.
private void OnDisable()
{
//When Player object is disabled, store the current local health total in the GameManager so it can be re-loaded in next level.
GameManager.instance.playerHealthPoints = health;
//When Player object is disabled, store the current local oxygen total in the GameManager so it can be re-loaded in next level.
GameManager.instance.playerOxygenPoints = oxygen;
}
private void Update()
{
//If it's not the player's turn, exit the function.
if (!GameManager.instance.playersTurn) return;
int horizontal = 0; //Used to store the horizontal move direction.
int vertical = 0; //Used to store the vertical move direction.
//Get input from the input manager, round it to an integer and store in horizontal to set x axis move direction
horizontal = (int)(Input.GetAxisRaw("Horizontal"));
//Get input from the input manager, round it to an integer and store in vertical to set y axis move direction
vertical = (int)(Input.GetAxisRaw("Vertical"));
//Check if moving horizontally, if so set vertical to zero.
if (horizontal != 0)
{
vertical = 0;
}
//Check if we have a non-zero value for horizontal or vertical
if (horizontal != 0 || vertical != 0)
{
//Call AttemptMove passing in the generic parameter Wall, since that is what Player may interact with if they encounter one (by attacking it)
//Pass in horizontal and vertical as parameters to specify the direction to move Player in.
AttemptMove<Wall>(horizontal, vertical);
}
}
//AttemptMove overrides the AttemptMove function in the base class MovingObject
//AttemptMove takes a generic parameter T which for Player will be of the type Wall, it also takes integers for x and y direction to move in.
protected override void AttemptMove<T>(int xDir, int yDir)
{
//Every time player moves, subtract from oyxgen points total.
oxygen--;
//oxygenText.text = "Oxygen: " + oxygen;
//Call the AttemptMove method of the base class, passing in the component T (in this case Wall) and x and y direction to move.
base.AttemptMove<T>(xDir, yDir);
//Hit allows us to reference the result of the Linecast done in Move.
RaycastHit2D hit;
//If Move returns true, meaning Player was able to move into an empty space.
if (Move(xDir, yDir, out hit))
{
//Call RandomizeSfx of SoundManager to play the move sound, passing in two audio clips to choose from.
// SoundManager.instance.RandomizeSfx(moveSound1,moveSound2);
}
//Since the player has moved and lost oxygen points, check if the game has ended.
CheckIfGameOver();
//Set the playersTurn boolean of GameManager to false now that players turn is over.
GameManager.instance.playersTurn = false;
}
//OnCantMove overrides the abstract function OnCantMove in MovingObject.
//It takes a generic parameter T which in the case of Player is a Wall which the player can attack and destroy.
protected override void OnCantMove<T>(T component)
{
//Set hitWall to equal the component passed in as a parameter.
Wall hitWall = component as Wall;
//Call the DamageWall function of the Wall we are hitting.
hitWall.DamageWall(wallDamage);
//Set the attack trigger of the player's animation controller in order to play the player's attack animation.
animator.SetTrigger("playerChop");
}
//OnTriggerEnter2D is sent when another object enters a trigger collider attached to this object (2D physics only).
private void OnTriggerEnter2D(Collider2D other)
{
//Check if the tag of the trigger collided with is Exit.
if (other.tag == "Exit")
{
//Invoke the Restart function to start the next level with a delay of restartLevelDelay (default 1 second).
Invoke("Restart", restartLevelDelay);
//Disable the player object since level is over.
enabled = false;
}
//Check if the tag of the trigger collided with is Food.
else if (other.tag == "Food")
{
//Add pointsPerTuna to the players current health total.
health += pointsPerTuna;
// healthText.text = "+" + pointsPerTuna + " Health: " + health;
// SoundManager.instance.RandomizeSfx(eatSound1,eatSound2);
//Disable the tuna object the player collided with.
other.gameObject.SetActive(false);
}
//Check if the tag of the trigger collided with is Potion.
else if (other.tag == "Soda")
{
//Add pointsPerPotion to players health points total
health += pointsPerPotion;
// healthText.text = "+" + pointsPerPotion + " Health: " + health;
// SoundManager.instance.RandomizeSfx(drinkSound1,drinkSound2);
//Disable the potion object the player collided with.
other.gameObject.SetActive(false);
}
//Check if the tag of the trigger collided with is Oxygen.
else if (other.tag == "Oxygen")
{
//Add pointsPerOxygen to players oxygen points total
oxygen += pointsPerOxygen;
//oxygenText.text = "+" + pointsPerOxygen + " Oxygen: " + oxygen;
//SoundManager.instance.RandomizeSfx(drinkSound1,drinkSound2);
//Disable the oxygen object the player collided with.
other.gameObject.SetActive(false);
}
}
//Restart reloads the scene when called.
private void Restart()
{
//Load the last scene loaded, in this case Main, the only scene in the game.
Application.LoadLevel(Application.loadedLevel);
}
//LoseHealth is called when an enemy attacks the player.
//It takes a parameter loss which specifies how many points to lose.
public void LoseHealth(int loss)
{
//Set the trigger for the player animator to transition to the playerHit animation.
animator.SetTrigger("playerHit");
//Subtract lost health points from the players total.
health -= loss;
healthText.text = "-" + loss + " Health: " + health;
//Check to see if game has ended.
CheckIfGameOver();
}
//CheckIfGameOver checks if the player is out of health points and if so, ends the game.
private void CheckIfGameOver()
{
//Check if oxygen or health is equal to or less than zero.
if (oxygen <= 0 || health <= 0)
{
//Call the GameOver function of GameManager.
SoundManager.instance.PlaySingle(gameOverSound);
SoundManager.instance.musicSource.Stop();
GameManager.instance.GameOver();
}
}
//If the level is 6 or higher, make the oxygen boolean true
// public void Oxygen(){
// if (currentLevel.level <= 6) {
// oxygenLevel = true;
// } else {
// oxygenLevel = false;
// }
// }
}
}