Propagate this code to other users when you see them need to reset any ObiActor (Rope, Cloth,Softbody or whatever)
This is needed when teleport, or optimize disable > move solver to new pos > enable back.
How to use:
Setup on Start (softbody is a reference that you wired in inspector, this is for example, it can be anything: rope, obibone, cloth)
When want to Reset / Restore it to starting local position related to the solver
This is needed when teleport, or optimize disable > move solver to new pos > enable back.
Code:
public class ObiActorResetor {
public ObiActor actor;
Vector3 localPosition;
Quaternion localRotation;
public ObiActorResetor(ObiActor actor) {
Setup(actor);
}
//do not do this in Awake, since at the time the obi solver still not done setup
public void Setup(ObiActor actor) {
this.actor = actor;
var parent = actor.solver.transform;
localPosition = parent.InverseTransformPoint(actor.transform.position);
localRotation = Quaternion.Inverse(parent.rotation) * actor.transform.rotation;
}
//the action teleport can not do instantly, should sub it on next frame of the sim
public void MarkShouldReset() {
actor.solver.OnSimulationStart -= DoReset;
actor.solver.OnSimulationStart += DoReset;
}
void DoReset(ObiSolver solver, float simulatedTime, float substepTime){
var parent = actor.solver.transform;
actor.Teleport(parent.TransformPoint(localPosition), parent.rotation * localRotation);
actor.ResetParticles();
actor.solver.OnSimulationStart -= DoReset;
}
}
How to use:
Setup on Start (softbody is a reference that you wired in inspector, this is for example, it can be anything: rope, obibone, cloth)
Code:
ObiActorResetor softbodyResetor;
private void Start()
{
softbodyResetor = new ObiActorResetor(softbody);
}
When want to Reset / Restore it to starting local position related to the solver
Code:
softbodyResetor.MarkShouldReset();