├── .gitignore ├── Assets ├── uCodeEditor.meta └── uCodeEditor │ ├── Example.meta │ ├── Example │ ├── Code Editor Example.unity │ ├── Code Editor Example.unity.meta │ ├── CodeExample.cs │ ├── CodeExample.cs.meta │ ├── Editor.meta │ └── Editor │ │ ├── CodeExampleEditor.cs │ │ └── CodeExampleEditor.cs.meta │ ├── README.md.meta │ ├── Scripts.meta │ └── Scripts │ ├── Editor.meta │ └── Editor │ ├── CodeEditor.cs │ ├── CodeEditor.cs.meta │ ├── ColorScheme.cs │ ├── ColorScheme.cs.meta │ ├── Common.cs │ ├── Common.cs.meta │ ├── Resources.meta │ ├── Resources │ ├── CONSOLA.TTF │ └── CONSOLA.TTF.meta │ ├── ShaderCodeEditor.cs │ ├── ShaderCodeEditor.cs.meta │ ├── ShaderHighlighter.cs │ ├── ShaderHighlighter.cs.meta │ ├── ShaderSyntax.cs │ ├── ShaderSyntax.cs.meta │ ├── Utils.cs │ └── Utils.cs.meta ├── Docs └── screenshot.png ├── LICENSE ├── ProjectSettings ├── AudioManager.asset ├── ClusterInputManager.asset ├── DynamicsManager.asset ├── EditorBuildSettings.asset ├── EditorSettings.asset ├── GraphicsSettings.asset ├── InputManager.asset ├── NavMeshAreas.asset ├── NetworkManager.asset ├── Physics2DSettings.asset ├── ProjectSettings.asset ├── ProjectVersion.txt ├── QualitySettings.asset ├── TagManager.asset ├── TimeManager.asset └── UnityConnectSettings.asset └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | Library/ 2 | Temp/ 3 | UnityPackageManager/ 4 | obj/ 5 | .vscode/ 6 | *.csproj 7 | *.sln 8 | -------------------------------------------------------------------------------- /Assets/uCodeEditor.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 987a608174c91014ca3a143f8215b2b2 3 | folderAsset: yes 4 | timeCreated: 1516636740 5 | licenseType: Free 6 | DefaultImporter: 7 | externalObjects: {} 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /Assets/uCodeEditor/Example.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: d50823cafd159544b8a3d0f011c1bb73 3 | folderAsset: yes 4 | timeCreated: 1516637236 5 | licenseType: Free 6 | DefaultImporter: 7 | externalObjects: {} 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /Assets/uCodeEditor/Example/Code Editor Example.unity: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!29 &1 4 | OcclusionCullingSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_OcclusionBakeSettings: 8 | smallestOccluder: 5 9 | smallestHole: 0.25 10 | backfaceThreshold: 100 11 | m_SceneGUID: 00000000000000000000000000000000 12 | m_OcclusionCullingData: {fileID: 0} 13 | --- !u!104 &2 14 | RenderSettings: 15 | m_ObjectHideFlags: 0 16 | serializedVersion: 8 17 | m_Fog: 0 18 | m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} 19 | m_FogMode: 3 20 | m_FogDensity: 0.01 21 | m_LinearFogStart: 0 22 | m_LinearFogEnd: 300 23 | m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} 24 | m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} 25 | m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} 26 | m_AmbientIntensity: 1 27 | m_AmbientMode: 0 28 | m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} 29 | m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} 30 | m_HaloStrength: 0.5 31 | m_FlareStrength: 1 32 | m_FlareFadeSpeed: 3 33 | m_HaloTexture: {fileID: 0} 34 | m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} 35 | m_DefaultReflectionMode: 0 36 | m_DefaultReflectionResolution: 128 37 | m_ReflectionBounces: 1 38 | m_ReflectionIntensity: 1 39 | m_CustomReflection: {fileID: 0} 40 | m_Sun: {fileID: 0} 41 | m_IndirectSpecularColor: {r: 0.37311953, g: 0.38074014, b: 0.3587274, a: 1} 42 | --- !u!157 &3 43 | LightmapSettings: 44 | m_ObjectHideFlags: 0 45 | serializedVersion: 11 46 | m_GIWorkflowMode: 0 47 | m_GISettings: 48 | serializedVersion: 2 49 | m_BounceScale: 1 50 | m_IndirectOutputScale: 1 51 | m_AlbedoBoost: 1 52 | m_TemporalCoherenceThreshold: 1 53 | m_EnvironmentLightingMode: 0 54 | m_EnableBakedLightmaps: 1 55 | m_EnableRealtimeLightmaps: 1 56 | m_LightmapEditorSettings: 57 | serializedVersion: 9 58 | m_Resolution: 2 59 | m_BakeResolution: 40 60 | m_TextureWidth: 1024 61 | m_TextureHeight: 1024 62 | m_AO: 0 63 | m_AOMaxDistance: 1 64 | m_CompAOExponent: 1 65 | m_CompAOExponentDirect: 0 66 | m_Padding: 2 67 | m_LightmapParameters: {fileID: 0} 68 | m_LightmapsBakeMode: 1 69 | m_TextureCompression: 1 70 | m_FinalGather: 0 71 | m_FinalGatherFiltering: 1 72 | m_FinalGatherRayCount: 256 73 | m_ReflectionCompression: 2 74 | m_MixedBakeMode: 2 75 | m_BakeBackend: 0 76 | m_PVRSampling: 1 77 | m_PVRDirectSampleCount: 32 78 | m_PVRSampleCount: 500 79 | m_PVRBounces: 2 80 | m_PVRFilterTypeDirect: 0 81 | m_PVRFilterTypeIndirect: 0 82 | m_PVRFilterTypeAO: 0 83 | m_PVRFilteringMode: 1 84 | m_PVRCulling: 1 85 | m_PVRFilteringGaussRadiusDirect: 1 86 | m_PVRFilteringGaussRadiusIndirect: 5 87 | m_PVRFilteringGaussRadiusAO: 2 88 | m_PVRFilteringAtrousPositionSigmaDirect: 0.5 89 | m_PVRFilteringAtrousPositionSigmaIndirect: 2 90 | m_PVRFilteringAtrousPositionSigmaAO: 1 91 | m_ShowResolutionOverlay: 1 92 | m_LightingDataAsset: {fileID: 0} 93 | m_UseShadowmask: 1 94 | --- !u!196 &4 95 | NavMeshSettings: 96 | serializedVersion: 2 97 | m_ObjectHideFlags: 0 98 | m_BuildSettings: 99 | serializedVersion: 2 100 | agentTypeID: 0 101 | agentRadius: 0.5 102 | agentHeight: 2 103 | agentSlope: 45 104 | agentClimb: 0.4 105 | ledgeDropHeight: 0 106 | maxJumpAcrossDistance: 0 107 | minRegionArea: 2 108 | manualCellSize: 0 109 | cellSize: 0.16666667 110 | manualTileSize: 0 111 | tileSize: 256 112 | accuratePlacement: 0 113 | debug: 114 | m_Flags: 0 115 | m_NavMeshData: {fileID: 0} 116 | --- !u!1 &1011435551 117 | GameObject: 118 | m_ObjectHideFlags: 0 119 | m_PrefabParentObject: {fileID: 0} 120 | m_PrefabInternal: {fileID: 0} 121 | serializedVersion: 5 122 | m_Component: 123 | - component: {fileID: 1011435552} 124 | - component: {fileID: 1011435553} 125 | m_Layer: 0 126 | m_Name: Code Editor Example 127 | m_TagString: Untagged 128 | m_Icon: {fileID: 0} 129 | m_NavMeshLayer: 0 130 | m_StaticEditorFlags: 0 131 | m_IsActive: 1 132 | --- !u!4 &1011435552 133 | Transform: 134 | m_ObjectHideFlags: 0 135 | m_PrefabParentObject: {fileID: 0} 136 | m_PrefabInternal: {fileID: 0} 137 | m_GameObject: {fileID: 1011435551} 138 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 139 | m_LocalPosition: {x: 0, y: 0, z: 0} 140 | m_LocalScale: {x: 1, y: 1, z: 1} 141 | m_Children: [] 142 | m_Father: {fileID: 0} 143 | m_RootOrder: 0 144 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 145 | --- !u!114 &1011435553 146 | MonoBehaviour: 147 | m_ObjectHideFlags: 0 148 | m_PrefabParentObject: {fileID: 0} 149 | m_PrefabInternal: {fileID: 0} 150 | m_GameObject: {fileID: 1011435551} 151 | m_Enabled: 1 152 | m_EditorHideFlags: 0 153 | m_Script: {fileID: 11500000, guid: c766635a54c53f04bb9c44ec51ebbeea, type: 3} 154 | m_Name: 155 | m_EditorClassIdentifier: 156 | code: '// code 157 | 158 | for (int i = 0; i < 50; ++i) { 159 | 160 | } 161 | 162 | // foo 163 | 164 | // bar' 165 | -------------------------------------------------------------------------------- /Assets/uCodeEditor/Example/Code Editor Example.unity.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: de5fb30d57e8d084baaa1df4679d2480 3 | timeCreated: 1516636389 4 | licenseType: Free 5 | DefaultImporter: 6 | externalObjects: {} 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /Assets/uCodeEditor/Example/CodeExample.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using UnityEngine; 4 | 5 | public class CodeExample : MonoBehaviour { 6 | public string code = "// code\nfor (int i = 0; i < 50; ++i) {\n}\n// foo\n// bar"; 7 | } 8 | -------------------------------------------------------------------------------- /Assets/uCodeEditor/Example/CodeExample.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: c766635a54c53f04bb9c44ec51ebbeea 3 | timeCreated: 1516635327 4 | licenseType: Free 5 | MonoImporter: 6 | externalObjects: {} 7 | serializedVersion: 2 8 | defaultReferences: [] 9 | executionOrder: 0 10 | icon: {instanceID: 0} 11 | userData: 12 | assetBundleName: 13 | assetBundleVariant: 14 | -------------------------------------------------------------------------------- /Assets/uCodeEditor/Example/Editor.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 587a96fd4c10b4441b9a5b2289617574 3 | folderAsset: yes 4 | timeCreated: 1516637247 5 | licenseType: Free 6 | DefaultImporter: 7 | externalObjects: {} 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /Assets/uCodeEditor/Example/Editor/CodeExampleEditor.cs: -------------------------------------------------------------------------------- 1 |  2 | #define USE_FOLDING 3 | 4 | using System.Collections; 5 | using System.Collections.Generic; 6 | using UnityEngine; 7 | using UnityEditor; 8 | 9 | using uCodeEditor; 10 | 11 | [CustomEditor(typeof(CodeExample))] 12 | public class CodeExampleEditor : Editor 13 | { 14 | ShaderCodeEditor codeEditor; 15 | 16 | SerializedObject editorSerializedObject; 17 | 18 | SerializedProperty codeProp; 19 | #if USE_FOLDING 20 | SerializedProperty foldedProp; 21 | [SerializeField] bool folded; 22 | #endif 23 | 24 | void OnEnable() 25 | { 26 | editorSerializedObject = new SerializedObject(this); 27 | codeProp = serializedObject.FindProperty("code"); 28 | #if USE_FOLDING 29 | folded = true; 30 | foldedProp = editorSerializedObject.FindProperty("folded"); 31 | if (folded) {} // prevent warning 32 | #else 33 | SerializedProperty foldedProp = null; 34 | #endif 35 | codeEditor = new ShaderCodeEditor("code", codeProp, foldedProp); 36 | } 37 | 38 | public override void OnInspectorGUI() 39 | { 40 | var myTarget = (CodeExample)target; 41 | serializedObject.Update(); 42 | 43 | if (editorSerializedObject != null) 44 | editorSerializedObject.Update(); 45 | 46 | if (codeEditor != null) 47 | codeEditor.Draw(); 48 | 49 | if (editorSerializedObject != null) 50 | editorSerializedObject.ApplyModifiedProperties(); 51 | 52 | serializedObject.ApplyModifiedProperties(); 53 | } 54 | } -------------------------------------------------------------------------------- /Assets/uCodeEditor/Example/Editor/CodeExampleEditor.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 30dd35f10e50cee4da376401c90920c8 3 | timeCreated: 1516636858 4 | licenseType: Free 5 | MonoImporter: 6 | externalObjects: {} 7 | serializedVersion: 2 8 | defaultReferences: [] 9 | executionOrder: 0 10 | icon: {instanceID: 0} 11 | userData: 12 | assetBundleName: 13 | assetBundleVariant: 14 | -------------------------------------------------------------------------------- /Assets/uCodeEditor/README.md.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 5566d7475f9957d4cbcbcd1a6a1c3872 3 | timeCreated: 1516637878 4 | licenseType: Free 5 | TextScriptImporter: 6 | externalObjects: {} 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /Assets/uCodeEditor/Scripts.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 21be812d0522d5241885b398dd8bb582 3 | folderAsset: yes 4 | timeCreated: 1516636749 5 | licenseType: Free 6 | DefaultImporter: 7 | externalObjects: {} 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /Assets/uCodeEditor/Scripts/Editor.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 426ccdc58935bae488a3237489b98346 3 | folderAsset: yes 4 | timeCreated: 1516636760 5 | licenseType: Free 6 | DefaultImporter: 7 | externalObjects: {} 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /Assets/uCodeEditor/Scripts/Editor/CodeEditor.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | using UnityEditor; 3 | 4 | namespace uCodeEditor 5 | { 6 | 7 | public class CodeEditor 8 | { 9 | public string controlName { get; set; } 10 | public Color backgroundColor { get; set; } 11 | public Color textColor { get; set; } 12 | 13 | string cachedCode { get; set; } 14 | string cachedHighlightedCode { get; set; } 15 | public System.Func highlighter { get; set; } 16 | 17 | public bool isFocused 18 | { 19 | get { return GUI.GetNameOfFocusedControl() == controlName; } 20 | } 21 | 22 | public CodeEditor(string controlName) 23 | { 24 | this.controlName = controlName; 25 | backgroundColor = Color.black; 26 | textColor = Color.white; 27 | highlighter = code => code; 28 | } 29 | 30 | public string Draw(string code, GUIStyle style, params GUILayoutOption[] options) 31 | { 32 | var preBackgroundColor = GUI.backgroundColor; 33 | var preColor = GUI.color; 34 | 35 | GUI.backgroundColor = backgroundColor; 36 | GUI.color = textColor; 37 | 38 | var backStyle = new GUIStyle(style); 39 | backStyle.normal.textColor = Color.clear; 40 | backStyle.hover.textColor = Color.clear; 41 | backStyle.active.textColor = Color.clear; 42 | backStyle.focused.textColor = Color.clear; 43 | 44 | GUI.SetNextControlName(controlName); 45 | 46 | // IMPORTANT: 47 | // Sadly, we cannot use TextEditor with (EditorGUILayout|EditorGUI).TextArea()... X( 48 | // And GUILayout.TextArea() cannot handle TAB key... ;_; 49 | // GUI.TextArea needs a lot of tasks to implement absic functions... T_T 50 | var editedCode = EditorGUILayout.TextArea(code, backStyle, GUILayout.ExpandHeight(true)); 51 | 52 | // So, this does not work... 53 | // var editor = GUIUtility.GetStateObject(typeof(TextEditor), GUIUtility.keyboardControl) as TextEditor; 54 | // CheckEvents(editor); 55 | 56 | if (editedCode != code) { 57 | code = editedCode; 58 | } 59 | 60 | if (string.IsNullOrEmpty(cachedHighlightedCode) || (cachedCode != code)) { 61 | cachedCode = code; 62 | cachedHighlightedCode = highlighter(code); 63 | } 64 | 65 | GUI.backgroundColor = Color.clear; 66 | 67 | var foreStyle = new GUIStyle(style); 68 | foreStyle.richText = true; 69 | foreStyle.normal.textColor = textColor; 70 | foreStyle.hover.textColor = textColor; 71 | foreStyle.active.textColor = textColor; 72 | foreStyle.focused.textColor = textColor; 73 | 74 | EditorGUI.TextArea(GUILayoutUtility.GetLastRect(), cachedHighlightedCode, foreStyle); 75 | 76 | GUI.backgroundColor = preBackgroundColor; 77 | GUI.color = preColor; 78 | 79 | return code; 80 | } 81 | 82 | void CheckEvents(TextEditor editor) 83 | { 84 | // ... 85 | } 86 | } 87 | 88 | } -------------------------------------------------------------------------------- /Assets/uCodeEditor/Scripts/Editor/CodeEditor.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 84ebcb7d4131cc84e978c42164cc6406 3 | timeCreated: 1516634153 4 | licenseType: Free 5 | MonoImporter: 6 | externalObjects: {} 7 | serializedVersion: 2 8 | defaultReferences: [] 9 | executionOrder: 0 10 | icon: {instanceID: 0} 11 | userData: 12 | assetBundleName: 13 | assetBundleVariant: 14 | -------------------------------------------------------------------------------- /Assets/uCodeEditor/Scripts/Editor/ColorScheme.cs: -------------------------------------------------------------------------------- 1 | namespace uCodeEditor 2 | { 3 | 4 | namespace ColorScheme 5 | { 6 | // http://ethanschoonover.com/solarized 7 | public static class Solarized 8 | { 9 | public const string base03 = "#002b36"; 10 | public const string base02 = "#073642"; 11 | public const string base01 = "#586e75"; 12 | public const string base00 = "#657b83"; 13 | public const string base0 = "#839496"; 14 | public const string base1 = "#93a1a1"; 15 | public const string base2 = "#eee8d5"; 16 | public const string base3 = "#fdf6e3"; 17 | public const string yellow = "#b58900"; 18 | public const string orange = "#cb4b16"; 19 | public const string red = "#dc322f"; 20 | public const string magenta = "#d33682"; 21 | public const string violet = "#6c71c4"; 22 | public const string blue = "#268bd2"; 23 | public const string cyan = "#2aa198"; 24 | public const string green = "#859900"; 25 | } 26 | } 27 | 28 | } -------------------------------------------------------------------------------- /Assets/uCodeEditor/Scripts/Editor/ColorScheme.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ec3c30a837022ae47845e44dc787e8e9 3 | timeCreated: 1516634153 4 | licenseType: Free 5 | MonoImporter: 6 | externalObjects: {} 7 | serializedVersion: 2 8 | defaultReferences: [] 9 | executionOrder: 0 10 | icon: {instanceID: 0} 11 | userData: 12 | assetBundleName: 13 | assetBundleVariant: 14 | -------------------------------------------------------------------------------- /Assets/uCodeEditor/Scripts/Editor/Common.cs: -------------------------------------------------------------------------------- 1 | using uCodeEditor.ColorScheme; 2 | 3 | namespace uCodeEditor 4 | { 5 | 6 | namespace Common 7 | { 8 | 9 | public static class Color 10 | { 11 | public const string background = Solarized.base03; 12 | public const string color = "#ffffff"; 13 | public const string type = Solarized.yellow; 14 | public const string keyword = Solarized.green; 15 | public const string symbol = Solarized.base1; 16 | public const string digit = Solarized.violet; 17 | public const string str = Solarized.violet; 18 | public const string comment = Solarized.base01; 19 | public const string cgprogram = Solarized.blue; 20 | public const string unity = Solarized.magenta; 21 | public const string user1 = Solarized.orange; 22 | public const string user2 = Solarized.cyan; 23 | } 24 | 25 | public static class Editor 26 | { 27 | public const string font = "CONSOLA"; 28 | public const int fontSize = 12; 29 | public const bool wordWrap = false; 30 | public const int minHeight = 200; 31 | } 32 | 33 | 34 | } 35 | 36 | } -------------------------------------------------------------------------------- /Assets/uCodeEditor/Scripts/Editor/Common.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 1d2bb6066b6052f4e899fafd76471e6a 3 | timeCreated: 1516635282 4 | licenseType: Free 5 | MonoImporter: 6 | externalObjects: {} 7 | serializedVersion: 2 8 | defaultReferences: [] 9 | executionOrder: 0 10 | icon: {instanceID: 0} 11 | userData: 12 | assetBundleName: 13 | assetBundleVariant: 14 | -------------------------------------------------------------------------------- /Assets/uCodeEditor/Scripts/Editor/Resources.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 279f52cc5ba19ad4aa2ae9d5d65ccf8e 3 | folderAsset: yes 4 | timeCreated: 1516636961 5 | licenseType: Free 6 | DefaultImporter: 7 | externalObjects: {} 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /Assets/uCodeEditor/Scripts/Editor/Resources/CONSOLA.TTF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kevinw/uCodeEditor/0819078f2dfb77cb04b610611919a7b5683fd1f3/Assets/uCodeEditor/Scripts/Editor/Resources/CONSOLA.TTF -------------------------------------------------------------------------------- /Assets/uCodeEditor/Scripts/Editor/Resources/CONSOLA.TTF.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: eda1f2d34ceb34a43a35e5d7d67794b4 3 | timeCreated: 1516636985 4 | licenseType: Free 5 | TrueTypeFontImporter: 6 | externalObjects: {} 7 | serializedVersion: 4 8 | fontSize: 16 9 | forceTextureCase: -2 10 | characterSpacing: 0 11 | characterPadding: 1 12 | includeFontData: 1 13 | fontName: Consolas 14 | fontNames: 15 | - Consolas 16 | fallbackFontReferences: [] 17 | customCharacters: 18 | fontRenderingMode: 0 19 | ascentCalculationMode: 1 20 | useLegacyBoundsCalculation: 0 21 | userData: 22 | assetBundleName: 23 | assetBundleVariant: 24 | -------------------------------------------------------------------------------- /Assets/uCodeEditor/Scripts/Editor/ShaderCodeEditor.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | using UnityEditor; 3 | 4 | namespace uCodeEditor 5 | { 6 | 7 | public class ShaderCodeEditor 8 | { 9 | public string name { get; private set; } 10 | public SerializedProperty value { get; private set; } 11 | public SerializedProperty folded { get; private set; } 12 | 13 | CodeEditor editor_; 14 | Vector2 scrollPos_; 15 | Font font_; 16 | 17 | public string code 18 | { 19 | get { return value != null ? value.stringValue : ""; } 20 | private set { this.value.stringValue = value; } 21 | } 22 | 23 | public ShaderCodeEditor(string name, SerializedProperty value, SerializedProperty folded = null) 24 | { 25 | this.name = name; 26 | this.value = value; 27 | this.folded = folded; 28 | 29 | font_ = Resources.Load(Common.Editor.font); 30 | 31 | Color color, bgColor; 32 | ColorUtility.TryParseHtmlString(Common.Color.background, out bgColor); 33 | ColorUtility.TryParseHtmlString(Common.Color.color, out color); 34 | 35 | editor_ = new CodeEditor(name); 36 | editor_.backgroundColor = bgColor; 37 | editor_.textColor = color; 38 | editor_.highlighter = ShaderHighlighter.Highlight; 39 | } 40 | 41 | public void Draw() 42 | { 43 | if (folded != null) 44 | { 45 | var preFolded = folded.boolValue; 46 | folded.boolValue = Utils.Foldout(name, folded.boolValue); 47 | 48 | if (!folded.boolValue) { 49 | if (preFolded) { 50 | GUI.FocusControl(""); 51 | } 52 | return; 53 | } 54 | 55 | if (!preFolded) { 56 | GUI.FocusControl(name); 57 | } 58 | } 59 | 60 | var minHeight = GUILayout.MinHeight(Common.Editor.minHeight); 61 | var maxHeight = GUILayout.MaxHeight(Screen.height); 62 | scrollPos_ = EditorGUILayout.BeginScrollView(scrollPos_, minHeight, maxHeight); 63 | { 64 | var style = new GUIStyle(GUI.skin.textArea); 65 | style.padding = new RectOffset(6, 6, 6, 6); 66 | style.font = font_; 67 | style.fontSize = Common.Editor.fontSize; 68 | style.wordWrap = Common.Editor.wordWrap; 69 | 70 | var editedCode = editor_.Draw(code, style, GUILayout.ExpandHeight(true)); 71 | if (editedCode != code) { 72 | code = editedCode; 73 | } 74 | } 75 | EditorGUILayout.EndScrollView(); 76 | 77 | EditorGUILayout.Space(); 78 | } 79 | } 80 | 81 | } -------------------------------------------------------------------------------- /Assets/uCodeEditor/Scripts/Editor/ShaderCodeEditor.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: a8436856aab6b074bbdc290a134ecde6 3 | timeCreated: 1516635754 4 | licenseType: Free 5 | MonoImporter: 6 | externalObjects: {} 7 | serializedVersion: 2 8 | defaultReferences: [] 9 | executionOrder: 0 10 | icon: {instanceID: 0} 11 | userData: 12 | assetBundleName: 13 | assetBundleVariant: 14 | -------------------------------------------------------------------------------- /Assets/uCodeEditor/Scripts/Editor/ShaderHighlighter.cs: -------------------------------------------------------------------------------- 1 | using System.Text.RegularExpressions; 2 | using System.Collections.Generic; 3 | 4 | namespace uCodeEditor 5 | { 6 | 7 | public static class ShaderHighlighter 8 | { 9 | static Regex regex; 10 | static MatchEvaluator evaluator; 11 | static Dictionary colorTable = new Dictionary { 12 | { "symbol", Common.Color.symbol }, 13 | { "digit", Common.Color.digit }, 14 | { "str", Common.Color.str }, 15 | { "comment", Common.Color.comment }, 16 | { "type", Common.Color.type }, 17 | { "keyword", Common.Color.keyword }, 18 | { "cgprogram", Common.Color.cgprogram }, 19 | { "user1", Common.Color.user1 }, 20 | { "user2", Common.Color.user2 }, 21 | { "unity", Common.Color.unity }, 22 | }; 23 | 24 | static string ToColoredCode(string code, string color) 25 | { 26 | return "" + code + ""; 27 | } 28 | 29 | [UnityEditor.InitializeOnLoadMethod] 30 | static void Init() 31 | { 32 | var forwardSeparator = "(?({1}))"; 35 | var pattern2 = string.Format("(?<{0}>{2}({1}){3})", "{0}", "{1}", forwardSeparator, backwardSeparator); 36 | 37 | var patterns = new string[] { 38 | string.Format(pattern1, "comment", string.Join("|", ShaderSyntax.comment)), 39 | string.Format(pattern2, "type", string.Join("|", ShaderSyntax.type)), 40 | string.Format(pattern2, "keyword", string.Join("|", ShaderSyntax.keyword)), 41 | string.Format(pattern2, "user1", string.Join("|", ShaderSyntax.user1)), 42 | string.Format(pattern2, "user2", string.Join("|", ShaderSyntax.user2)), 43 | string.Format(pattern2, "cgprogram", string.Join("|", ShaderSyntax.cgprogram)), 44 | string.Format(pattern2, "unity", string.Join("|", ShaderSyntax.unity)), 45 | string.Format(pattern1, "str", string.Join("|", ShaderSyntax.str)), 46 | string.Format(pattern1, "digit", string.Join("|", ShaderSyntax.digit)), 47 | string.Format(pattern1, "symbol", string.Join("|", ShaderSyntax.symbol)), 48 | }; 49 | var combinedPattern = "(" + string.Join("|", patterns) + ")"; 50 | 51 | #if NET_2_0_SUBSET 52 | regex = new Regex(combinedPattern); 53 | #else 54 | regex = new Regex(combinedPattern, RegexOptions.Compiled); 55 | #endif 56 | 57 | evaluator = new MatchEvaluator(match => { 58 | foreach (var pair in colorTable) { 59 | if (match.Groups[pair.Key].Success) { 60 | return ToColoredCode(match.Value, pair.Value); 61 | } 62 | } 63 | return match.Value; 64 | }); 65 | } 66 | 67 | public static string Highlight(string code) 68 | { 69 | return regex.Replace(code, evaluator); 70 | } 71 | } 72 | 73 | } -------------------------------------------------------------------------------- /Assets/uCodeEditor/Scripts/Editor/ShaderHighlighter.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 13be30bd460d47640b0ece787d93bc60 3 | timeCreated: 1516634153 4 | licenseType: Free 5 | MonoImporter: 6 | externalObjects: {} 7 | serializedVersion: 2 8 | defaultReferences: [] 9 | executionOrder: 0 10 | icon: {instanceID: 0} 11 | userData: 12 | assetBundleName: 13 | assetBundleVariant: 14 | -------------------------------------------------------------------------------- /Assets/uCodeEditor/Scripts/Editor/ShaderSyntax.cs: -------------------------------------------------------------------------------- 1 | using System.Text.RegularExpressions; 2 | using System.Collections.Generic; 3 | 4 | namespace uCodeEditor 5 | { 6 | 7 | public static class ShaderSyntax 8 | { 9 | public static readonly string[] type = new string[] { 10 | "void", 11 | "fixed", 12 | "fixed[1-4]", 13 | "fixed[1-4]x[1-4]", 14 | "half", 15 | "half[1-4]", 16 | "half[1-4]x[1-4]", 17 | "float", 18 | "float[1-4]", 19 | "float[1-4]x[1-4]", 20 | }; 21 | 22 | public static readonly string[] keyword = new string[] { 23 | "#include", 24 | "#define", 25 | "return", 26 | "out", 27 | "inout", 28 | "inline", 29 | }; 30 | 31 | public static readonly string[] symbol = new string[] { 32 | @"[{}()=;,+\-*/<>|]+", 33 | }; 34 | 35 | public static readonly string[] digit = new string[] { 36 | @"(? 5 | 6 | Extracted from [uRaymarching](https://github.com/hecomi/uRaymarching/). 7 | 8 | License 9 | ------- 10 | 11 | [MIT License](LICENSE) 12 | --------------------------------------------------------------------------------