Вы не можете не напрямую прикреплять ссылки на сцены к ScriptableObject
или к любым активам.
Но вы можете пойти другим путем: дать камере ссылку ScriptableObject
и заставить ее указать свою собственную ссылку на это ScriptableObject
:
// This attribute makes this classes messages be executed also in editmode
// (= also of not in playmode)
[ExecuteInEditModo]
// Assure there is a Camera component
[RequireComponent(typeof(Camera))]
public class CameraSetter : MonoBehaviour
{
[SerializeField] private MainCamera mainCameraAsset;
// Called on initialize
// With [ExecuteInEditModo] also called on recompile
private void Awake ()
{
mainCameraAsset.Camera = GetComponent();
}
}
И сослаться на свой MainCamera
] экземпляр в mainCameraAsset
.
Есть ли причина, по которой вы не используете Camera.main вместо ScriptableObject
?
Карта для разных сцен
В случае, если вы хотите заархивировать что-то вроде «актива менеджера», хранящего разные ссылки Camera
для каждой сцены в соответствии с запросом в комментариях (надеюсь, я вас правильно понял), я бы изменил ваш MainCamera
на что-то вроде
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[CreateAssetMenu(fileName = "Data", menuName = "ScriptableObjects/MainCamera",
order = 1)]
public class MainCamera : ScriptableObject
{
public List SceneCameraPairs = new List();
public Dictionary sceneToCamera = new Dictionary();
public void AddPair(SceneCameraPair pair)
{
if(SceneCameraPairs.Contains(pair)) return;
SceneCameraPairs.Add(pair);
sceneToCamera[pair.scene.path] = pair.camera;
}
public void ResetPairs()
{
SceneCameraPairs.Clear();
sceneToCamera.Clear();
}
}
[System.Serializable]
public class SceneCameraPair
{
public Scene scene;
public Camera camera;
}
и в установщике используйте SceneManager.GetActiveScene
// This attribute makes this classes messages be executed also in editmode
// (= also of not in playmode)
[ExecuteInEditModo]
// Assure there is a Camera component
[RequireComponent(typeof(Camera))]
public class CameraSetter : MonoBehaviour
{
[SerializeField] private MainCamera mainCameraAsset;
// Called on initialize
// With [ExecuteInEditModo] also called on recompile
private void Awake ()
{
mainCameraAsset.AddPair(SceneManager.GetActiveScene, GetComponent();
}
}
Чем позже в сцене вы можете использовать список с FirstOrDefault (который не выдает исключение, но возвращает null
, если элемент не найден) и Scene.path (потому что имя сцены может быть тем же, и вы не можете сравнить scene
непосредственно, поскольку его экземпляр не совпадает с экземпляром, на который есть ссылка), например, например
var camera = mainCameraReference.SceneCameraPairs.FirstOrDefault(pair => pair.scene.path == ScaneManager.GetActiveScene().path);
или словарь типа
var camera = mainCameraReference.sceneToCamera[ScaneManager.GetActiveScene().path];
Различные типы
Чтобы иметь возможность хранить различные ссылки различных типов (при условии, что только один для каждого типа) вы можете сделать что-то вроде, например,
[CreateAssetMenu(fileName = "Data", menuName = "ScriptableObjects/Data", order = 1)]
public class References : ScriptableObject
{
public Camera mainCamera;
public CharacterController controller;
public Transform transform;
// fix for the generic methods
// a bit dirty maybe but should work
public void Set(Component component)
{
if(component.GetType() == typeof(Camera))
{
mainCamera = (Camera) component;
}
else if(component.GetType() == typeof(CharacterController))
{
controller = (CharacterController) component;
}
else if(component.GetType() == typeof(Transform))
{
transform = (Transform) component;
}
}
public void Set(Camera camera)
{
mainCamera = camera;
}
public void Set(CharacterController characterController )
{
controller = characterController ;
}
public void Set(Transform characterTransform)
{
transform = characterTransform;
}
// or simply all at once
public void Set(Camera camera, CharacterController characterController, Transform characterTransform)
{
mainCamera = camera;
controller = characterController;
transform = characterTransform;
}
// etc
}
Чем вы могли бы иметь один базовый класс-установщик, например,
public abstract class SetterBase : MonoBehaviour where T : Component
{
// unfortunately you can not serialize generics in
// the inspector so for now we stick with only one single ScriptableObject
public References references;
privtae void Awake()
{
SetReference();
}
private void SetReference() where T : Component
{
var component = GetComponent();
references.Set(component);
}
}
. Теперь вы можете наследовать реализации для каждого типа, который вам нужен / который присутствует в References
, например,
public CameraSetter : SetterBase
{
// doesn't have to do anything else ... but could
}
[ 1139] и
public TransformSetter : SetterBase
{
// doesn't have to do anything else ... but could
}
и т. Д.
Или в качестве альтернативы
(и именно поэтому я добавил один сеттер для всего), вы могли бы разрешить его обработку все одним менеджером
public class ReferenceSetter : MonoBehaviour
{
public References references;
// Reference those in the inspector as usual
public Camera camera;
public Transform transform;
public CharacterController controller;
private void Awake()
{
references.Set(camera, controller, transform);
}
}
Фактор выглядит интересным, но плохо требуется больше вводных учебных руководств и статей.
Я не могу говорить о факторе а именно, но я сделал много с HP Calculators. Стековый язык RPN, с которым это идет, довольно сложен. Тонна программного обеспечения была записана для этих калькуляторов.
забава для в стороне основанного на языке стека в точке, видение не делает меня, но, Forth, напоминает его, и кратко Факторный изучил меня.
Я намереваюсь изучить это после окончания моего Clojure, изучая приключения.
ОБНОВЛЕНИЕ:
После многих лун я использовал Фактор для некоторого материала в последнее время, и я скажу, что это - удивительный язык. Единственной проблемой является все еще постоянная проблема, связанная с очень мало в способе инструментов GUI. Фактор инструментарий UI серьезно испытывает недостаток в большом количестве общих вещей, и нет никакой привязки ни к какому существующему инструментарию с этой записи. Это, вероятно, было бы недопустимым для любого реального настольного приложения.
Я рассматриваю использование Фактора для своего следующего большого нерабочего проекта. Я пытался выбрать между Фактором, OCaml, D и Python. Обычно, Python является моим предпочтительным языком, но для этого я ищу что-то другое. Я рассматривал D (я использовал C++ в течение очень многих лет и хотел использовать D в качестве более чистого C++), но это, кажется, не то, что я ищу действительно.
Это оставляет OCaml и Фактор, и мне нелегко решать. OCaml был бы немного легче для меня справиться с, поскольку мое конкатенативное программирование немного ржаво, и мне также вполне нравится язык много, но Фактор продолжает привлекать меня в также (и я - большой поклонник конкатенативных языков). Нерешительность Hrm..
ОБНОВЛЕНИЕ: Я с тех пор решил изучить Фактор правильно и использовать его для моего предстоящего большого персонального проекта. Тем временем я работаю над некоторыми проблемами от Программирования проблем в Факторе.
ОБНОВЛЕНИЕ 2: Фактор не вполне сокращал его.. Не из-за языка язык является большим, и я рекомендую всем смотреть на него. Причиной была спокойная привязка. Это было важным недопустимым для меня. Я связал бы QT сам и внес бы его, но затем у меня есть два проекта вместо одного, и у меня просто нет времени. Так, жаль Фактор. Я написал код в C++ вместо этого, но я теперь рассматриваю или портирую его на Clojure или пишу будущий код в Clojure.
Я использую Factor несколько месяцев, и это действительно впечатляющий язык.
Это похоже на смесь Forth (очевидно), Smalltalk (основанная на изображениях, сильно отражающая, «интегрированная» IDE) и LISP (код как данные, абстракции на уровне синтаксиса, REPL) ... степень, такие языки, как Python или Ruby, с сильным акцентом на прагматизм и открытость (например, «батарейки в комплекте»).
Более того, производительность кажется важной для разработчиков, так как много работы было потрачено на оптимизирующий компилятор, как и реализация Common Lisp на SBCL.
Проект все еще немного страдает из-за его молодости, с некоторыми частыми языковыми изменениями, частями системы с недостаточной документацией и относительно небольшим сообществом. Но даже на этом этапе я думаю, что он достаточно зрел, чтобы начинать какие-то нетривиальные вещи.