03-07-2023, 07:20 AM
So just a quick update on my journey of resetting softbodies
Weirdly, the two-line script using the teleport still crashed my editor. I created a completely empty scene only with a solver and a softbody. When I reset its position and exit playmode afterwards, Unity crashes. BUT, your other script does work - I only had to swap the "count" parts to "Length".
Here's the adjusted script that lets Unity live (in my case):
using UnityEngine;
using Obi;
[RequireComponent(typeof(ObiSoftbody))]
public class ResetActor : MonoBehaviour
{
ObiSoftbody softbody;
Vector4[] originalPositions;
Quaternion[] originalOrientations;
void Update()
{
if (Input.GetKeyDown(KeyCode.G))
{
ResetToOriginalPosition();
}
}
void OnEnable()
{
softbody = GetComponent<ObiSoftbody>();
softbody.OnBlueprintLoaded += Softbody_OnBlueprintLoaded;
if (softbody.isLoaded)
Softbody_OnBlueprintLoaded(softbody, softbody.softbodyBlueprint);
}
void OnDisable()
{
softbody.OnBlueprintLoaded -= Softbody_OnBlueprintLoaded;
}
private void Softbody_OnBlueprintLoaded(ObiActor actor, ObiActorBlueprint blueprint)
{
originalPositions = new Vector4[softbody.solverIndices.Length];
originalOrientations = new Quaternion[softbody.solverIndices.Length];
for (int i = 0; i < softbody.solverIndices.Length; ++i)
{
int solverIndex = softbody.solverIndices[i];
originalPositions[i] = softbody.solver.positions[solverIndex];
originalOrientations[i] = softbody.solver.orientations[solverIndex];
}
}
public void ResetToOriginalPosition()
{
for (int i = 0; i < softbody.solverIndices.Length; ++i)
{
int solverIndex = softbody.solverIndices[i];
softbody.solver.positions[solverIndex] = originalPositions[i];
softbody.solver.orientations[solverIndex] = originalOrientations[i];
softbody.solver.velocities[solverIndex] = softbody.solver.angularVelocities[solverIndex] = Vector4.zero;
}
}
}
I know that the teleport shouldn't cause any problems, but Unity is a fickle bitch and maybe it helps any other person who has the same bug as me.
Cheers
Felix
Weirdly, the two-line script using the teleport still crashed my editor. I created a completely empty scene only with a solver and a softbody. When I reset its position and exit playmode afterwards, Unity crashes. BUT, your other script does work - I only had to swap the "count" parts to "Length".
Here's the adjusted script that lets Unity live (in my case):
using UnityEngine;
using Obi;
[RequireComponent(typeof(ObiSoftbody))]
public class ResetActor : MonoBehaviour
{
ObiSoftbody softbody;
Vector4[] originalPositions;
Quaternion[] originalOrientations;
void Update()
{
if (Input.GetKeyDown(KeyCode.G))
{
ResetToOriginalPosition();
}
}
void OnEnable()
{
softbody = GetComponent<ObiSoftbody>();
softbody.OnBlueprintLoaded += Softbody_OnBlueprintLoaded;
if (softbody.isLoaded)
Softbody_OnBlueprintLoaded(softbody, softbody.softbodyBlueprint);
}
void OnDisable()
{
softbody.OnBlueprintLoaded -= Softbody_OnBlueprintLoaded;
}
private void Softbody_OnBlueprintLoaded(ObiActor actor, ObiActorBlueprint blueprint)
{
originalPositions = new Vector4[softbody.solverIndices.Length];
originalOrientations = new Quaternion[softbody.solverIndices.Length];
for (int i = 0; i < softbody.solverIndices.Length; ++i)
{
int solverIndex = softbody.solverIndices[i];
originalPositions[i] = softbody.solver.positions[solverIndex];
originalOrientations[i] = softbody.solver.orientations[solverIndex];
}
}
public void ResetToOriginalPosition()
{
for (int i = 0; i < softbody.solverIndices.Length; ++i)
{
int solverIndex = softbody.solverIndices[i];
softbody.solver.positions[solverIndex] = originalPositions[i];
softbody.solver.orientations[solverIndex] = originalOrientations[i];
softbody.solver.velocities[solverIndex] = softbody.solver.angularVelocities[solverIndex] = Vector4.zero;
}
}
}
I know that the teleport shouldn't cause any problems, but Unity is a fickle bitch and maybe it helps any other person who has the same bug as me.
Cheers
Felix