如何使用ScriptableObject进行关卡的Prefab转换?

时间:2019-06-16 11:57:54

标签: unity3d scriptable-object

我有3种预制件:A,B和C

在设计关卡时,在“播放模式”中,我将它们添加并放置在关卡中。

如何创建一个ScriptableObject来保存对这些预制件及其转换的所有实例的引用?

具体来说,在PlayMode中,可编写脚本的对象应在PlayMode中动态响应预制件的位置和旋转变化。

尽管这似乎很好地使用了可脚本编写的对象,但我无法想到如何做到这一点。

1 个答案:

答案 0 :(得分:1)

您可以将所需的信息存储在一个专门的类中,例如

[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是一个类,因此在此处更改值的引用类型也会自动更改ScriptableObject instances中的相应条目!