private void CreateSnapZone(SnappableProperty snappable) { // Retrieves a SnapZoneSettings and creates a clone for the snappable object SnapZoneSettings settings = SnapZoneSettings.Settings; GameObject snapZoneBlueprint = DuplicateObject(snappable.gameObject, settings.HighlightMaterial); // Saves it as highlight prefab. GameObject snapZonePrefab = SaveSnapZonePrefab(snapZoneBlueprint); // Creates a new object for the SnapZone. GameObject snapObject = new GameObject($"{CleanName(snappable.name)}_SnapZone"); Undo.RegisterCreatedObjectUndo(snapObject, $"Create {snapObject.name}"); // Positions the Snap Zone at the same position, rotation and scale as the snappable object. snapObject.transform.SetParent(snappable.transform); snapObject.transform.SetPositionAndRotation(snappable.transform.position, snappable.transform.rotation); snapObject.transform.localScale = Vector3.one; snapObject.transform.SetParent(null); // Adds a Snap Zone component to our new object. SnapZone snapZone = snapObject.AddComponent <SnapZoneProperty>().SnapZone; snapZone.ShownHighlightObject = snapZonePrefab; IsTrainingSceneObjectValidation validation = snapZone.gameObject.AddComponent <IsTrainingSceneObjectValidation>(); validation.AddTrainingSceneObject(snappable.GetComponent <TrainingSceneObject>()); settings.ApplySettingsToSnapZone(snapZone); GameObject snapPoint = new GameObject("SnapPoint"); snapPoint.transform.SetParent(snapZone.transform); snapPoint.transform.localPosition = Vector3.zero; snapPoint.transform.localScale = Vector3.one; snapPoint.transform.localRotation = Quaternion.identity; snapPoint.AddComponent <SnapZonePreviewDrawer>(); SerializedObject snapZoneSerialization = new SerializedObject(snapZone); SerializedProperty property = snapZoneSerialization.FindProperty("m_AttachTransform"); property.objectReferenceValue = snapPoint.transform; snapZoneSerialization.ApplyModifiedPropertiesWithoutUndo(); // Calculates the volume of the Snap Zone out of the snappable object. Bounds bounds = new Bounds(Vector3.zero, Vector3.zero); foreach (Renderer renderer in snapZoneBlueprint.GetComponentsInChildren <Renderer>()) { bounds.Encapsulate(renderer.bounds); } // Adds a BoxCollider and sets it up. BoxCollider boxCollider = snapObject.AddComponent <BoxCollider>(); boxCollider.center = bounds.center; boxCollider.size = bounds.size; boxCollider.isTrigger = true; // Disposes the cloned object. DestroyImmediate(snapZoneBlueprint); Selection.activeGameObject = snapZone.gameObject; }
public SnappedCondition(SnappableProperty target, SnapZoneProperty snapZone = null, string name = null) : this(TrainingReferenceUtils.GetNameFrom(target), TrainingReferenceUtils.GetNameFrom(snapZone), name) { }