#unity3d
#unity3d
Вопрос:
Когда я пытаюсь собрать игру, появляется ошибка 22, когда я пытаюсь играть в редакторе, все в порядке.
Я новичок в Unity, поэтому извините, если я допустил какую-то глупую ошибку.
Ошибки:
(Местоположение) (): ошибка CS0234: имя типа или пространства имен «XXXX» не существует в пространстве имен » (вам не хватает ссылки на сборку?)
где XXXX: GraphView (библиотека UnityEditor.Экспериментальный), UIElements (библиотека UnityEditor)
(Местоположение)): ошибка CS0246: не удалось найти тип или имя пространства имен ‘ГГГГ’ (вам не хватает директивы using или ссылки на сборку?)
ГГГГ = Edge, Node, Port, Direction, EditorWindow, MenuItemAttribute, MenuItem
и еще одна ошибка
UnityEditor.BuildPlayerWindow BuildMethodException: 20 ошибок в UnityEditor.BuildPlayerWindow defaultbuildметоды.BuildPlayer (UnityEditor.Параметры BuildPlayerOptions)[0x002bb] в :0
Вот код:
DialogueGraphView
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEditor;
using UnityEditor.Experimental.GraphView;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.UIElements;
using Button = UnityEngine.UIElements.Button;
public class DialogueGraphView : GraphView
{
public readonly Vector2 DefaultNodeSize = new Vector2(200, 150);
public readonly Vector2 DefaultCommentBlockSize = new Vector2(300, 200);
public DialogueNode EntryPointNode;
public DialogueGraphView(DialogueGraph editorWindow)
{
styleSheets.Add(Resources.Load<StyleSheet>("NarrativeGraph"));
SetupZoom(ContentZoomer.DefaultMinScale, ContentZoomer.DefaultMaxScale);
this.AddManipulator(new ContentDragger());
this.AddManipulator(new SelectionDragger());
this.AddManipulator(new RectangleSelector());
this.AddManipulator(new FreehandSelector());
var grid = new GridBackground();
Insert(0, grid);
grid.StretchToParentSize();
AddElement(GetEntryPointNodeInstance());
}
public void CreateNewDialogueNode(string nodeName, Vector2 position)
{
AddElement(CreateNode(nodeName, position));
}
public DialogueNode CreateNode(string nodeName, Vector2 position)
{
var tempDialogueNode = new DialogueNode()
{
title = nodeName,
DialogueText = nodeName,
GUID = Guid.NewGuid().ToString()
};
tempDialogueNode.styleSheets.Add(Resources.Load<StyleSheet>("Node"));
var inputPort = GetPortInstance(tempDialogueNode, Direction.Input, Port.Capacity.Multi);
inputPort.portName = "Input";
tempDialogueNode.inputContainer.Add(inputPort);
tempDialogueNode.RefreshExpandedState();
tempDialogueNode.RefreshPorts();
tempDialogueNode.SetPosition(new Rect(position,
DefaultNodeSize)); //To-Do: implement screen center instantiation positioning
var textField = new TextField("");
textField.RegisterValueChangedCallback(evt =>
{
tempDialogueNode.DialogueText = evt.newValue;
tempDialogueNode.title = evt.newValue;
});
textField.SetValueWithoutNotify(tempDialogueNode.title);
tempDialogueNode.mainContainer.Add(textField);
var button = new Button(() => { AddChoicePort(tempDialogueNode); })
{
text = "Add Choice"
};
tempDialogueNode.titleButtonContainer.Add(button);
return tempDialogueNode;
}
public void AddChoicePort(DialogueNode nodeCache, string overriddenPortName = "")
{
var generatedPort = GetPortInstance(nodeCache, Direction.Output);
var portLabel = generatedPort.contentContainer.Q<Label>("type");
generatedPort.contentContainer.Remove(portLabel);
var outputPortCount = nodeCache.outputContainer.Query("connector").ToList().Count();
var outputPortName = string.IsNullOrEmpty(overriddenPortName)
? $"Option {outputPortCount 1}"
: overriddenPortName;
var textField = new TextField()
{
name = string.Empty,
value = outputPortName
};
textField.RegisterValueChangedCallback(evt => generatedPort.portName = evt.newValue);
generatedPort.contentContainer.Add(new Label(" "));
generatedPort.contentContainer.Add(textField);
var deleteButton = new Button(() => RemovePort(nodeCache, generatedPort))
{
text = "X"
};
generatedPort.contentContainer.Add(deleteButton);
generatedPort.portName = outputPortName;
nodeCache.outputContainer.Add(generatedPort);
nodeCache.RefreshPorts();
nodeCache.RefreshExpandedState();
}
private void RemovePort(Node node, Port socket)
{
var targetEdge = edges.ToList()
.Where(x => x.output.portName == socket.portName amp;amp; x.output.node == socket.node);
if (targetEdge.Any())
{
var edge = targetEdge.First();
edge.input.Disconnect(edge);
RemoveElement(targetEdge.First());
}
node.outputContainer.Remove(socket);
node.RefreshPorts();
node.RefreshExpandedState();
}
private Port GetPortInstance(DialogueNode node, Direction nodeDirection,
Port.Capacity capacity = Port.Capacity.Single)
{
return node.InstantiatePort(Orientation.Horizontal, nodeDirection, capacity, typeof(float));
}
private DialogueNode GetEntryPointNodeInstance()
{
var nodeCache = new DialogueNode()
{
title = "START",
GUID = Guid.NewGuid().ToString(),
DialogueText = "ENTRYPOINT",
EntryPoint = true
};
var generatedPort = GetPortInstance(nodeCache, Direction.Output);
generatedPort.portName = "Next";
nodeCache.outputContainer.Add(generatedPort);
nodeCache.capabilities amp;= ~Capabilities.Movable;
nodeCache.capabilities amp;= ~Capabilities.Deletable;
nodeCache.RefreshExpandedState();
nodeCache.RefreshPorts();
nodeCache.SetPosition(new Rect(100, 200, 100, 150));
return nodeCache;
}
}
GraphSaveUtility
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using UnityEditor;
using UnityEditor.Experimental.GraphView;
using UnityEngine;
using UnityEngine.UIElements;
public class GraphSaveUtility
{
private DialogueGraphView _targetGraphView;
private DialogueContainer _containerCache;
private List<Edge> Edges => _targetGraphView.edges.ToList();
private List<DialogueNode> Nodes => _targetGraphView.nodes.ToList().Cast<DialogueNode>().ToList();
public static GraphSaveUtility GetInstance(DialogueGraphView targetGraphView) {
return new GraphSaveUtility {
_targetGraphView = targetGraphView
};
}
public void SaveGraph(string Filename)
{
if(!Edges.Any()) return;
var dialogueContainer = ScriptableObject.CreateInstance<DialogueContainer>();
var connectedPorts = Edges.Where(x => x.input.node!=null).ToArray();
for (var i = 0; i < connectedPorts.Length; i )
{
var outputNode = connectedPorts[i].output.node as DialogueNode;
var inputNode = connectedPorts[i].input.node as DialogueNode;
dialogueContainer.NodeLinks.Add(new NodeLinkData {
BaseNodeGuid = outputNode.GUID,
PortName = connectedPorts[i].output.portName,
TargetNodeGuid = inputNode.GUID
});
}
foreach(var DialogueNode in Nodes.Where(node=>!node.EntryPoint))
{
dialogueContainer.DialogueNodeData.Add(new DialogueNodeData{
GUID = DialogueNode.GUID,
DialogueText = DialogueNode.DialogueText,
Position = DialogueNode.GetPosition().position
});
}
if(!AssetDatabase.IsValidFolder("Assets/Resources"))
AssetDatabase.CreateFolder("Assets", "Resources");
AssetDatabase.CreateAsset(dialogueContainer, "Assets/Resources/{fileName}.asset");
AssetDatabase.SaveAssets();
}
public void LoadGraph(string Filename) {
_containerCache = Resources.Load<DialogueContainer>(Filename);
if(_containerCache == null) {
EditorUtility.DisplayDialog("File not Found", "Target dialogue graph file does not exists!", "OK");
return;
}
ClearGraph();
CreateNodes();
ConnectNodes();
}
private void ClearGraph() {
Nodes.Find(x => x.EntryPoint).GUID = _containerCache.NodeLinks[0].BaseNodeGuid;
foreach (var node in Nodes) {
if (node.EntryPoint) return;
Edges.Where(x => x.input.node==node).ToList()
.ForEach(edge => _targetGraphView.RemoveElement(edge));
_targetGraphView.RemoveElement(node);
}
}
private void ConnectNodes() {
for (var i = 0; i < Nodes.Count; i ) {
var connections = _containerCache.NodeLinks.Where(x=> x.BaseNodeGuid == Nodes[i].GUID).ToList();
for (var j = 0; j < connections.Count; j ) {
var TargetNodeGuid = connections[j].TargetNodeGuid;
var targetNode = Nodes.First( x => x.GUID == TargetNodeGuid);
LinkNodes(Nodes[i].outputContainer[j].Q<Port>(), (Port) targetNode.inputContainer[0]);
targetNode.SetPosition(new Rect(_containerCache.DialogueNodeData.First(x =>x.GUID==TargetNodeGuid).Position, _targetGraphView.DefaultNodeSize));
}
}
}
private void LinkNodes(Port output, Port input) {
var tempEdge = new Edge {
output = output,
input = input
};
tempEdge.input.Connect(tempEdge);
tempEdge.output.Connect(tempEdge);
_targetGraphView.Add(tempEdge);
}
private void CreateNodes() {
foreach (var nodeData in _containerCache.DialogueNodeData) {
var tempNode = _targetGraphView.CreateNode(nodeData.DialogueText, Vector2.zero);
tempNode.GUID = nodeData.GUID;
_targetGraphView.AddElement(tempNode);
var nodePorts = _containerCache.NodeLinks.Where(x => x.BaseNodeGuid==nodeData.GUID).ToList();
nodePorts.ForEach(x => _targetGraphView.AddChoicePort(tempNode, x.PortName));
}
}
}
DialogueNode
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEditor.Experimental.GraphView;
using UnityEngine;
public class DialogueNode : Node
{
public string DialogueText;
public string GUID;
public bool EntryPoint = false;
}
DialogueGraph
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEditor;
using UnityEditor.Experimental.GraphView;
using UnityEditor.UIElements;
using UnityEngine;
using UnityEngine.UIElements;
public class DialogueGraph : EditorWindow
{
private string _fileName = "New Narrative";
private DialogueGraphView _graphView;
private DialogueContainer _dialogueContainer;
[MenuItem("Graph/Narrative Graph")]
public static void CreateGraphViewWindow()
{
var window = GetWindow<DialogueGraph>();
window.titleContent = new GUIContent("Narrative Graph");
}
private void ConstructGraphView()
{
_graphView = new DialogueGraphView(this)
{
name = "Narrative Graph",
};
_graphView.StretchToParentSize();
rootVisualElement.Add(_graphView);
}
private void GenerateToolbar()
{
var toolbar = new Toolbar();
var fileNameTextField = new TextField("File Name:");
fileNameTextField.SetValueWithoutNotify(_fileName);
fileNameTextField.MarkDirtyRepaint();
fileNameTextField.RegisterValueChangedCallback(evt => _fileName = evt.newValue);
toolbar.Add(fileNameTextField);
toolbar.Add(new Button(() => RequestDataOperation(true)) {text = "Save Data"});
toolbar.Add(new Button(() => RequestDataOperation(false)) {text = "Load Data"});
// toolbar.Add(new Button(() => _graphView.CreateNewDialogueNode("Dialogue Node")) {text = "New Node",});
rootVisualElement.Add(toolbar);
}
private void RequestDataOperation(bool save)
{
if (!string.IsNullOrEmpty(_fileName))
{
var saveUtility = GraphSaveUtility.GetInstance(_graphView);
if (save)
saveUtility.SaveGraph(_fileName);
else
saveUtility.LoadGraph(_fileName);
}
else
{
EditorUtility.DisplayDialog("Invalid File name", "Please Enter a valid filename", "OK");
}
}
private void OnEnable()
{
ConstructGraphView();
GenerateToolbar();
GenerateMiniMap();
}
private void GenerateMiniMap()
{
var miniMap = new MiniMap {anchored = true};
var cords = _graphView.contentViewContainer.WorldToLocal(new Vector2(this.maxSize.x - 10, 30));
miniMap.SetPosition(new Rect(cords.x, cords.y, 200, 140));
_graphView.Add(miniMap);
}
private void OnDisable()
{
rootVisualElement.Remove(_graphView);
}
}
Комментарии:
1. Материал редактора недоступен для окончательной сборки
2. Значит, я должен отключать эти скрипты, когда хочу создать игру?
Ответ №1:
Как сказал кто-то в комментариях, Unity не может создавать материалы, использующие UnityEditor
пространство имен. Однако при сборке Unity будет игнорировать все, что находится внутри папок с именем «Редактор». Поместите все те сценарии, которые вызывают проблемы, в папку с именем «Редактор», и она должна скомпилироваться без ошибок. У вас также может быть более одной папки «Editor», поэтому, если вам нужно различать ваши скрипты редактора, не стесняйтесь это делать.