Unity-Problem: Bitte Kurz helfen?

...komplette Frage anzeigen

1 Antwort

Du musst eine Reference zu der Klasse schaffen. Der DarknessController kann ja theoretisch auf jedem beliebigen Objekt in Unity liegen. Deswegen musst du im Code definieren welcher darknessController angesprochen werden soll.

using UnityEngine; 
using System.Collections;

public class LichtPickUP : MonoBehaviour {


public int pointsToAdd;

public DarknessController darknessController;

void OnTriggerEnter (Collider other){
//if(other.gameObject.CompareTag ("Player"))

if (other.GetComponent<PlayerController> () == null)
return;

ScoreManager.AddPoints (pointsToAdd);
darknessController.Update (pointsToAdd);

Destroy (gameObject);
}


}

Jetzt musst du einfach nur noch die Variable "darknessController" im Inspector zuweisen und fertig :) Ansonsten kannst du die Reference auf mit "GetComponent" im Script machen.

Den Namen "Update" solltest du sowieso nicht verwenden, da die Methode void Update bereits von Unity verwendet wird. Diese wird automatisch in jedem Frame (Bild) aufgerufen.

LG Dosenbiiir

Danke jetzt kann ich das spiel wieder starten :). doch nimmt er nicht mehr das "licht"-PickUp auf... Object reference not set to an instance of an object...ich schwöre für jedes Problem was ich daran beseitige kommt ein neues auf

0
@Kalliope1995

Aaaalsoooo, so gesehen ist dein DarknessController nicht nur ein Script sondern eine Klasse. Da steht ja:

using UnityEngine;

public class DarknessController : MonoBehaviour
{

}

Diese Klasse erbt von "MonoBehaviour" das ist von Unity. Wenn deine Klasse von MonoBehaviour erbt muss der Klassen Namen mit dem Script Namen überreinstimmen. Das legt Unity so fest, deswegen spricht man da dann auch häufig von Script.

Jede Klasse (Script), welche von MonoBehaviour erbt, kannst du auf ein Objekt in der Scene ziehen. Dies ist dan ein "Component" von deinem Objekt.

Dein DarknessController muss also irgendwo in der Scene auf einem Objekt liegen. Und zu diesem Objekt bzw zu dem DarknessController auf dem Objekt zu kommen, musst du einen Verweis zu diesem schaffen.

Wenn du jetzt also das Objekt mit dem DarknessController der Variable aus deinem LichtPickUP Script zuweist, kannst du auf den Controller zugreifen.

Wenn du einen Manager oder Controller hast, der irgendwas steuern soll, verwende am besten ein "singleton". Dazu gibts viele Tutorials im Internet. Dann brauchst du keinen Verweis mehr zu der Klasse, sondern kannst über eine static Variable darauf zugreifen. Gibt noch andere Möglichkeiten, ich mache das immer so:

using UnityEngine;

public class DarknessController : MonoBehaviour
{
private static DarknessController instance; //ein singleton um aus anderen Scripts darauf zu zugreifen

public static DarknessController Instance
{
get
{
if (instance == null) //If there is no reference to the singleton, make one
{
instance = FindObjectOfType<DarknessController>();
}
return instance;
}
}
}

Jetzt kannst du aus einem beliebigen Script darauf zugreifen, egal auf welchen Objekt sich dein DarknessController befindet. Einfach mit:

DarknessController.Instance.irgendeineVariable;

Beachte, dass dein DarknessController jetzt auch nur einmalig in der Scene vorhanden sein sollte.

Falls du nicht wissen solltest wohin mit dem Script, legt dir einfach ein "Empty GameObject" an, benenne es irgendwas wie "Game Manager" und weise dann dein Script zu.

Wo jetzt dein anderes Problem ist habe ich nicht verstanden ;) Da fehlt auf jedenfall wieder eine Reference.


0

Was möchtest Du wissen?