我有3种预制件:A,B和C
在设计关卡时,在“播放模式”中,我将它们添加并放置在关卡中。
如何创建一个ScriptableObject来保存对这些预制件及其转换的所有实例的引用?
具体来说,在PlayMode中,可编写脚本的对象应在PlayMode中动态响应预制件的位置和旋转变化。
尽管这似乎很好地使用了可脚本编写的对象,但我无法想到如何做到这一点。
答案 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
中的相应条目!