예제 #1
0
        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;
        }
예제 #2
0
 public SnappedCondition(SnappableProperty target, SnapZoneProperty snapZone = null, string name = null) : this(TrainingReferenceUtils.GetNameFrom(target), TrainingReferenceUtils.GetNameFrom(snapZone), name)
 {
 }