Unity - 在运行时的某个时间点将 List<Vector3> 从 sriptable 对象复制到另一个对象

Unity - Copy List<Vector3> from sriptable object to another at certain point of runtime

我正在制作计时赛游戏,所以当玩家完成一圈时,幽灵会复制玩家完成的最佳圈速。

我使用两个脚本对象来存储最佳圈速和实际圈速的数据。

我的问题是当我删除实际圈数的数据时,最佳圈数的数据也被删除了。

在 GameManager 中,如果玩家打败了自己的时间,那么我会这样做:

GhostController.sharedInstance.bestLap.carPositions = GhostController.sharedInstance.actualLap.carPositions; GhostController.sharedInstance.bestLap.carRotations = GhostController.sharedInstance.actual.carRotations;

并清除实际数据列表:

GhostController.sharedInstance.actualLap.carPositions.Reset(); 
GhostController.sharedInstance.actual.carRotations.Reset();

我必须使用单例模式来访问 GhostController 方法,所以在 GhostController class 我有:

public GhostLapController actualLap; 
public GhostLapController bestLap; 

public static GhostController sharedInstance;

public GhostLapController actualLap;
public GhostLapController bestLap;

private void Awake()
{
    if(sharedInstance == null)
    {
        sharedInstance = this;
    }
}

在 ScriptableObjectController 中我有:

 [CreateAssetMenu]
 public class GhostLapController : ScriptableObject
{
public List<Vector3> carPositions;
public List<Quaternion> carRotations;

public void AddNewData(Transform transform)
{
    carPositions.Add(transform.position);
    carRotations.Add(transform.rotation);
}

public void GetDataAtPosition(int sample, out Vector3 position, out Quaternion rotation)
{
    position = carPositions[sample];
    rotation = carRotations[sample];
}

public void Reset()
{
    carPositions.Clear();
    carRotations.Clear();
}

}

就像这个分配一样,它总是读取 actualLap 数据,而不是在执行时获取它的值的屏幕截图。

GhostController.sharedInstance.bestLap.carPositions = GhostController.sharedInstance.actualLap.carPositions; GhostController.sharedInstance.bestLap.carRotations = GhostController.sharedInstance.actual.carRotations;

你能帮帮我吗?

GhostController.sharedInstance.bestLap.carPositions =  GhostController.sharedInstance.actualLap.carPositions;
GhostController.sharedInstance.bestLap.carRotations = GhostController.sharedInstance.actual.carRotations;

你完全按照你描述的去做!

在此之后,例如

GhostController.sharedInstance.bestLap.carPositions

GhostController.sharedInstance.actualLap.carPositions

都将保存对 完全相同的集合实例的引用 !

如果您更想要一份副本,请执行例如

GhostController.sharedInstance.bestLap.carPositions = new List<Vector3>(GhostController.sharedInstance.actualLap.carPositions);
GhostController.sharedInstance.bestLap.carRotations = new List<Quaternion>(GhostController.sharedInstance.actual.carRotations);