При попытке собрать игру я получаю сообщение об ошибке в консоли редактора, но не в Visual Studio. Как я могу это исправить? - PullRequest
0 голосов
/ 23 февраля 2020

Errors in editor

В сценарии я использую SceneManagement:

using UnityEditor.SceneManagement;

Но он серого цвета, как будто я не использую его в сценарии , Но если я уберу строку:

using UnityEditor.SceneManagement;

Она не покажет ошибки в визуальной студии, но если я попытаюсь сейчас скомпилировать игру в редакторе, она покажет 10 ошибок в консоли нужных мест the SceneManagement.

Никогда раньше в этом скрипте не было ошибок. Это началось, как только я попытался собрать игру.

Снимок экрана части моего сценария. SceneManagement отображается серым цветом, он не нужен и не используется, но он:

Part of script

И окно настроек здания в редакторе:

Build Settings

Я попытался закрыть выход Visual Studio и снова открыть его из редактора, дважды щелкнув скрипт, но ничего не изменилось.

Полный скрипт:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEditor;
using UnityEngine;
using UnityEditor.SceneManagement;

public class ObjectsReplace : MonoBehaviour
{
    public GameObject prefabToInit;
    public bool deleteAllShaders = false;

    private const string c_doorRight = "Door_Right";
    private const string c_doorLeft = "Door_Left";
    private const string c_doorShieldFxLocked = "DoorShieldFXLocked";

    public List<GameObject> FindDoors(string[] SpecificParents)
    {
        GameObject[] doorsLeft = GameObject.FindGameObjectsWithTag(c_doorLeft);
        GameObject[] doorsRight = GameObject.FindGameObjectsWithTag(c_doorRight);

        List<GameObject> allDoors = doorsLeft.Union(doorsRight).ToList();

        if (deleteAllShaders == false)
        {
            List<GameObject> toRemove = new List<GameObject>();
            for (int i = 0; i < allDoors.Count; i++)
            {
                bool match = true;
                for (int x = 0; x < SpecificParents.Length; x++)
                {
                    match &= allDoors[i].transform.parent.name != SpecificParents[x];
                }
                if (match)
                {
                    toRemove.Add(allDoors[i]);
                }
            }
            foreach (var it in toRemove)
            {
                allDoors.Remove(it);
            }
        }

        return allDoors;
    }

    public void DeleteAllShaders()
    {
        if(deleteAllShaders == true)
        {
            UpdateOrAddShaderPrefabToDoors();
        }
    }

    public void UpdateOrAddShaderPrefabToDoors()
    {
        var allDoors = FindDoors(new string[]{ "Wall_Door_Long_01", "Wall_Door_Long_02", "Wall_Interior_Door_02" });

        HashSet<GameObject> prefabParentsOfDoorsNeedRemove = new HashSet<GameObject>();
        allDoors.ForEach(doorGameObject =>
        {
            List<GameObject> shadersChildren = new List<GameObject>();
            for (int i=0; i<doorGameObject.transform.childCount ;i++)
            {
                if (doorGameObject.transform.GetChild(i).name.StartsWith(c_doorShieldFxLocked))
                {
                    shadersChildren.Add(doorGameObject.transform.GetChild(i).gameObject);
                }
            }
            foreach (GameObject shader in shadersChildren)
            {
                GameObject outermostPrefabInstanceRoot = PrefabUtility.GetOutermostPrefabInstanceRoot(shader);
                prefabParentsOfDoorsNeedRemove.Add(outermostPrefabInstanceRoot);
            }
        });

        foreach (GameObject parent in prefabParentsOfDoorsNeedRemove)
        {
            Modify(parent, RemoveFunc);
        }

        HashSet<GameObject> prefabParentsOfDoors = new HashSet<GameObject>();
        allDoors.ForEach(doorGameObject =>
        {
            GameObject outermostPrefabInstanceRoot = PrefabUtility.GetOutermostPrefabInstanceRoot(doorGameObject);
            prefabParentsOfDoors.Add(outermostPrefabInstanceRoot);
        });

        if (deleteAllShaders == false)
        {
            foreach (GameObject parent in prefabParentsOfDoors)
            {
                AddShaderToPrefab(parent);
            }
        }
    }

    private void AddShaderToPrefab(GameObject child)
    {
        Modify(child, AddShaderToAllDoorsFunc);
    }

