Dostęp do wartości z innego skryptu C# - unity

Dostęp do wartości z innego skryptu C# - unity
IZ
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1
0

Chciałabym bym sie odwołać do wartości "CarriedWateringCan" która znajduje sie w skrypcie "Player" ale ilekroć pisze tak wyskakuje mi bład "NullReferenceException: Object reference not set to an instance of an object FirstSlot.Update () ". Dodam rownież że jak wpisuje Debug.Log z tą wartoscią w skrypcie "Player " to normalnie pokazuje mi to swoją prawidłową wartość. W jaki sposób mam wiec zobaczyć tą samą wartość gdy odwołam sie do niej ze skryptu "FirstSlot"?.

Skrypt "Player":

Kopiuj
public class Player : MonoBehaviour {
    public WateringCan CarriedWateringCan;

Skrypt w kórym chce sie odwołać do tej wartosci "FirstSlot":

Kopiuj
public class FirstSlot : MonoBehaviour {
    public GameObject Inventory1;
    public Transform canvas;
    public static bool oneicon = true;

    // Use this for initialization
    void Start () {
        
    }

    // Update is called once per frame
    void Update () {
        Player ObjectPlayer = GetComponent<Player>();

        if (ObjectPlayer.CarriedWateringCan != null && oneicon == true) {
            GameObject inventory = Instantiate(Inventory1, canvas);
            oneicon = false;
        }
    }
}
Spine
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6965
3

Czy komponent Player jest podpięty do tego samego obiektu co komponent FirstSlot?
Stawiam, że po tej linijce:

Kopiuj
Player ObjectPlayer = GetComponent<Player>();

ObjectPlayer jest nullem. Bo oba skrypty są podpięte do innych obiektów.

Najlepiej jakbyś do klasy FirstSlot dodała pole public Player ObjectPlayer; i w edytorze przeciągnęła playera na to pole.
Wtedy usuń linijkę z GetComponent().


Jest też inne rozwiązanie: https://docs.unity3d.com/ScriptReference/Object.FindObjectOfType.html
Wtedy szukasz obiektu w całej scenie. Ale nie polecam tego. Bo to mało wydajne i błędogenne.
Jak robisz coś na szybko i byle jak, to może być.


Jeszcze jedna uwaga. Nie wykonuj funkcji takich jak GetComponent() czy FindObjectOfType() w Update().
W takim przypadku jak ten, wystarczy raz szukać skryptu, a nie w każdej klatce.

CH
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 449
2

W skrypcie Player daj tak jak nizej i dzieki temu masz dostep do tej instancji

Kopiuj
public static Player instance;

private void Awake()
    {
        instance = this;
    }

W skrypcie First slot daj tak:

Kopiuj
public ObjectPlayer player
 
 void Start () {
      // jak chcesz wysukac gracza ale jak jest jeden to nie musisz
     player = GetComponent<Player>();
 }

 void Update () {
     if (Player.instance.CarriedWateringCan != null && oneicon == true) {
         GameObject inventory = Instantiate(Inventory1, canvas);
         oneicon = false;
     }
 }

.
ja wyszukiwanie kompmentow uzywam gdy szukam sprajtow zeby je posrotowac ale jak wiem ze mam jedengo gracza to nie szukam go tylko odwoluje sie tak jak wyzej ci napisalem w kodzie.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.