Amrik Ahluwalia
Amrik Ahluwalia

Reputation: 51

Why does C# Not see the variable in another Script when Using GetComponent? C#

So I have a CharacterController Class that just deals with User inputs and If the player is hit by a bullet and reduces the Health of that Character. I need to use this Health Value in another Script so Have used the following code to try this however I get a CS01061 as it says it cannot find the Health variable.

Character Controller Class Variables:

public class CharacterController : MonoBehaviourPunCallbacks
{
    public float MovementSpeed = 2;
    public float JumpForce = 5;
    public float Health = 100f;
    public float height = 10;
    public static GameObject LocalPlayerInstance;

Here is the code for the PlayerManager Class that needs Health from above:

//Gloabl Variables
public GameObject ActualPlayer;
public CharacterController Controller;
public float Health;
public void Awake()
        {
            ActualPlayer = GameObject.Find("Player");
            Controller = ActualPlayer.GetComponent<CharacterController>();
            Health = Controller.Health;
            ......

Player is a prefab that is a GameObject that has been initialised by Photon and has the CharacterController script as a component. Why can't unity see that the script has a health variable?

Upvotes: 1

Views: 641

Answers (1)

derHugo
derHugo

Reputation: 90679

Are you sure it is looking for the correct type and not maybe one with the same name but from a different namespace?

Unity itself already has a built-in type named CharacterController in the namespace UnityEngine so most probably your second script is using that type since on the top you will have a

using UnityEngine;

Make sure you are referencing the correct one in your script.

You could e.g. put yours into a specific namespace like

namespace MyStuff
{
    public class CharacterController : MonoBehaviourPunCallbacks
    {
        ...
    }
}

and then in your other script explicitly use

public MyStuff.CharacterController Controller;

and

Controller = ActualPlayer.GetComponent<MyStuff.CharacterController>();
Health = Controller.Health;

Besides that remember that float is a value type, not a reference, so most probably you storing that value in a field in your second script is not what you want to do ;)

rather always simply access the Controller.Health instead.

Upvotes: 4

Related Questions