(08-05-2024, 05:33 PM)Crystalius Wrote: Hello. I've been struggling with moving the rope where I want to. My goal at the moment is to disable the solver along with the rope when I don't need them for performance reasons, but when I re-enable them the position is kept old, which is understandable of course. What would be the simplest way to move the rope after I enable it? I've read your discussion about that in another thread from 2020 but I couldn't recreate their script in Unity's visual scripting.
I can easily get the positions with ObiRope GetParticlePosition. But how would I set them? If it was the same as getting them and iterating through all the particles I probably wouldn't be writing here.
I would very much appreciate your support here
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 > enable back like you said.
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();