Переменные в других скриптах в единстве - PullRequest
1 голос
/ 08 марта 2019

Я пытаюсь создать игру в Unity 2d.Я закончил большую часть того, что я хочу сделать, и перешел к врагам.Враги (драконы) входят из разных точек экрана.Для этого я поместил игровые объекты спрайта там, где я хочу, чтобы дракон появлялся.Я сделал все эти объекты дочерними по отношению к другому объекту под названием DragonAncores.Я прикрепил скрипт к DragonAncores, который говорит об этом ...

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DragonTracker : MonoBehaviour {
    // is gold dragon in play?
    public bool GoldDragonInit = false;
    // curently active dragons
    public int DragonCount = 0;
    // defalts to 5
    public int Difficulty = 5;
}

Затем я прикрепляю скрипт к каждому спрайту, который в конечном итоге будет вызываться в драконьем префабе (содержащем 2 коллайдера и аниматора) с предвзятым отношением стат.логика, полученная из других переменных.

ниже - код, который я использую.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Dragons : MonoBehaviour {
    // same as GoldDragonInit
    bool GoldDragonSpawn = false;
    // same number as DragonCount in DragonTrackeer
    int LiveDragons;
    // same as Difficulty
    int DifLev;
    //get cariables from other script
    DragonAncors.cs.GetComponent.<DragonTracker>() GoldDragonInit = GoldDragonSpawn;

    System.Random RNG= new System.Random();
    void update()
    {
        RSpawn=RNG.Next(0,2)
        DragonType=RNG.Next(0,101)
        if (RSpawn = 1) ;
        {
            if (LiveDragons > DifLev) ;
            {
                if (DragonType > 99) ;
                {
                    // summon regular dragon
                }
                if (DragonType = 100) ;
                {
                    if (GoldDragonSpawn = true) ;
                    {
                        // summon gold dragon
                    }
                }
            }
        }
    }
}

Это выбрасывает этот список ошибок.Error List

Это показывает мою иерархию в единстве и опорные точки (вещи, похожие на перекрестие Сквайра) Unity Hierarchy and anchor points

Я посмотрелдля других тем, которые затрагивают эту тему, и все они пробуют разные методы, не работают.я использую Unity 2018.2.18f1

спасибо в продвинутом

Ответы [ 4 ]

1 голос
/ 12 марта 2019

В вашем коде есть несколько ошибок.Следующее неверно.

//get cariables from other script
    DragonAncors.cs.GetComponent.<DragonTracker>() GoldDragonInit = GoldDragonSpawn;

Правильный способ получить доступ к этому, видя, как вы сказали, DragonAncors является родительским:

GetComponentInParent<DragonTracker>().GoldDragonInit = GoldDragonSpawn;

Это устанавливает логическое значение GoldDragonInit равным значениюGoldDragonSpawn.Это должно быть внутри функции, так как она у вас есть вне функции, я полагаю, вам понадобился этот набор при запуске.Поэтому я поместил его в функцию void Start ().Это вызывается в начале игры (загруженная сцена).

Вам также не нужны точки с запятой;однако после оператора if он должен появляться после каждой строки разностного кода.Код, который вы предоставили, должен выглядеть следующим образом.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Dragons : MonoBehaviour {
    // same as GoldDragonInit
    bool GoldDragonSpawn = false;
    // same number as DragonCount in DragonTrackeer
    int LiveDragons;
    // same as Difficulty
    int DifLev;
    void Start()
    {
        // variables from other script
     GetComponentInParent<DragonTracker>().GoldDragonInit = GoldDragonSpawn;
    }
    System.Random RNG= new System.Random();
    void update()
    {
        RSpawn=RNG.Next(0,2);
        DragonType=RNG.Next(0,101);
        if (RSpawn = 1)
        {
            if (LiveDragons > DifLev)
            {
                if (DragonType > 99)
                {
                    // summon regular dragon
                }
                if (DragonType = 100)
                {
                    if (GoldDragonSpawn = true)
                    {
                        // summon gold dragon
                    }
                }
            }
        }
    }
}

Это работает, потому что DragonTracker - это скрипт в родительском объекте.Если это не так, то GetComponentInParent (). GoldDragonInit = GoldDragonSpawn;будет заменен следующим образом:

[SerializeField]
private GameObject DragonAncors;
void Start()
{
    DragonAncors.GetComponent<DragonTracker>().GoldDragonInit = GoldDragonSpawn;
}
1 голос
/ 09 марта 2019

Это недопустимый код c #:

//get cariables from other script
DragonAncors.cs.GetComponent.<DragonTracker>() GoldDragonInit = GoldDragonSpawn;

Почему?Потому что это не внутри метода.

Кроме того, комментарий неправильный.Это не получение переменной (тоже опечатка), ее установка переменной в другом скрипте!

Причина первых ... 16 проблем, на которые жалуется Visual Studio, связана с этой строкой.

В этом месте вам разрешено только объявлять методы, поля и свойства , и вы в настоящее время пытаетесь получить доступ к другому классу и изменить один из его членов (что вы можете сделать только внутриметод).

Кроме того, у вас есть .cs, который я предполагаю, потому что "DragonAnchors.cs - это имя файла!"что вам не нужно делать.Я не уверен, как можно переписать эту строку (внутри Start()), так как я не уверен, что вы на самом деле пытаетесь сделать.То есть я не знаю, где на самом деле находится экземпляр DragonAnchors.Вы звоните GetComponent(), который обычно зарезервирован для доступа к компонентам, прикрепленным к игровым объектам, но, поскольку вы пытались сделать это со ссылкой на статический класс, я не уверен, что вы намеревались вызывать его на thisили на что-то еще.

1 голос
/ 09 марта 2019

Вот как вы можете попасть в DragonTracker:

DragonTracker dt = GameObject.Find("DragonAncores").GetComponent<DragonTracker>()
Debug.Log(dt.DragonCount);
0 голосов
/ 08 марта 2019

Там много ошибок, и они могут предпринять некоторые шаги, но прежде всего вы должны решить проблему с кодом, который вы пытаетесь использовать, поскольку он не поддерживается.Зайдите в настройки проекта и измените языковую версию компилятора, как указано в 5-й ошибке.Это должно позволить вам использовать более новую функциональность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...