Как: получить экземпляр gameObject - PullRequest
0 голосов
/ 07 мая 2019

Нужно получить экземпляр этого игрового объекта, чтобы я мог успешно использовать .enabled, чтобы скрыть его в сцене.

PlayPortalLoginButton loginButton = gameObject.GetComponent<PlayPortalLoginButton>();

Довольно плохо знаком с C #, и я считаю, что близок к достижению своей цели с помощью строки выше. Что изменилось? Хочешь понять, как правильно это сделать.

Ответы [ 3 ]

1 голос
/ 07 мая 2019

Вот один из способов найти компонент на GameObject в сцене, где «PortalLoginButton» - это имя GameObject, как видно в редакторе:

var loginButton = GameObject.Find("PortalLoginButton");
loginButton.enabled = false;

Однако, GameObject.Find("...") ищет имя каждого GameObject в сцене, и это обычно не лучший способ ссылаться на GameObject, поскольку он не очень эффективен. Поэтому убедитесь, что вы не используете GameObject.Find("...") или аналогичные вызовы функций в функции Update(), потому что она будет выполнять каждый кадр и замедлять вашу игру . Если GameObject не был создан во время игры, обычно лучше сделать глобальную ссылку на любой GameObject или Component, который вы используете в своем скрипте, а затем перетащить GameObject с помощью Component вы ищете в поле в редакторе. В качестве альтернативы, вы можете использовать GameObject.Find("...") в функциях Start() или Awake() для хранения ссылки на искомый GameObject, так что поиск происходит только один раз в начале вашей игры.

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

// By default, private fields are not viewable in the editor,
// but the [SerializeField] attribute, placed before
// the field declaration, allows them to be visible.
[SerializeField]
private GameObject loginButtonPrivateReference;
// If you need to access loginButton from another script, 
// you can make it a public field.
// Public fields are viewable in the editor by default.
public GameObject loginButtonPublicReference;

Вот пример того, как вы можете использовать GameObject.Find ("...") в функции Awake():

private GameObject loginButton;

private void Awake() {
    loginButton = GameObject.Find("PortalLoginButton");
}

Если вам нужно найти GameObjects в вашей сцене по типу или имени тега, см. Документацию GameObject здесь для получения дополнительной информации. Поиск по типу менее эффективен, а поиск по тегу более эффективен, чем поиск по имени, потому что поиск по типу проверяет каждый компонент в каждом GameObject, а поиск по тегу выполняет поиск только в организованном GameObject подмножестве.

0 голосов
/ 07 мая 2019

Существует несколько способов получить доступ к gameObject в сценарии, в зависимости от того, какой именно объект gameObject вы пытаетесь получить.

Если вы пытаетесь получить доступ к GameObject поведения в скрипте поведения, тогда достаточно просто использовать gameObject, так как это - gameObject, к которому привязано поведение.

Доступ к скрипту, который прикреплен к другому GameObject, может быть сложным. Для таких сцен, как MainMenu, нет ничего плохого в том, чтобы дать ему публичную ссылку в качестве примера:

public PlayPortalLoginButton loginButton;

void setLoginState(bool activate) {
    loginButton.enabled = activate;
}

В этом примере вы просто перетащите элемент gameObject со сценарием PlayPortalLoginButton в сценарий менеджера, который будет контролировать, включен он или нет.

Если вам нужен более модульный подход к нему, например, в игровой сцене, когда вы заполняете объекты во время выполнения, вы можете воспользоваться следующим подходом:

PlayPortalLoginButton loginButton;

void setLoginState(bool activate) {
    if(loginButton == null)
    {
        loginButton = FindObjectOfType<PlayPortalLoginButton>();
    }
    // Requires the correct version of .net otherwise you can reuse the check above...
    loginButton?.enabled = activate;
}

В приведенном выше скрипте, если вам нужно было gameObject для loginButton, теперь вы можете получить к нему доступ через loginButton.gameObject.

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

Я также упомяну, что я избегаю примеров GameObject.Find и GameObject.FindGameObjectsWithTag, так как они более подвержены ошибкам. Они будут работать только в том случае, если ваше имя или тег помечены правильно, если вы переименуете их по какой-либо причине, тогда ваши сценарии не смогут найти объект, и это может вызвать проблему с устранением неполадок.

Используя FindObjectOfType, вы с меньшей вероятностью будете иметь ошибку, и если вы удалите этот тип сценария, эти сценарии вызовут ошибку, указывающую, что сценарий больше не существует. При рефакторинге, если вы щелкнете правой кнопкой мыши по имени поведения и используете опцию переименования, он автоматически обновит ссылки на скрипт во всем вашем коде.

0 голосов
/ 07 мая 2019
GameObject button;
void Start() {
    button = GameObject.Find ("yourButtom");
}
void SomeEvent() {
    button.SetActive(false);   
}

Я думаю, что вы должны помочь вам

...