Tim Cooper
8 年前
当前提交
7ee96660
共有 33 个文件被更改,包括 672 次插入 和 77 次删除
-
1MaterialGraphProject/Assets/UnityShaderEditor/Editor/AssetCallbacks/CreateShaderSubGraph.cs
-
2MaterialGraphProject/Assets/UnityShaderEditor/Editor/Drawing/DrawData/MaterialGraphDataSource.cs
-
6MaterialGraphProject/Assets/UnityShaderEditor/Editor/Drawing/DrawData/NodePreviewDrawData.cs
-
36MaterialGraphProject/Assets/UnityShaderEditor/Editor/Templates/shader.template
-
2MaterialGraphProject/Assets/UnityShaderEditor/Editor/Testing/IntegrationTests/ShaderGenerationTest.cs
-
26MaterialGraphProject/Assets/UnityShaderEditor/Runtime/Graphs/MaterialGraphAsset.cs
-
4MaterialGraphProject/Assets/UnityShaderEditor/Runtime/Interfaces/IMasterNode.cs
-
8MaterialGraphProject/Assets/UnityShaderEditor/Runtime/Nodes/AbstractMasterNode.cs
-
10MaterialGraphProject/Assets/UnityShaderEditor/Runtime/Nodes/AbstractMaterialNode.cs
-
5MaterialGraphProject/Assets/UnityShaderEditor/Runtime/Nodes/PropertyNode.cs
-
7MaterialGraphProject/Assets/UnityShaderEditor/Runtime/SubGraph/SubGraph.cs
-
6MaterialGraphProject/Assets/UnityShaderEditor/Runtime/SubGraph/SubGraphNode.cs
-
57MaterialGraphProject/Assets/UnityShaderEditor/Runtime/SurfaceModel/AbstractSurfaceMasterNode.cs
-
23MaterialGraphProject/Assets/UnityShaderEditor/Editor/AssetCallbacks/CreateRemapGraph.cs
-
12MaterialGraphProject/Assets/UnityShaderEditor/Editor/AssetCallbacks/CreateRemapGraph.cs.meta
-
43MaterialGraphProject/Assets/UnityShaderEditor/Editor/Drawing/DrawData/RemapInputNodeDrawData.cs
-
12MaterialGraphProject/Assets/UnityShaderEditor/Editor/Drawing/DrawData/RemapInputNodeDrawData.cs.meta
-
43MaterialGraphProject/Assets/UnityShaderEditor/Editor/Drawing/DrawData/RemapMasterNodeDrawData.cs
-
12MaterialGraphProject/Assets/UnityShaderEditor/Editor/Drawing/DrawData/RemapMasterNodeDrawData.cs.meta
-
36MaterialGraphProject/Assets/UnityShaderEditor/Editor/Templates/subshader.template
-
8MaterialGraphProject/Assets/UnityShaderEditor/Editor/Templates/subshader.template.meta
-
9MaterialGraphProject/Assets/UnityShaderEditor/Runtime/Remapper.meta
-
54MaterialGraphProject/Assets/UnityShaderEditor/Runtime/Remapper/MasterRemapGraph.cs
-
12MaterialGraphProject/Assets/UnityShaderEditor/Runtime/Remapper/MasterRemapGraph.cs.meta
-
71MaterialGraphProject/Assets/UnityShaderEditor/Runtime/Remapper/MasterRemapInputNode.cs
-
12MaterialGraphProject/Assets/UnityShaderEditor/Runtime/Remapper/MasterRemapInputNode.cs.meta
-
36MaterialGraphProject/Assets/UnityShaderEditor/Runtime/Remapper/MaterialRemapAsset.cs
-
12MaterialGraphProject/Assets/UnityShaderEditor/Runtime/Remapper/MaterialRemapAsset.cs.meta
-
172MaterialGraphProject/Assets/UnityShaderEditor/Runtime/Remapper/RemapMasterNode.cs
-
12MaterialGraphProject/Assets/UnityShaderEditor/Runtime/Remapper/RemapMasterNode.cs.meta
-
0/MaterialGraphProject/Assets/UnityShaderEditor/Runtime/SubGraph/MaterialSubGraphAsset.cs.meta
-
0/MaterialGraphProject/Assets/UnityShaderEditor/Runtime/SubGraph/MaterialSubGraphAsset.cs
|
|||
using System.IO; |
|||
using UnityEditor.ProjectWindowCallback; |
|||
using UnityEngine.MaterialGraph; |
|||
|
|||
namespace UnityEditor.MaterialGraph |
|||
{ |
|||
public class CreateRemapGraph : EndNameEditAction |
|||
{ |
|||
[MenuItem("Assets/Create/Remap Graph", false, 209)] |
|||
public static void CreateMaterialRemapGraph() |
|||
{ |
|||
ProjectWindowUtil.StartNameEditingIfProjectWindowExists(0, CreateInstance<CreateRemapGraph>(), |
|||
"New Remap-Graph.remapGraph", null, null); |
|||
} |
|||
|
|||
public override void Action(int instanceId, string pathName, string resourceFile) |
|||
{ |
|||
var graph = CreateInstance<MaterialRemapAsset>(); |
|||
graph.name = Path.GetFileName(pathName); |
|||
AssetDatabase.CreateAsset(graph, pathName); |
|||
} |
|||
} |
|||
} |
|
|||
fileFormatVersion: 2 |
|||
guid: 2870633e85d1cdd47b6b6d5e576187d1 |
|||
timeCreated: 1481188587 |
|||
licenseType: Pro |
|||
MonoImporter: |
|||
serializedVersion: 2 |
|||
defaultReferences: [] |
|||
executionOrder: 0 |
|||
icon: {instanceID: 0} |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|
|||
using System; |
|||
using System.Collections.Generic; |
|||
using RMGUI.GraphView; |
|||
using UnityEditor.Graphing.Drawing; |
|||
using UnityEngine; |
|||
using UnityEngine.MaterialGraph; |
|||
|
|||
namespace UnityEditor.MaterialGraph.Drawing |
|||
{ |
|||
[Serializable] |
|||
class RemapInputControlDrawData : ControlDrawData |
|||
{ |
|||
public override void OnGUIHandler() |
|||
{ |
|||
base.OnGUIHandler(); |
|||
|
|||
var remapNode = node as MasterRemapInputNode; |
|||
if (remapNode == null) |
|||
return; |
|||
|
|||
if (GUILayout.Button("Add Slot")) |
|||
remapNode.AddSlot(); |
|||
if (GUILayout.Button("Remove Slot")) |
|||
remapNode.RemoveSlot(); |
|||
} |
|||
|
|||
public override float GetHeight() |
|||
{ |
|||
return EditorGUIUtility.singleLineHeight * 2 + 3 * EditorGUIUtility.standardVerticalSpacing; |
|||
} |
|||
} |
|||
|
|||
[Serializable] |
|||
public class RemapInputNodeDrawData : MaterialNodeDrawData |
|||
{ |
|||
protected override IEnumerable<GraphElementData> GetControlData() |
|||
{ |
|||
var instance = CreateInstance<RemapInputControlDrawData>(); |
|||
instance.Initialize(node); |
|||
return new List<GraphElementData> { instance }; |
|||
} |
|||
} |
|||
} |
|
|||
fileFormatVersion: 2 |
|||
guid: 23e3fdefb76b26c428d70b010425e7af |
|||
timeCreated: 1481189699 |
|||
licenseType: Pro |
|||
MonoImporter: |
|||
serializedVersion: 2 |
|||
defaultReferences: [] |
|||
executionOrder: 0 |
|||
icon: {instanceID: 0} |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|
|||
using System; |
|||
using System.Collections.Generic; |
|||
using RMGUI.GraphView; |
|||
using UnityEditor.Graphing.Drawing; |
|||
using UnityEngine; |
|||
using UnityEngine.MaterialGraph; |
|||
|
|||
namespace UnityEditor.MaterialGraph.Drawing |
|||
{ |
|||
[Serializable] |
|||
class RemapMasterControlDrawData : ControlDrawData |
|||
{ |
|||
public override void OnGUIHandler() |
|||
{ |
|||
base.OnGUIHandler(); |
|||
|
|||
var remapNode = node as RemapMasterNode; |
|||
if (remapNode == null) |
|||
return; |
|||
|
|||
remapNode.remapAsset = (MaterialRemapAsset)EditorGUILayout.MiniThumbnailObjectField( |
|||
new GUIContent("Remap Asset"), |
|||
remapNode.remapAsset, |
|||
typeof(MaterialRemapAsset), null); |
|||
} |
|||
|
|||
public override float GetHeight() |
|||
{ |
|||
return EditorGUIUtility.singleLineHeight + 2 * EditorGUIUtility.standardVerticalSpacing; |
|||
} |
|||
} |
|||
|
|||
[Serializable] |
|||
public class RemapMasterNodeDrawData : MaterialNodeDrawData |
|||
{ |
|||
protected override IEnumerable<GraphElementData> GetControlData() |
|||
{ |
|||
var instance = CreateInstance<RemapMasterControlDrawData>(); |
|||
instance.Initialize(node); |
|||
return new List<GraphElementData> { instance }; |
|||
} |
|||
} |
|||
} |
|
|||
fileFormatVersion: 2 |
|||
guid: 4bd257f009292e44aa3616abf24d3327 |
|||
timeCreated: 1481188375 |
|||
licenseType: Pro |
|||
MonoImporter: |
|||
serializedVersion: 2 |
|||
defaultReferences: [] |
|||
executionOrder: 0 |
|||
icon: {instanceID: 0} |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|
|||
SubShader |
|||
{ |
|||
${Tags} |
|||
${Blending} |
|||
${Culling} |
|||
${ZTest} |
|||
${ZWrite} |
|||
|
|||
LOD 200 |
|||
|
|||
CGPROGRAM |
|||
#pragma target 3.0 |
|||
#pragma surface surf ${LightingFunctionName} ${VertexShaderDecl} |
|||
#pragma glsl |
|||
#pragma debug |
|||
|
|||
${ShaderFunctions} |
|||
${ShaderPropertyUsages} |
|||
|
|||
struct Input |
|||
{ |
|||
${ShaderInputs} |
|||
}; |
|||
|
|||
void vert (inout appdata_full v, out Input o) |
|||
{ |
|||
UNITY_INITIALIZE_OUTPUT(Input,o); |
|||
${VertexShaderBody} |
|||
} |
|||
|
|||
void surf (Input IN, inout ${SurfaceOutputStructureName} o) |
|||
{ |
|||
${PixelShaderBody} |
|||
} |
|||
ENDCG |
|||
} |
|
|||
fileFormatVersion: 2 |
|||
guid: 46fccd2bfdbe29d4d8743ad5e2454927 |
|||
timeCreated: 1481194716 |
|||
licenseType: Pro |
|||
DefaultImporter: |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|
|||
fileFormatVersion: 2 |
|||
guid: 5f3c6a912dd29fb459196f8efdda853f |
|||
folderAsset: yes |
|||
timeCreated: 1481188026 |
|||
licenseType: Pro |
|||
DefaultImporter: |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|
|||
using System; |
|||
using System.Linq; |
|||
using UnityEngine.Graphing; |
|||
|
|||
namespace UnityEngine.MaterialGraph |
|||
{ |
|||
[Serializable] |
|||
public class MasterRemapGraph : AbstractMaterialGraph |
|||
{ |
|||
[NonSerialized] |
|||
private MasterRemapInputNode m_InputNode; |
|||
|
|||
public MasterRemapInputNode inputNode |
|||
{ |
|||
get |
|||
{ |
|||
// find existing node
|
|||
if (m_InputNode == null) |
|||
m_InputNode = GetNodes<MasterRemapInputNode>().FirstOrDefault(); |
|||
|
|||
return m_InputNode; |
|||
} |
|||
} |
|||
|
|||
public override void OnAfterDeserialize() |
|||
{ |
|||
base.OnAfterDeserialize(); |
|||
m_InputNode = null; |
|||
} |
|||
|
|||
public override void AddNode(INode node) |
|||
{ |
|||
if (inputNode != null && node is MasterRemapInputNode) |
|||
{ |
|||
Debug.LogWarning("Attempting to add second SubGraphInputNode to SubGraph. This is not allowed."); |
|||
return; |
|||
} |
|||
|
|||
if (node is AbstractMaterialNode) |
|||
{ |
|||
var amn = (AbstractMaterialNode) node; |
|||
if (!amn.allowedInRemapGraph) |
|||
Debug.LogWarningFormat("Attempting to add {0} to Remap Graph. This is not allowed.", amn.GetType()); |
|||
} |
|||
|
|||
if (node is IGenerateProperties) |
|||
{ |
|||
Debug.LogWarning("Attempting to add second SubGraphInputNode to SubGraph. This is not allowed."); |
|||
return; |
|||
} |
|||
base.AddNode(node); |
|||
} |
|||
} |
|||
} |
|
|||
fileFormatVersion: 2 |
|||
guid: bad823ee21f7ee944ab764cae72f9c7a |
|||
timeCreated: 1481188026 |
|||
licenseType: Pro |
|||
MonoImporter: |
|||
serializedVersion: 2 |
|||
defaultReferences: [] |
|||
executionOrder: 0 |
|||
icon: {instanceID: 0} |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using UnityEngine.Graphing; |
|||
|
|||
namespace UnityEngine.MaterialGraph |
|||
{ |
|||
[Title("Remapper/Remap Input Node")] |
|||
public class MasterRemapInputNode : AbstractSubGraphIONode |
|||
{ |
|||
public MasterRemapInputNode() |
|||
{ |
|||
name = "Inputs"; |
|||
} |
|||
|
|||
public override int AddSlot() |
|||
{ |
|||
var nextSlotId = GetOutputSlots<ISlot>().Count() + 1; |
|||
AddSlot(new MaterialSlot(-nextSlotId, "Input " + nextSlotId, "Input" + nextSlotId, SlotType.Output, SlotValueType.Vector4, Vector4.zero)); |
|||
|
|||
if (onModified != null) |
|||
{ |
|||
onModified(this, ModificationScope.Graph); |
|||
} |
|||
|
|||
return -nextSlotId; |
|||
} |
|||
|
|||
public override void RemoveSlot() |
|||
{ |
|||
var lastSlotId = GetOutputSlots<ISlot>().Count(); |
|||
if (lastSlotId == 0) |
|||
return; |
|||
|
|||
RemoveSlot(-lastSlotId); |
|||
|
|||
if (onModified != null) |
|||
{ |
|||
onModified(this, ModificationScope.Graph); |
|||
} |
|||
|
|||
} |
|||
|
|||
public override void GeneratePropertyUsages(ShaderGenerator visitor, GenerationMode generationMode) |
|||
{ |
|||
if (generationMode == GenerationMode.ForReals) |
|||
return; |
|||
|
|||
foreach (var slot in GetOutputSlots<MaterialSlot>()) |
|||
{ |
|||
var outDimension = ConvertConcreteSlotValueTypeToString(slot.concreteValueType); |
|||
visitor.AddShaderChunk("float" + outDimension + " " + GetVariableNameForSlot(slot.id) + ";", true); |
|||
} |
|||
} |
|||
|
|||
public override void CollectPreviewMaterialProperties(List<PreviewProperty> properties) |
|||
{ |
|||
base.CollectPreviewMaterialProperties(properties); |
|||
foreach (var slot in GetOutputSlots<MaterialSlot>()) |
|||
{ |
|||
properties.Add( |
|||
new PreviewProperty |
|||
{ |
|||
m_Name = GetVariableNameForSlot(slot.id), |
|||
m_PropType = PropertyType.Vector4, |
|||
m_Vector4 = slot.defaultValue |
|||
} |
|||
); |
|||
} |
|||
} |
|||
} |
|||
} |
|
|||
fileFormatVersion: 2 |
|||
guid: 39465109a68463a4b8a1a9c9dd20e46a |
|||
timeCreated: 1481188026 |
|||
licenseType: Pro |
|||
MonoImporter: |
|||
serializedVersion: 2 |
|||
defaultReferences: [] |
|||
executionOrder: 0 |
|||
icon: {instanceID: 0} |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|
|||
using System.Linq; |
|||
using UnityEngine.Graphing; |
|||
|
|||
namespace UnityEngine.MaterialGraph |
|||
{ |
|||
public class MaterialRemapAsset : ScriptableObject, IMaterialGraphAsset |
|||
{ |
|||
[SerializeField] |
|||
private MasterRemapGraph m_MasterRemapGraph = new MasterRemapGraph(); |
|||
|
|||
public IGraph graph |
|||
{ |
|||
get { return m_MasterRemapGraph; } |
|||
} |
|||
|
|||
public MasterRemapGraph masterRemapGraph |
|||
{ |
|||
get { return m_MasterRemapGraph; } |
|||
} |
|||
|
|||
public bool shouldRepaint |
|||
{ |
|||
get { return graph.GetNodes<AbstractMaterialNode>().OfType<IRequiresTime>().Any(); } |
|||
} |
|||
|
|||
public ScriptableObject GetScriptableObject() |
|||
{ |
|||
return this; |
|||
} |
|||
|
|||
public void OnEnable() |
|||
{ |
|||
graph.OnEnable(); |
|||
} |
|||
} |
|||
} |
|
|||
fileFormatVersion: 2 |
|||
guid: eda7796f65724624c9638828bd5fd956 |
|||
timeCreated: 1481188026 |
|||
licenseType: Pro |
|||
MonoImporter: |
|||
serializedVersion: 2 |
|||
defaultReferences: [] |
|||
executionOrder: 0 |
|||
icon: {instanceID: 0} |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.IO; |
|||
using System.Linq; |
|||
#if UNITY_EDITOR
|
|||
using UnityEditor; |
|||
#endif
|
|||
using UnityEngine.Graphing; |
|||
|
|||
namespace UnityEngine.MaterialGraph |
|||
{ |
|||
[Serializable] |
|||
[Title("Master/Remapper")] |
|||
public class RemapMasterNode : AbstractMasterNode |
|||
{ |
|||
[SerializeField] |
|||
private string m_SerialziedRemapGraph = string.Empty; |
|||
|
|||
[Serializable] |
|||
private class RemapGraphHelper |
|||
{ |
|||
public MaterialRemapAsset subGraph; |
|||
} |
|||
|
|||
public override bool allowedInRemapGraph |
|||
{ |
|||
get { return false; } |
|||
} |
|||
|
|||
public override string GetFullShader(GenerationMode mode, out List<PropertyGenerator.TextureInfo> configuredTextures) |
|||
{ |
|||
throw new NotImplementedException(); |
|||
var shaderTemplateLocation = ShaderGenerator.GetTemplatePath("shader.template"); |
|||
|
|||
if (remapAsset == null || !File.Exists(shaderTemplateLocation)) |
|||
{ |
|||
configuredTextures = new List<PropertyGenerator.TextureInfo>(); |
|||
return string.Empty; |
|||
} |
|||
|
|||
// Step 1: Generate properties from this node
|
|||
// remap graphs are not allowed to have subgraphs
|
|||
// or property nodes, so this is okay :)
|
|||
var shaderPropertiesVisitor = new ShaderGenerator(); |
|||
var activeNodeList = new List<INode>(); |
|||
NodeUtils.DepthFirstCollectNodesFromNode(activeNodeList, this); |
|||
|
|||
foreach (var node in activeNodeList.OfType<AbstractMaterialNode>()) |
|||
node.GeneratePropertyUsages(shaderPropertiesVisitor, mode); |
|||
|
|||
var subShaders = new List<string>(); |
|||
foreach (var node in activeNodeList.OfType<IMasterNode>()) |
|||
subShaders.Add(node.GetSubShader(mode)); |
|||
|
|||
|
|||
} |
|||
|
|||
public void GenerateNodeCode(ShaderGenerator shaderBody, GenerationMode generationMode) |
|||
{ |
|||
var nodes = ListPool<INode>.Get(); |
|||
|
|||
//Get the rest of the nodes for all the slots
|
|||
NodeUtils.DepthFirstCollectNodesFromNode(nodes, this, null, NodeUtils.IncludeSelf.Exclude); |
|||
for (var i = 0; i < nodes.Count; i++) |
|||
{ |
|||
var node = nodes[i]; |
|||
if (node is IGeneratesBodyCode) |
|||
(node as IGeneratesBodyCode).GenerateNodeCode(shaderBody, generationMode); |
|||
} |
|||
ListPool<INode>.Release(nodes); |
|||
|
|||
foreach (var slot in GetInputSlots<MaterialSlot>()) |
|||
{ |
|||
var edge = owner.GetEdges(slot.slotReference).FirstOrDefault(); |
|||
|
|||
if (edge != null) |
|||
{ |
|||
var outputRef = edge.outputSlot; |
|||
var fromNode = owner.GetNodeFromGuid<AbstractMaterialNode>(outputRef.nodeGuid); |
|||
if (fromNode == null) |
|||
continue; |
|||
|
|||
shaderBody.AddShaderChunk("float4 reamapper_" + slot.shaderOutputName + " = " + fromNode.GetVariableNameForSlot(outputRef.slotId) + ";", true); |
|||
} |
|||
else |
|||
{ |
|||
shaderBody.AddShaderChunk("float4 reamapper_" + slot.shaderOutputName + " = 0;", true); |
|||
} |
|||
} |
|||
} |
|||
|
|||
public override string GetSubShader(GenerationMode mode) |
|||
{ |
|||
throw new NotImplementedException(); |
|||
} |
|||
|
|||
#if UNITY_EDITOR
|
|||
public MaterialRemapAsset remapAsset |
|||
{ |
|||
get |
|||
{ |
|||
if (string.IsNullOrEmpty(m_SerialziedRemapGraph)) |
|||
return null; |
|||
|
|||
var helper = new RemapGraphHelper(); |
|||
EditorJsonUtility.FromJsonOverwrite(m_SerialziedRemapGraph, helper); |
|||
return helper.subGraph; |
|||
} |
|||
set |
|||
{ |
|||
if (remapAsset == value) |
|||
return; |
|||
|
|||
var helper = new RemapGraphHelper(); |
|||
helper.subGraph = value; |
|||
m_SerialziedRemapGraph = EditorJsonUtility.ToJson(helper, true); |
|||
OnEnable(); |
|||
|
|||
if (onModified != null) |
|||
onModified(this, ModificationScope.Graph); |
|||
} |
|||
} |
|||
#else
|
|||
public MaterialSubGraphAsset subGraphAsset {get; set; } |
|||
#endif
|
|||
|
|||
private MasterRemapGraph masterRemapGraph |
|||
{ |
|||
get |
|||
{ |
|||
if (remapAsset == null) |
|||
return null; |
|||
|
|||
return remapAsset.masterRemapGraph; |
|||
} |
|||
} |
|||
|
|||
public override PreviewMode previewMode |
|||
{ |
|||
get |
|||
{ |
|||
if (remapAsset == null) |
|||
return PreviewMode.Preview2D; |
|||
|
|||
return PreviewMode.Preview3D; |
|||
} |
|||
} |
|||
|
|||
public RemapMasterNode() |
|||
{ |
|||
name = "Remapper"; |
|||
} |
|||
|
|||
public void OnEnable() |
|||
{ |
|||
var validNames = new List<int>(); |
|||
if (remapAsset == null) |
|||
{ |
|||
RemoveSlotsNameNotMatching(validNames); |
|||
return; |
|||
} |
|||
|
|||
var inputNode = remapAsset.masterRemapGraph.inputNode; |
|||
foreach (var slot in inputNode.GetOutputSlots<MaterialSlot>()) |
|||
{ |
|||
AddSlot(new MaterialSlot(slot.id, slot.displayName, slot.shaderOutputName, SlotType.Input, slot.valueType, slot.defaultValue)); |
|||
validNames.Add(slot.id); |
|||
} |
|||
RemoveSlotsNameNotMatching(validNames); |
|||
} |
|||
} |
|||
} |
|
|||
fileFormatVersion: 2 |
|||
guid: 8f94baf06fa91ad41bc0184e6d14cb0f |
|||
timeCreated: 1481188026 |
|||
licenseType: Pro |
|||
MonoImporter: |
|||
serializedVersion: 2 |
|||
defaultReferences: [] |
|||
executionOrder: 0 |
|||
icon: {instanceID: 0} |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
撰写
预览
正在加载...
取消
保存
Reference in new issue