Как сказано, ты не можешь.
Префабы живут в активах, и вы просто не можете иметь ссылки на сцены в активах. (Между прочим, такая же проблема существует для AnimatorController)
Однако существует множество способов получения ссылок во время выполнения.
ScriptableObject
Используйте ScriptableObject для хранения ссылки и используйте соответствующий компонент Setter для соответствующего преобразования GameObject в сцене.
[CreateAssetMenu(fileName = "TransformReference", menuName = "SceneReferences/Transform", order = 1)]
public class ScriptableTransformReference : ScriptableObject
{
public Transform value;
}
В ProjectView (активы) выполните щелчок правой кнопкой мыши -> Создать -> SceneReferences -> Преобразовать, чтобы создать новый экземпляр ScriptableTransformReference
.
А чем на вашем плеере есть этот сеттер
// By adding ExecuteInEditMode this is already executed
// without entering PlayMode
[ExecuteInEditMode]
public class TransformReferenceSetter : MonoBehaviour
{
// Reference the created ScriptableObject here via the Inspector
public ScriptableTransformReference TargetScriptableObject;
private void Awake()
{
TargetScriptableObject.value = transform;
}
}
Тогда, когда вам понадобится эта ссылка в другом компоненте, просто снова сделайте поле
// Reference this in the Inspector
public ScriptableTransformReference SourceScriptableObject;
и получите доступ к value
.., чтобы быть уверенным в Start
, так что сеттеры Awake
уже были выполнены. На этот раз вы можете иметь ссылку в префабе, поскольку ScriptableObject
также находится в активах.
Найти
Вы можете использовать Find
, чтобы получить объект по имени и сделать, например,
var playerTransform = Find("Player").transform;
но я бы порекомендовал не использовать это .. никогда. Это высокая производительность, и если вы когда-либо измените имя GameObject, это тормозит ваш код. Он также работает только для поиска GameObject, который активен в иерархии thw в момент его выполнения.
* * FindObjectOfType тысяча сорок-девять
Однако, если в любом случае есть только один игрок, создайте специальный класс для игрока, как
public class Player : MonoBehaviour {}
это ничего не должно делать. Теперь вы можете просто использовать FindObjectOfType<Type>()
для получения справки, которая является более эффективной и надежной
var playerTransform = FindObjectOfType<Player>().transform;
в любых других компонентах Сцены (например, после создания сборного). Но опять же, это также работает, только если соответствующий GameObject и компонент активны и включены в иерархии в тот момент, когда это выполняется.
Singleton
Или (ab) использовать шаблон Singleton
public class Player : MonoBehaviour
{
public static Player Singleton;
private void Awake ()
{
Singleton = this;
}
}
и используйте
var playerTransform = Player.Singleton.transform;
где-нибудь еще.
Внедрение зависимостей
Возможно, вы захотите войти в Zenject или аналогичные виды внедрения зависимостей. Хотя это немного более полно для его настройки, но после того, как он заработает, он станет очень мощным инструментом для предоставления ссылок даже в различных сценах и на основе контекста.