public static void RemoveConstraint <T>(GameObject gobject) where T : UnityEngine.Component { T component = gobject.GetComponent <T>(); IConstraint constraint = component as IConstraint; ParametersController parametersController = gobject.GetComponent <ParametersController>(); if (null != parametersController) { ConstraintType constraintType = ConstraintType.Unknown; switch (component) { case ParentConstraint _: constraintType = ConstraintType.Parent; break; case LookAtConstraint _: constraintType = ConstraintType.LookAt; break; } foreach (Constraint con in constraints) { if (con.gobject == gobject && con.constraintType == constraintType) { GameObject.Destroy(con.lineGameObject); constraints.Remove(con); break; } } } GameObject source = constraint.GetSource(0).sourceTransform.gameObject; ParametersController sourceParametersController = source.GetComponent <ParametersController>(); if (null != sourceParametersController) { sourceParametersController.RemoveConstraintHolder(gobject); } constraint.RemoveSource(0); GameObject.Destroy(component); GlobalState.FireObjectConstraint(gobject); }
public static void AddLookAtConstraint(GameObject gobject, GameObject target, int index = -1) { LookAtConstraint constraint = gobject.GetComponent <LookAtConstraint>(); if (null == constraint) { constraint = gobject.AddComponent <LookAtConstraint>(); ParametersController parametersController = gobject.GetComponent <ParametersController>(); if (null == parametersController) { gobject.AddComponent <ParametersController>(); } Constraint newConstraint = new Constraint { gobject = gobject, target = target.transform, constraintType = ConstraintType.LookAt }; if (index == -1) { constraints.Add(newConstraint); } else { constraints.Insert(index, newConstraint); } ParametersController targetParametersController = target.GetComponent <ParametersController>(); if (null == targetParametersController) { targetParametersController = target.AddComponent <ParametersController>(); } targetParametersController.AddConstraintHolder(gobject); } else { // update visual target for LineRenderer foreach (Constraint c in constraints) { if (c.gobject == gobject && c.constraintType == ConstraintType.LookAt) { c.target = target.transform; break; } } } ConstraintSource source; if (constraint.sourceCount == 0) { source = new ConstraintSource(); constraint.AddSource(source); } else { source = constraint.GetSource(0); } source.sourceTransform = target.transform; source.weight = 1f; constraint.SetSource(0, source); constraint.rotationOffset = new Vector3(0, 180, 0); constraint.constraintActive = true; GlobalState.FireObjectConstraint(gobject); }
public static void AddParentConstraint(GameObject gobject, GameObject target, int index = -1) { ParentConstraint constraint = gobject.GetComponent <ParentConstraint>(); if (null == constraint) { constraint = gobject.AddComponent <ParentConstraint>(); ParametersController parametersController = gobject.GetComponent <ParametersController>(); if (null == parametersController) { gobject.AddComponent <ParametersController>(); } Constraint newConstraint = new Constraint { gobject = gobject, target = target.transform, constraintType = ConstraintType.Parent }; if (index == -1) { constraints.Add(newConstraint); } else { constraints.Insert(index, newConstraint); } ParametersController targetParametersController = target.GetComponent <ParametersController>(); if (null == targetParametersController) { targetParametersController = target.AddComponent <ParametersController>(); } targetParametersController.AddConstraintHolder(gobject); } else { // update visual target for LineRenderer foreach (Constraint c in constraints) { if (c.gobject == gobject && c.constraintType == ConstraintType.Parent) { c.target = target.transform; break; } } } ConstraintSource source; if (constraint.sourceCount == 0) { source = new ConstraintSource(); constraint.AddSource(source); } else { source = constraint.GetSource(0); } source.sourceTransform = target.transform; source.weight = 1f; constraint.SetSource(0, source); constraint.translationAtRest = gobject.transform.localPosition; constraint.rotationAtRest = gobject.transform.localRotation.eulerAngles; Vector3 offset = Vector3.Scale(target.transform.InverseTransformPoint(gobject.transform.position), target.transform.lossyScale); constraint.SetTranslationOffset(0, offset); Quaternion quat = Quaternion.Inverse(target.transform.rotation) * gobject.transform.rotation; constraint.SetRotationOffset(0, quat.eulerAngles); constraint.constraintActive = true; GlobalState.FireObjectConstraint(gobject); }