    private GameObject AddShaderToAllDoorsFunc(GameObject prefab)
    {
        var children = prefab.GetComponentsInChildren<Transform>();

        //Debug.Log($"Total child count before:{children.Count()}");
        int doorsFound = 0;
        foreach (Transform trans in children)
        {
            if (trans.name == c_doorLeft || (trans.name == c_doorRight))
            {
                //Debug.Log("Found door, adding");
                GameObject shader = GetDoorShaderPrefab();

                // clone prefab and attach to parent
                Instantiate(shader, trans); 
                doorsFound++;
            }
        }

        children = prefab.GetComponentsInChildren<Transform>();
        //Debug.Log($"Total child count after:{children.Count()}, doors found:{doorsFound}");

        return prefab;
    }

    private GameObject GetDoorShaderPrefab()
    {
        string[] shieldPrefab = AssetDatabase.FindAssets(c_doorShieldFxLocked);
        //Debug.Assert(shieldPrefab.Length == 1, "Expected exactly 1 shield like this...");
        string shieldGuid = shieldPrefab[0];
        string prefabPath = AssetDatabase.GUIDToAssetPath(shieldGuid);
        GameObject prefab = AssetDatabase.LoadAssetAtPath<GameObject>(prefabPath);
        //Debug.Assert(prefab != null, "Expected prefab to load");
        return prefab;
    }

    private GameObject RemoveFunc(GameObject prefab)
    {
        var children = prefab.GetComponentsInChildren<Transform>();

        //Debug.Log($"child count:{children.Count()}");
        foreach (Transform trans in children)
        {
            if (trans.name.StartsWith(c_doorShieldFxLocked))
            {
                //Debug.Log("Found door shader");
                DestroyImmediate(trans.gameObject);
            }
        }

        children = prefab.GetComponentsInChildren<Transform>();
        //Debug.Log($"child count:{children.Count()}");

        return prefab;
    }

    private void Modify(GameObject parentPrefab, Func<GameObject,GameObject> modifyActionOnPrefab)
    {
        // Get the Prefab Asset root GameObject and its asset path.
        string assetPath = PrefabUtility.GetPrefabAssetPathOfNearestInstanceRoot(parentPrefab);

        // Load the contents of the Prefab Asset.
        GameObject prefab = PrefabUtility.LoadPrefabContents(assetPath);

        //PrefabUtility.UnpackPrefabInstance(mostPrefabInstanceRoot, PrefabUnpackMode.Completely, UnityEditor.InteractionMode.AutomatedAction);

        prefab = modifyActionOnPrefab(prefab);

        PrefabUtility.SaveAsPrefabAsset(prefab, assetPath);
        PrefabUtility.UnloadPrefabContents(prefab);
    }
}

Это скрипт редактора, который я тоже использую с моно скриптом:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using UnityEditor;
using UnityEditorInternal;
using UnityEngine;

[CustomEditor(typeof(ObjectsReplace))]
public class ObjectsReplaceEditor : Editor
{
    public override void OnInspectorGUI()
    {
        DrawDefaultInspector();

        ObjectsReplace myScript = (ObjectsReplace)target;

        if (GUILayout.Button("Add"))
        {
            myScript.UpdateOrAddShaderPrefabToDoors();
        }

        GUILayout.Space(20);

        if(GUILayout.Button("Delete all shaders"))
        {
            myScript.DeleteAllShaders();
        }
    }
}

Опять! что происходит:

  1. Я могу запустить игру в редакторе без проблем. Без ошибок нет проблем.

  2. Я могу скомпилировать и сохранить сценарии в Visual Studio без проблем без ошибок, без проблем.

  3. Я могу не собирайте игру только в редакторе !!! при сборке игры отображаются ошибки только в консоли редактора Unity! Все еще нет ошибок в визуальной студии. Я могу играть в игру в редакторе, я не могу собрать игру.

  4. Пространство имен SceneManagement существует в сценарии с использованием UnityEngine или UnityEditor, но это не проблема. Проблема не в том, что я использую UnityEngine или UnityEditor со SceneManagement, SceneManagement серый, как нет в использовании, но он используется!

  5. Если удалить, удалить сценарии, моно и редактор, и я смогу построить игру!

  6. Я пока не понимаю, почему в настройки сборки при сборке дают мне эти ошибки, но они не отображаются в визуальной студии!

1 Ответ

2 голосов
/ 23 февраля 2020

Используйте UnityEngine.SceneManagement, а не UnityEditor.SceneManagement.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...