Пример #1
0
    void OnEnable()
    {
        if (mBuildData == null || !mBuildData.IsValid)
        {
            // Don't trust Unity de-serialization of null objects.
            mBuildData = new TileBuildData();
        }

        CleanBuild();

        if (mBuildType == NavmeshBuildType.Advanced)
        {
            BuildSelector.Instance.Add(this);
        }
    }
Пример #2
0
    /// <summary>
    /// Resets the build to the <see cref="NavmeshBuildState.Inactive"/> state, clearing all
    /// build data.
    /// </summary>
    public void ResetBuild()
    {
        mBuildData = new TileBuildData();
        mTileSet   = null;

        mInputGeom       = null;
        mInputInfo       = new InputBuildInfo();
        mNMGenProcessors = null;
        mConnections     = null;

        mBoundsMin = Vector3.zero;
        mBoundsMax = Vector3.zero;

        mIsDirty = true;
    }
Пример #3
0
    /// <summary>
    /// Controls behavior of the inspector.
    /// </summary>
    public override void OnInspectorGUI()
    {
        NavmeshBuild targ = (NavmeshBuild)target;

        EditorGUIUtility.LookLikeControls(100);

        OnGUIState(targ);

        GUI.enabled = !targ.HasBuildData;

        EditorGUILayout.Separator();

        targ.BuildTarget = NavEditorUtil.OnGUINavmeshDataField("Bake Target", targ.BuildTarget);

        EditorGUILayout.Separator();

        NavmeshBuildType buildType = (NavmeshBuildType)
                                     EditorGUILayout.EnumPopup("Build Type", targ.BuildType);

        if (buildType != targ.BuildType)
        {
            targ.BuildType = buildType;
            if (buildType == NavmeshBuildType.Advanced)
            {
                BuildSelector.Instance.Select(targ);
            }
        }

        EditorGUILayout.Separator();

        TileBuildData tdata = targ.BuildData;

        GUI.enabled = (tdata == null && targ.TargetHasNavmesh);

        if (GUILayout.Button("Log Mesh State"))
        {
            Debug.Log(targ.BuildTarget.GetMeshReport());
        }

        GUI.enabled = true;

        switch (targ.BuildType)
        {
        case NavmeshBuildType.Standard:
            OnGUIStandard(targ);
            break;

        case NavmeshBuildType.Advanced:
            OnGUIAdvanced(targ);
            break;
        }

        EditorGUILayout.Separator();

        bool orig = mShowInputConfig;

        mShowInputConfig = EditorGUILayout.Foldout(mShowInputConfig, "Input Configuration");
        if (orig != mShowInputConfig)
        {
            EditorPrefs.SetBool(ShowInputKey, mShowInputConfig);
        }

        EditorGUIUtility.LookLikeControls();

        if (mShowInputConfig)
        {
            GUI.enabled = !targ.HasBuildData;

            EditorGUILayout.Separator();

            targ.AutoCleanGeometry = EditorGUILayout.Toggle("Auto-Clean", targ.AutoCleanGeometry);

            EditorGUILayout.Separator();

            ScriptableObject so  = (ScriptableObject)targ.SceneQuery;
            ScriptableObject nso = (ScriptableObject)EditorGUILayout.ObjectField(
                "Scene Query"
                , so
                , typeof(ScriptableObject)
                , false);

            if (nso != so)
            {
                if (!nso || nso is ISceneQuery)
                {
                    targ.SceneQuery = (ISceneQuery)nso;
                }
                else
                {
                    Debug.LogError(string.Format("{0} does not implement {1}."
                                                 , nso.name, typeof(ISceneQuery).Name));
                }
            }

            EditorGUILayout.Separator();

            if (OnGUIManageProcessorList(targ.inputProcessors))
            {
                targ.IsDirty = true;
            }

            GUI.enabled = true;
        }

        EditorGUILayout.Separator();

        if (targ.IsDirty)
        {
            EditorUtility.SetDirty(target);
            targ.IsDirty = false;
        }
    }
Пример #4
0
    private static void OnGUIState(NavmeshBuild build)
    {
        INavmeshData     btarget = build.BuildTarget;
        NavmeshBuildInfo binfo   = (btarget == null ? null : btarget.BuildInfo);

        EditorGUILayout.Separator();

        System.Text.StringBuilder sb = new System.Text.StringBuilder();

        if (build.BuildState == NavmeshBuildState.Invalid)
        {
            if (!(ScriptableObject)btarget)
            {
                sb.AppendLine("No build target.");
            }

            if (build.inputProcessors.Count == 0)
            {
                sb.AppendLine("No input processors.");
            }

            GUILayout.Label(sb.ToString().Trim()
                            , EditorUtil.ErrorStyle, GUILayout.ExpandWidth(true));

            return;
        }

        sb.AppendLine("Input Scene: " + NavEditorUtil.SceneDisplayName(binfo));

        if (build.SceneQuery == null)
        {
            sb.AppendLine("Search scope: Entire scene");
        }

        if (build.TargetHasNavmesh)
        {
            sb.AppendLine("Target has existing navmesh.");
        }
        else
        {
            sb.AppendLine("Target does not have a navmesh.");
        }

        if (build.BuildType == NavmeshBuildType.Advanced)
        {
            TileBuildData tdata = build.BuildData;
            sb.AppendLine("Build state: " + build.BuildState);
            sb.AppendLine("Active builds: "
                          + (tdata == null ? 0 : build.BuildData.GetActive()));
        }

        GUILayout.Label(sb.ToString().Trim()
                        , EditorUtil.HelpStyle
                        , GUILayout.ExpandWidth(true));


        if (NavEditorUtil.SceneMismatch(binfo))
        {
            GUILayout.Box("Current scene does not match last input scene."
                          , EditorUtil.WarningStyle
                          , GUILayout.ExpandWidth(true));
        }

        EditorGUILayout.Separator();

        GUI.enabled = (btarget != null);

        NavmeshSceneDraw.Instance.OnGUI(build.BuildTarget, "Show Mesh", true, true);

        GUI.enabled = true;

        return;
    }