- Home /
Question by
awplays49 · Nov 22, 2014 at 02:32 AM ·
notworking
How do I CHANGE an int from one script by doing GetComponent from another?
I wrote this script, but the PlayerHealthGet just changes itself, not the int I've ordered it to "find".
using UnityEngine;
using System.Collections;
public class Attacking : MonoBehaviour {
// Gives the monster something to attack
private GameObject Target;
// Basic properties
public int Damage;
public int Health;
public float Speed;
// Basic distance floats
public float GeneralDistance;
public float AttackDistance;
public float GiveUpDistance;
public float AttackRange;
// Advanced distance floats
private float Distance;
// Grab player properties
private GameObject PlayerGet;
private int PlayerHealthGet;
// Grab human follower properties
private GameObject HumanFollowerGet;
private int HumanFollowerHealthGet;
private bool HumanFollowerStateGet;
// Grab alien follower properties
private GameObject AlienFollowerGet;
private int AlienFollowerHealthGet;
private bool AlienFollowerStateGet;
// Decides whether or not the monster can attack
private bool CanAttack;
// Sets up the state machine where the monster decides what it wants to do
private enum AttackOrGiveUp {Attack, GiveUp};
private AttackOrGiveUp AttackState;
void Start () {
// Gives the monsters a target to start with
Target = PlayerGet;
// Gives "Grab player properties" code
PlayerGet = GameObject.Find ("Player");
PlayerHealthGet = PlayerGet.GetComponent <Player> ().Health;
// Gives "Grab human follower properties" code
HumanFollowerGet = GameObject.Find ("Human Follower");
HumanFollowerHealthGet = HumanFollowerGet.GetComponent <HumanFollower> ().Health;
HumanFollowerStateGet = HumanFollowerGet.GetComponent <HumanFollower> ().Following;
// Allows the monster to deal damage as soon as the game is started
CanAttack = true;
}
void Update () {
// If the human follower is following the player
if (HumanFollowerStateGet == true)
{
// Make the follower to attack the human follower
Target = HumanFollowerGet;
}
// If the alien follower is following the player
if (AlienFollowerStateGet == true)
{
// Make the follower to attack the alien follower
Target = AlienFollowerGet;
}
// If the player has no followers
if (Target == null)
{
// The monster's target will once again become the player
Target = PlayerGet;
}
// Gives "Advanced distance floats" code
Distance = Vector2.Distance (PlayerGet.rigidbody2D.transform.position, rigidbody2D.transform.position);
// If the monster sees the player in range
if (Distance <= AttackDistance)
{
// The monster will attack the player
AttackState = AttackOrGiveUp.Attack;
}
// If the monster sees neither the player or follower
if (Distance >= GiveUpDistance)
{
// The monster will give up on attacking the player and the follower
AttackState = AttackOrGiveUp.GiveUp;
}
// If the monster is following the follower
if (AttackState == AttackOrGiveUp.Attack)
{
// If the follower's x value is greater than the sum of the monster's x value and the general distance set
if (Target.rigidbody2D.transform.position.x > rigidbody2D.transform.position.x + GeneralDistance)
{
// Move the monster to the right to catch up with the follower
rigidbody2D.transform.position += Vector3.right * Speed * Time.deltaTime;
}
// If the follower's x value is less than the difference between the monster's x value and the general distance set
if (Target.rigidbody2D.transform.position.x < rigidbody2D.transform.position.x - GeneralDistance)
{
// Move the monster to the left to catch up with the follower
rigidbody2D.transform.position += Vector3.left * Speed * Time.deltaTime;
}
// If the follower's y value is greater than the sum of the monster's y value and the general distance set
if (Target.rigidbody2D.transform.position.y > rigidbody2D.transform.position.y + GeneralDistance)
{
// Move the monster up to catch up with the follower
rigidbody2D.transform.position += Vector3.up * Speed * Time.deltaTime;
}
// If the follower's y value is less than the difference between the monstqer's y value and the general distance set
if (Target.rigidbody2D.transform.position.y < rigidbody2D.transform.position.y - GeneralDistance)
{
// Move the monster down to catch up with the follower
rigidbody2D.transform.position += Vector3.down * Speed * Time.deltaTime;
}
// If the target is in the range of an attack and the monster hasn't attacked in the past second
if (Distance <= AttackRange && CanAttack == true)
{
// Do everything mentioned in the Attack function
Attack ();
}
}
}
void Die () {
}
void Attack () {
// Change the current health of the target to the difference between the current health and the damage set
PlayerHealthGet -= Damage;
// Start the coroutine that delays the attack
StartCoroutine (AttackDelay ());
}
IEnumerator AttackDelay () {
// The monster cannot attack
CanAttack = false;
// Wait one second
yield return new WaitForSeconds (1);
// The monster can attack again
CanAttack = true;
}
}
Comment
Best Answer
Answer by Jeff-Kesselman · Nov 22, 2014 at 02:35 AM
You clearly dont understand the unity component/object model, let me try to explain it to you...
THIS line, loads the health value from the gameObject called "Player" into a local field in THIS game object called PlayerHealthGet
PlayerGet = GameObject.Find ("Player");
PlayerHealthGet = PlayerGet.GetComponent <Player> ().Health;
THIS modifies the **local* field, NOT the value on the game object called Player
PlayerHealthGet -= Damage;
You never set the field on the Player game object. So, it never changes.