Как использовать ScriptableObject для префаб-преобразований уровня? - PullRequest
1 голос
/ 16 июня 2019

У меня есть 3 типа префабов: A, B & C

При проектировании уровней в режиме воспроизведения я добавляю и размещаю их в пределах уровня.

Как создатьScriptableObject, который содержит ссылки на все экземпляры этих префабов и их преобразований?

В частности, в то время как в PlayMode объект Scriptable должен динамически реагировать на изменения положения и поворота префабов в PlayMode.

Я не могу представить, как это сделать, несмотря на то, что это выглядитхорошее использование объектов Scriptable.

1 Ответ

1 голос
/ 16 июня 2019

Вы можете хранить нужную информацию в специальном классе, например,

[Serializable]
public class InstanceInformation
{
    public GameObject UsedPrefab;
    public Vector3 Position;
    public Quaternion Rotation;
    public Vector3 Scale;

    public InstanceInformation(GameObject usedPrefab, Transform transform)
    {
        UsedPrefab = usedPrefab;
        Rotation = transform.rotation;
        Position = transform.position;
        Scale = transform.localScale;
    }

    public void UpdateValues(Transform transform)
    {
        Rotation = transform.rotation;
        Position = transform.position;
        Scale = transform.localScale;
    }
}

, и в вашем ScriptableObject есть

public List<InstanceInformation> instances = new List<InstanceInformation>();

Затем каждый раз, когда вы создаете префаб, вы также создаетев соответствии с записью в этом списке instances.

Затем в вашем менеджере сценарий, где вы можете указать, что вы делаете, например:

public YourScriptableObject scriptable;

// Fpr keeping a link for the currently Instantiated stuff
private Dictionary<GameObject, InstanceInformation> objectToInstanceInformation = new Dictionary<GameObject, InstanceInformation>();

...

var obj = Instantiate(aPrefab, aPosition, aRotation);

var instanceInfo = new InstanceInfo(aPrefab, obj.transform);

// Add the reference to the ScriptableObject list
scriptable.instances.Add(instanceInfo);
// And also keep track of the reference linked to the actual instance
objectToInstanceInformation.Add(obj, instanceInfo);

Теперь вы можете либо несколько раз, либо в определенный момент позвонить

public void SaveInstanceInformations()
{
    foreach(var kvp in objectToInstanceInformation)
    {
        var obj = kvp.key;
        var instanceInfo = kvp.value;

        instanceInfo.UpdateValues(obj.transform);
    }
}

Поскольку InstanceInformation является классом и, таким образом, тип ссылки, изменяющий значения здесь автоматически, также изменяет соответствующую запись в instances в ScriptableObject!

...