Не могу перетащить объект сцены на общедоступный UnityEvent - PullRequest
0 голосов
/ 24 июня 2019

У меня есть скрипт с общедоступным UnityEvent, и я пытаюсь перетащить объект сцены в слот объекта, чтобы я мог получить доступ к его методам, но он не принимает объект. Я не уверен, что я делаю неправильно.

Объект сцены - это сборный экземпляр, и я попытался распаковать сборный, но это не помогло.

1 Ответ

0 голосов
/ 24 июня 2019

В комментарии вы упомянули сценарий, о котором вы говорите: StateMachineBehaviour.

StateMachineBehaviour не наследуется от MonoBehaviour, а скорее от ScriptableObject

ScriptableObject экземпляры "живут" в активах, а не в определенной сцене

Вы (обычно) не можете иметь никаких ссылок на сцены в любых активах, таких как Prefabs или ScriptableObjects.


Однако есть некоторые обходные пути, которые позволяют вам это сделать.Например, вы можете создать ScriptableObject контейнеров для каждого значения, которое вы хотите передать.Например,

[CreateAssetMenu]
public class GameObjectReference : ScriptableObject
{
    public GameObject gameObject;

    public void SetActive(bool value)
    {
        if(gameObject) gameObject.SetActive(value);
    }
}

, такой экземпляр GameObjectReference теперь является ScriptableObject и, таким образом, также "живет" в Активах =>, вы можете ссылаться на него в любом другом активе как Prefabs и другие * 1025.* s.

Итак, все, что вам нужно сделать, это убедиться, что вы устанавливаете это значение в вашей сцене, например, используя

[ExecuteInEditMode]
public class GameObjectReferenceSetter : MonoBehaviour
{
    public GameObjectReference gameObjectReferenceAsset;

    private void Awake()
    {
        gameObjectReferenceAsset.gameObject = gameObject;
    }
}

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

Имея [ExecuteInEditMode], это также должно быть установлено уже в EditMode.Однако, поскольку «официально» все еще невозможно иметь ссылку на сцену в поле ScriptableObject, значение обычно говорит Type missmatch, но ссылается на правильный объект, как вы должны видеть, когда вы нажимаете на поле.


Другой альтернативой является использование какого-либо внедрения зависимости (для Unity часто упоминается и бесплатное решение, например, Zenject ).Сложно настроить его в первый раз, но как только вы его запустите, он станет более гибким и лучше масштабируемым, поскольку вам не нужно будет реализовывать оболочку для каждого типа, который вы хотите передать в StateMachineBehaviour.

Дополнительную информацию и инструкции о Zenject можно найти на их странице github

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