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);
我正在制作计时赛游戏,所以当玩家完成一圈时,幽灵会复制玩家完成的最佳圈速。
我使用两个脚本对象来存储最佳圈速和实际圈速的数据。
我的问题是当我删除实际圈数的数据时,最佳圈数的数据也被删除了。
在 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);