Odwołanie się do obiektu, unity C#

0

Chciałabym sie dowiedzieć czy jest jakiś sposó żeby odwołać sie do stworzonego w C# obiektu. Sprawa wygląda tak że obiekt został stworzony w osobnym voidzie i chciałabym sie do niego odwołać w innym voidzie ale w tym samym pliku. Cokolwiek próbowałam wyskakiwał błąd że wartość ta jest pusta. Może można jakość przypisać nowo stworzony obiekt do nowej zmiennej?

0

Podeślij kod.
Tak to cieżko dokładnie pomóc.

0

@urke:
public void TreeGrow( Player ObjectPlayer ) {

        Plant.transform.localScale = new Vector3(
            Plant.transform.localScale.x + 0.05f,
            Plant.transform.localScale.y + 0.065f,
            Plant.transform.localScale.z + 0.05f);
    }



public void PlantTheSeed( Player ObjectPlayer) {
    // Buil a Plant (Gameobject)
    GameObject ObjectPlant = ObjectPlayer.CarriedSeed.BuildPlant();

    // Place the plant into flower pot
    Seed PlayerCarriedSeed       = ObjectPlayer.CarriedSeed;
    Transform TransformPlant     = ObjectPlant.GetComponent<Transform>();
    Renderer RendererPlant       = TransformPlant.GetComponentInChildren<Renderer>();
    RendererPlant.enabled        = true;
    Transform TransformFlowerPot = GetComponent<Transform>();
    Vector3 MyPosition           = TransformPlant.position;
    MyPosition.x                 = TransformFlowerPot.position.x;
    MyPosition.y                 = TransformFlowerPot.position.y;
    MyPosition.z                 = TransformFlowerPot.position.z;
    TransformPlant.position      = MyPosition;

    // Take the seed away from the player
    ObjectPlayer.PlantedSeed();

    ObjectPlant = Plant;

}

Chciałabym Obiekt "ObjectPlant" umieścić w zmiennej Plant. Jest to możliwe?

0

Napisałaś ObjectPlant = Plant;
Jak chcesz przypisać ObjectPlant do Plant, to musisz na odwrót: Plant = ObjectPlant;.

0

@Spine: Wyskakuje błąd "Object reference not set to an instance of an object" na linijce "Plant.transform.localScale = new Vector3("

0

Kolejniść wywołań się liczy. Zmienna Plant musi zostać zainicjowana, zanim wywołasz metodę TreeGrow.

0

@Spine: Obie te rzeczy wywołują się wyżej w OnCollisionEnter. Ale pierw sie wywołuje PlantTheSeed a potem TreeGrow.

0

Jesteś tego pewna?
Użyłaś np. Debug.Log() w odpowiednich miejscach?

Nie widząc reszty kodu ciężko dojść do tego dlaczego zmienna Plant nie jest zainicjowana.

0

@Spine:
public class FlowerPot : MonoBehaviour {
public Seed ThePlantedSeed;
private int PlantSize;
private int PlantIn;
private GameObject Plant;

void Start() {
    ThePlantedSeed = null;
    PlantSize = 0;
    PlantIn = 0;
}

private void OnCollisionEnter( Collision collision ) {
    if (collision.collider.gameObject.tag == "Player") {
        Player ObjectPlayer = collision.collider.GetComponent<Player>();

        if (ObjectPlayer.CarriedSeed != null && ThePlantedSeed == null) {
            if (PlantIn == 0) {
                PlantTheSeed(ObjectPlayer);
            }
        } else if (ObjectPlayer.CarriedWateringCan == true && PlantIn != 0) {
            TreeGrow(ObjectPlayer);
        } else if (ObjectPlayer.CarriedSeed == null && ObjectPlayer.CarriedWateringCan == null) {
            Debug.Log("U don't have anything");
        }
    }
}

public void TreeGrow( Player ObjectPlayer ) {
    if (PlantSize <= 2) {
        Plant.transform.localScale = new Vector3(
            Plant.transform.localScale.x + 0.05f,
            Plant.transform.localScale.y + 0.065f,
            Plant.transform.localScale.z + 0.05f
        );
        PlantSize = PlantSize + 1;
    }

}



public void PlantTheSeed( Player ObjectPlayer) {
    // Buil a Plant (Gameobject)
    GameObject ObjectPlant = ObjectPlayer.CarriedSeed.BuildPlant();

    // Place the plant into flower pot
    Seed PlayerCarriedSeed       = ObjectPlayer.CarriedSeed;
    Transform TransformPlant     = ObjectPlant.GetComponent<Transform>();
    Renderer RendererPlant       = TransformPlant.GetComponentInChildren<Renderer>();
    RendererPlant.enabled        = true;
    Transform TransformFlowerPot = GetComponent<Transform>();
    Vector3 MyPosition           = TransformPlant.position;
    MyPosition.x                 = TransformFlowerPot.position.x;
    MyPosition.y                 = TransformFlowerPot.position.y;
    MyPosition.z                 = TransformFlowerPot.position.z;
    TransformPlant.position      = MyPosition;
    
    //ObjectPlayer.PlantedSeed();
    PlantIn = PlantIn + 1;
    ObjectPlant.transform.localScale = new Vector3(
    ObjectPlant.transform.localScale.x - 0.9f,
    ObjectPlant.transform.localScale.y - 0.95f,
    ObjectPlant.transform.localScale.z - 0.9f
    );

    // Take the seed away from the player
    ObjectPlayer.PlantedSeed();
    PlantIn = PlantIn + 1;

    Plant = ObjectPlant;
    }
}

Całość wygląda tak
0

Nie znam początkowej wartości ObjectPlayer.CarriedSeed.
A metoda PlantTheSeed wykona się tylko wtedy, kiedy ObjectPlayer.CarriedSeed nie będzie nullem.
No i inne warunki też muszą być spełnione.

Użyj Debug.Log na wszystko. Żeby się dowiedzieć które funkcje się wykonały, w jakiej kolejności oraz jakie są wartości zmiennych używanych we wszystkich warunkach.

Ja uważam, że skoro:

Wyskakuje błąd "Object reference not set to an instance of an object" na linijce "Plant.transform.localScale = new Vector3("

To Plant nie został zainicjowany, czyli metoda TreeGrow została wywołana zanim została wykonana metoda PlantTheSeed.

Poza tym do wklejania kodu używaj znaczników. Przy pisaniu posta kliknij w link Markdown jest obsługiwany (prawy dolny róg) i przeczytaj sekcję Kod źródłowy.

1

@Spine: Jejku miałeś racje, kolejność ma znaczenie. Zamieniłam te dwie rzeczy kolejnościami i wszystko działa! Dziekuję bardzo za pomoc!

1 użytkowników online, w tym zalogowanych: 0, gości: 1