コード例 #1
0
    void OnGUI()
    {
        GUILayout.Label("Raycast Settings", EditorStyles.boldLabel);
        string[]         guids      = AssetDatabase.FindAssets("t:" + typeof(FloorObjectsData).ToString());
        string           path       = AssetDatabase.GUIDToAssetPath(guids[0]);
        FloorObjectsData data       = AssetDatabase.LoadAssetAtPath <FloorObjectsData>(path);
        List <string>    layerNames = GetLayerNames();

        data.RaycastYOffset    = Mathf.Max(data.RaycastYOffset, 0);
        data.RaycastYOffset    = EditorGUILayout.FloatField(new GUIContent("Y Offset"), data.RaycastYOffset);
        data.RaycastMask.value = EditorGUILayout.MaskField(new GUIContent("Raycast mask"), data.RaycastMask, layerNames.ToArray());

        GUILayout.Label("Debug", EditorStyles.boldLabel);
        data.ShowRaycast = EditorGUILayout.Toggle(new GUIContent("Show raycast"), data.ShowRaycast);

        GUIStyle style = GUI.skin.button;

        style.fixedHeight = 70;

        Transform[] selectedTransforms = Selection.transforms;
        if (selectedTransforms.Length > 0)
        {
            if (GUILayout.Button("Floor selected objects", style))
            {
                FloorTransform(data, Selection.transforms);
            }
        }
        else
        {
            if (GUILayout.Button("Floor ALL objects in scene", style))
            {
                bool dialogResult = EditorUtility.DisplayDialog("Floor ALL objects in scene",
                                                                "Are you sure you want to place ALL objects in scene (including, cameras, lights and others)",
                                                                "Yes",
                                                                "No");


                if (dialogResult)
                {
                    List <Transform> transformsInScene = GetObjectsInScene();
                    FloorTransform(data, transformsInScene.ToArray());
                }
            }
        }
    }
コード例 #2
0
    private static void FloorTransform(FloorObjectsData data, Transform[] selectedTransforms)
    {
        foreach (var selectedTransform in selectedTransforms)
        {
            Collider[] colliders = selectedTransform.GetComponentsInChildren <Collider>();
            foreach (var col in colliders)
            {
                col.enabled = false;
            }

            Vector3 originPos = selectedTransform.position + (Vector3.up * data.RaycastYOffset);

            RaycastHit hitInfo;
            bool       didRaycastHit = Physics.Raycast(originPos, Vector3.down, out hitInfo, 1000, data.RaycastMask);
            if (didRaycastHit)
            {
                if (selectedTransform.position != hitInfo.point)
                {
                    Undo.RegisterCompleteObjectUndo(selectedTransform, "Floor object");
                    selectedTransform.position = hitInfo.point;
                }
            }

            foreach (var col in colliders)
            {
                col.enabled = true;
            }

            if (data.ShowRaycast)
            {
                if (didRaycastHit)
                {
                    float distance = originPos.y - hitInfo.point.y;
                    Debug.DrawRay(originPos, Vector3.down * distance, Color.green, 0.1f);
                }
                else
                {
                    Debug.DrawRay(originPos, Vector3.down * 1000, Color.red, 0.1f);
                }
            }
        }
    }