Вы можете хранить нужную информацию в специальном классе, например,
[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!