Вы планируете использование Факторного языка программирования? [закрытый]

Вы не можете не напрямую прикреплять ссылки на сцены к 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);
    }
}

10
задан madth3 8 October 2013 в 00:35
поделиться

6 ответов

Фактор выглядит интересным, но плохо требуется больше вводных учебных руководств и статей.

6
ответ дан 3 December 2019 в 13:25
поделиться

Я не могу говорить о факторе а именно, но я сделал много с HP Calculators. Стековый язык RPN, с которым это идет, довольно сложен. Тонна программного обеспечения была записана для этих калькуляторов.

http://www.hpcalc.org/

3
ответ дан 3 December 2019 в 13:25
поделиться

забава для в стороне основанного на языке стека в точке, видение не делает меня, но, Forth, напоминает его, и кратко Факторный изучил меня.

26
ответ дан 3 December 2019 в 13:25
поделиться

Я намереваюсь изучить это после окончания моего Clojure, изучая приключения.

ОБНОВЛЕНИЕ:

После многих лун я использовал Фактор для некоторого материала в последнее время, и я скажу, что это - удивительный язык. Единственной проблемой является все еще постоянная проблема, связанная с очень мало в способе инструментов GUI. Фактор инструментарий UI серьезно испытывает недостаток в большом количестве общих вещей, и нет никакой привязки ни к какому существующему инструментарию с этой записи. Это, вероятно, было бы недопустимым для любого реального настольного приложения.

6
ответ дан 3 December 2019 в 13:25
поделиться

Я рассматриваю использование Фактора для своего следующего большого нерабочего проекта. Я пытался выбрать между Фактором, OCaml, D и Python. Обычно, Python является моим предпочтительным языком, но для этого я ищу что-то другое. Я рассматривал D (я использовал C++ в течение очень многих лет и хотел использовать D в качестве более чистого C++), но это, кажется, не то, что я ищу действительно.

Это оставляет OCaml и Фактор, и мне нелегко решать. OCaml был бы немного легче для меня справиться с, поскольку мое конкатенативное программирование немного ржаво, и мне также вполне нравится язык много, но Фактор продолжает привлекать меня в также (и я - большой поклонник конкатенативных языков). Нерешительность Hrm..

ОБНОВЛЕНИЕ: Я с тех пор решил изучить Фактор правильно и использовать его для моего предстоящего большого персонального проекта. Тем временем я работаю над некоторыми проблемами от Программирования проблем в Факторе.

ОБНОВЛЕНИЕ 2: Фактор не вполне сокращал его.. Не из-за языка язык является большим, и я рекомендую всем смотреть на него. Причиной была спокойная привязка. Это было важным недопустимым для меня. Я связал бы QT сам и внес бы его, но затем у меня есть два проекта вместо одного, и у меня просто нет времени. Так, жаль Фактор. Я написал код в C++ вместо этого, но я теперь рассматриваю или портирую его на Clojure или пишу будущий код в Clojure.

3
ответ дан 3 December 2019 в 13:25
поделиться

Я использую Factor несколько месяцев, и это действительно впечатляющий язык.

Это похоже на смесь Forth (очевидно), Smalltalk (основанная на изображениях, сильно отражающая, «интегрированная» IDE) и LISP (код как данные, абстракции на уровне синтаксиса, REPL) ... степень, такие языки, как Python или Ruby, с сильным акцентом на прагматизм и открытость (например, «батарейки в комплекте»).

Более того, производительность кажется важной для разработчиков, так как много работы было потрачено на оптимизирующий компилятор, как и реализация Common Lisp на SBCL.

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

5
ответ дан 3 December 2019 в 13:25
поделиться