В комментарии вы упомянули сценарий, о котором вы говорите: 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