├── .gitattributes ├── .gitignore ├── Editor.meta ├── Editor ├── BennyKok.Pie.Editor.asmdef ├── BennyKok.Pie.Editor.asmdef.meta ├── PieMenuAttribute.cs ├── PieMenuAttribute.cs.meta ├── PieSystem.cs └── PieSystem.cs.meta ├── LICENSE ├── LICENSE.meta ├── README.md ├── README.md.meta ├── package.json └── package.json.meta /.gitattributes: -------------------------------------------------------------------------------- 1 | # .gitattributes from https://github.com/github-for-unity/Unity/blob/master/src/GitHub.Api/Resources/.gitattributes 2 | * text=auto 3 | 4 | # Unity files 5 | *.meta -text merge=unityyamlmerge diff 6 | *.unity -text merge=unityyamlmerge diff 7 | *.asset -text merge=unityyamlmerge diff 8 | *.prefab -text merge=unityyamlmerge diff 9 | *.mat -text merge=unityyamlmerge diff 10 | *.anim -text merge=unityyamlmerge diff 11 | *.controller -text merge=unityyamlmerge diff 12 | *.overrideController -text merge=unityyamlmerge diff 13 | *.physicMaterial -text merge=unityyamlmerge diff 14 | *.physicsMaterial2D -text merge=unityyamlmerge diff 15 | *.playable -text merge=unityyamlmerge diff 16 | *.mask -text merge=unityyamlmerge diff 17 | *.brush -text merge=unityyamlmerge diff 18 | *.flare -text merge=unityyamlmerge diff 19 | *.fontsettings -text merge=unityyamlmerge diff 20 | *.guiskin -text merge=unityyamlmerge diff 21 | *.giparams -text merge=unityyamlmerge diff 22 | *.renderTexture -text merge=unityyamlmerge diff 23 | *.spriteatlas -text merge=unityyamlmerge diff 24 | *.terrainlayer -text merge=unityyamlmerge diff 25 | *.mixer -text merge=unityyamlmerge diff 26 | *.shadervariants -text merge=unityyamlmerge diff 27 | 28 | # Image formats 29 | *.psd filter=lfs diff=lfs merge=lfs -text 30 | *.jpg filter=lfs diff=lfs merge=lfs -text 31 | *.png filter=lfs diff=lfs merge=lfs -text 32 | *.gif filter=lfs diff=lfs merge=lfs -text 33 | *.bmp filter=lfs diff=lfs merge=lfs -text 34 | *.tga filter=lfs diff=lfs merge=lfs -text 35 | *.tiff filter=lfs diff=lfs merge=lfs -text 36 | *.tif filter=lfs diff=lfs merge=lfs -text 37 | *.iff filter=lfs diff=lfs merge=lfs -text 38 | *.pict filter=lfs diff=lfs merge=lfs -text 39 | *.dds filter=lfs diff=lfs merge=lfs -text 40 | *.xcf filter=lfs diff=lfs merge=lfs -text 41 | 42 | # Audio formats 43 | *.mp3 filter=lfs diff=lfs merge=lfs -text 44 | *.ogg filter=lfs diff=lfs merge=lfs -text 45 | *.wav filter=lfs diff=lfs merge=lfs -text 46 | *.aiff filter=lfs diff=lfs merge=lfs -text 47 | *.aif filter=lfs diff=lfs merge=lfs -text 48 | *.mod filter=lfs diff=lfs merge=lfs -text 49 | *.it filter=lfs diff=lfs merge=lfs -text 50 | *.s3m filter=lfs diff=lfs merge=lfs -text 51 | *.xm filter=lfs diff=lfs merge=lfs -text 52 | 53 | # Video formats 54 | *.mov filter=lfs diff=lfs merge=lfs -text 55 | *.avi filter=lfs diff=lfs merge=lfs -text 56 | *.asf filter=lfs diff=lfs merge=lfs -text 57 | *.mpg filter=lfs diff=lfs merge=lfs -text 58 | *.mpeg filter=lfs diff=lfs merge=lfs -text 59 | *.mp4 filter=lfs diff=lfs merge=lfs -text 60 | 61 | # 3D formats 62 | *.fbx filter=lfs diff=lfs merge=lfs -text 63 | *.obj filter=lfs diff=lfs merge=lfs -text 64 | *.max filter=lfs diff=lfs merge=lfs -text 65 | *.blend filter=lfs diff=lfs merge=lfs -text 66 | *.dae filter=lfs diff=lfs merge=lfs -text 67 | *.mb filter=lfs diff=lfs merge=lfs -text 68 | *.ma filter=lfs diff=lfs merge=lfs -text 69 | *.3ds filter=lfs diff=lfs merge=lfs -text 70 | *.dfx filter=lfs diff=lfs merge=lfs -text 71 | *.c4d filter=lfs diff=lfs merge=lfs -text 72 | *.lwo filter=lfs diff=lfs merge=lfs -text 73 | *.lwo2 filter=lfs diff=lfs merge=lfs -text 74 | *.abc filter=lfs diff=lfs merge=lfs -text 75 | *.3dm filter=lfs diff=lfs merge=lfs -text 76 | 77 | # Build 78 | *.dll filter=lfs diff=lfs merge=lfs -text 79 | *.pdb filter=lfs diff=lfs merge=lfs -text 80 | *.mdb filter=lfs diff=lfs merge=lfs -text 81 | 82 | # Packaging 83 | *.zip filter=lfs diff=lfs merge=lfs -text 84 | *.7z filter=lfs diff=lfs merge=lfs -text 85 | *.gz filter=lfs diff=lfs merge=lfs -text 86 | *.rar filter=lfs diff=lfs merge=lfs -text 87 | *.tar filter=lfs diff=lfs merge=lfs -text -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Created by https://www.toptal.com/developers/gitignore/api/unity 3 | # Edit at https://www.toptal.com/developers/gitignore?templates=unity 4 | 5 | ### Unity ### 6 | # This .gitignore file should be placed at the root of your Unity project directory 7 | # 8 | # Get latest from https://github.com/github/gitignore/blob/master/Unity.gitignore 9 | /[Ll]ibrary/ 10 | /[Tt]emp/ 11 | /[Oo]bj/ 12 | /[Bb]uild/ 13 | /[Bb]uilds/ 14 | /[Ll]ogs/ 15 | /[Uu]ser[Ss]ettings/ 16 | 17 | # MemoryCaptures can get excessive in size. 18 | # They also could contain extremely sensitive data 19 | /[Mm]emoryCaptures/ 20 | 21 | # Asset meta data should only be ignored when the corresponding asset is also ignored 22 | !/[Aa]ssets/**/*.meta 23 | 24 | # Uncomment this line if you wish to ignore the asset store tools plugin 25 | # /[Aa]ssets/AssetStoreTools* 26 | 27 | # Autogenerated Jetbrains Rider plugin 28 | /[Aa]ssets/Plugins/Editor/JetBrains* 29 | 30 | # Visual Studio cache directory 31 | .vs/ 32 | 33 | # Gradle cache directory 34 | .gradle/ 35 | 36 | # Autogenerated VS/MD/Consulo solution and project files 37 | ExportedObj/ 38 | .consulo/ 39 | *.csproj 40 | *.unityproj 41 | *.sln 42 | *.suo 43 | *.tmp 44 | *.user 45 | *.userprefs 46 | *.pidb 47 | *.booproj 48 | *.svd 49 | *.pdb 50 | *.mdb 51 | *.opendb 52 | *.VC.db 53 | 54 | # Unity3D generated meta files 55 | *.pidb.meta 56 | *.pdb.meta 57 | *.mdb.meta 58 | 59 | # Unity3D generated file on crash reports 60 | sysinfo.txt 61 | 62 | # Builds 63 | *.apk 64 | *.unitypackage 65 | 66 | # Crashlytics generated file 67 | crashlytics-build.properties 68 | 69 | # Autogenerated files 70 | InitTestScene*.unity.meta 71 | InitTestScene*.unity 72 | 73 | 74 | # End of https://www.toptal.com/developers/gitignore/api/unity 75 | -------------------------------------------------------------------------------- /Editor.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: c77fc9fa9028bd94f88511aefd37c74b 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Editor/BennyKok.Pie.Editor.asmdef: -------------------------------------------------------------------------------- 1 | { 2 | "name": "BennyKok.Pie.Editor", 3 | "rootNamespace": "BennyKok.Pie.Editor", 4 | "references": [], 5 | "includePlatforms": [ 6 | "Editor" 7 | ], 8 | "excludePlatforms": [], 9 | "allowUnsafeCode": false, 10 | "overrideReferences": false, 11 | "precompiledReferences": [], 12 | "autoReferenced": true, 13 | "defineConstraints": [], 14 | "versionDefines": [], 15 | "noEngineReferences": false 16 | } -------------------------------------------------------------------------------- /Editor/BennyKok.Pie.Editor.asmdef.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 4adb83fc177eb6048aec50835dc41f93 3 | AssemblyDefinitionImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Editor/PieMenuAttribute.cs: -------------------------------------------------------------------------------- 1 | using System.Diagnostics; 2 | using System.Collections; 3 | using System.Collections.Generic; 4 | using UnityEngine; 5 | using UnityEditor; 6 | using UnityEngine.UIElements; 7 | using System; 8 | 9 | namespace BennyKok.Pie.Editor 10 | { 11 | [AttributeUsage(System.AttributeTargets.Method)] 12 | public class PieMenuAttribute : Attribute 13 | { 14 | public string path; 15 | public PieMenuAttribute() { } 16 | public PieMenuAttribute(string path) 17 | { 18 | this.path = path; 19 | } 20 | } 21 | } -------------------------------------------------------------------------------- /Editor/PieMenuAttribute.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 19f6d96e80ab3c94f81ddb6d867e66b1 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Editor/PieSystem.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Reflection; 5 | using UnityEditor; 6 | using UnityEditor.ShortcutManagement; 7 | using UnityEngine; 8 | using UnityEngine.UIElements; 9 | using UnityEngine.UIElements.Experimental; 10 | 11 | namespace BennyKok.Pie.Editor 12 | { 13 | [InitializeOnLoad] 14 | public class PieSystem 15 | { 16 | private const int Radius = 80; 17 | private const KeyCode shortcutKey = KeyCode.A; 18 | private static SceneView targetSceneView; 19 | private static VisualElement targetSceneRoot; 20 | private static VisualElement pieRoot; 21 | private static int lastInstanceID; 22 | 23 | private static Vector2 size = new Vector2(100, 100); 24 | 25 | private static Pie rootPie = new Pie("root"); 26 | private static Pie currentPie; 27 | 28 | public static bool IsVisible => pieRoot?.style.display == DisplayStyle.Flex; 29 | 30 | public class Pie 31 | { 32 | public string path; 33 | public Pie parentPie; 34 | 35 | public Pie(string path) 36 | { 37 | this.path = path; 38 | } 39 | 40 | public List subPie = new List(); 41 | public Action onTrigger; 42 | } 43 | 44 | // [Shortcut("PieSystem.Open", KeyCode.A)] 45 | private static void TogglePie() 46 | { 47 | if (!(pieRoot is null)) 48 | { 49 | pieRoot.style.display = pieRoot.style.display == DisplayStyle.None ? DisplayStyle.Flex : DisplayStyle.None; 50 | 51 | if (IsVisible) 52 | { 53 | Vector2 mousePosition = Event.current.mousePosition; //GUIUtility.ScreenToGUIPoint(Event.current.mousePosition); 54 | // mousePosition += targetSceneView.position.min; 55 | // mousePosition -= new Vector2(size.x, size.y) / 2; 56 | // mousePosition.y += 20; 57 | // mousePosition.y += size.y; 58 | 59 | mousePosition -= new Vector2(20, 0); 60 | pieRoot.transform.position = mousePosition; 61 | 62 | RefreshPie(); 63 | 64 | targetSceneView.Repaint(); 65 | } 66 | } 67 | } 68 | 69 | private static void RefreshPie() 70 | { 71 | pieRoot.Clear(); 72 | 73 | if (currentPie.parentPie is { }) 74 | { 75 | pieRoot.Add(NewPieButton("<", () => OpenPie(currentPie.parentPie))); 76 | } 77 | 78 | foreach (var menu in currentPie.subPie) 79 | { 80 | pieRoot.Add(NewPieButton(menu.subPie.Count > 0 ? menu.path + ">" : menu.path, menu.onTrigger)); 81 | } 82 | 83 | int i = 0; 84 | foreach (var item in pieRoot.Children()) 85 | { 86 | item.transform.position = Vector3.zero; 87 | item.experimental.animation.Position(CirclePoint(Vector3.zero, Radius, i, pieRoot.childCount), 120); 88 | i++; 89 | } 90 | } 91 | 92 | private static Button NewPieButton(string label, Action callback) 93 | { 94 | return new Button(callback) 95 | { 96 | text = label, 97 | style = { 98 | position = Position.Absolute, 99 | paddingLeft = 10, 100 | paddingRight = 10, 101 | paddingTop = 6, 102 | paddingBottom = 6, 103 | }, 104 | }; 105 | } 106 | 107 | static PieSystem() 108 | { 109 | EditorApplication.update -= OnUpdate; 110 | EditorApplication.update += OnUpdate; 111 | 112 | SceneView.duringSceneGui -= OnSceneGUI; 113 | SceneView.duringSceneGui += OnSceneGUI; 114 | } 115 | 116 | private static double lastPieOpenTime; 117 | private static Vector2 lastMousePosition; 118 | 119 | private static void OnSceneGUI(SceneView view) 120 | { 121 | if ((Event.current.type == EventType.MouseDrag || Event.current.type == EventType.MouseDown || Event.current.button == 1)) 122 | { 123 | if (IsVisible) 124 | TogglePie(); 125 | } 126 | else 127 | { 128 | if (Event.current.type == EventType.KeyDown && Event.current.keyCode == shortcutKey && !IsVisible) 129 | { 130 | lastPieOpenTime = EditorApplication.timeSinceStartup; 131 | lastMousePosition = Event.current.mousePosition; 132 | TogglePie(); 133 | } 134 | 135 | if (Event.current.type == EventType.KeyUp && Event.current.keyCode == shortcutKey && IsVisible) 136 | { 137 | if (EditorApplication.timeSinceStartup - lastPieOpenTime > 0.2) 138 | { 139 | var x1 = lastMousePosition; 140 | var x2 = Event.current.mousePosition; 141 | 142 | // If we moved some amount, we may want to invoke that action 143 | if ((Vector3.Distance(EditorGUIUtility.PixelsToPoints(x1), EditorGUIUtility.PixelsToPoints(x2))) > 20) 144 | { 145 | float xDiff = x1.x - x2.x; 146 | float yDiff = x1.y - x2.y; 147 | var angle = (180 + (float)Math.Atan2(yDiff, xDiff) * (float)(180 / Math.PI) - 90); 148 | angle = 360 - angle; 149 | angle = Mathf.Abs(angle) % 360; 150 | 151 | var count = currentPie.subPie.Count; 152 | // Counter for the back button 153 | if (currentPie.parentPie is { }) count++; 154 | 155 | var index = Mathf.RoundToInt(angle / (360 / count)) % count; 156 | // Debug.Log(index); 157 | // Debug.Log(angle); 158 | 159 | // Counter for the back button 160 | if (currentPie.parentPie is { }) index--; 161 | 162 | if (index == -1) 163 | { 164 | OpenPie(currentPie.parentPie); 165 | } 166 | else 167 | { 168 | var selected = currentPie.subPie[index]; 169 | selected.onTrigger(); 170 | } 171 | } 172 | // Else, close the pie instead 173 | else 174 | { 175 | TogglePie(); 176 | } 177 | } 178 | } 179 | } 180 | } 181 | 182 | static void OnUpdate() 183 | { 184 | targetSceneView = SceneView.currentDrawingSceneView ?? SceneView.lastActiveSceneView; 185 | 186 | if (targetSceneView && targetSceneView.GetInstanceID() != lastInstanceID) 187 | { 188 | lastInstanceID = targetSceneView.GetInstanceID(); 189 | 190 | CleanUpPreviousPie(); 191 | } 192 | 193 | if (pieRoot is null && targetSceneRoot is null && targetSceneView is { }) 194 | { 195 | targetSceneRoot = targetSceneView.rootVisualElement; 196 | 197 | if (targetSceneRoot is { }) 198 | Init(); 199 | else 200 | Debug.Log("targetSceneRoot is Null"); 201 | } 202 | } 203 | 204 | private static void CleanUpPreviousPie() 205 | { 206 | if (!(pieRoot is null)) 207 | { 208 | pieRoot.RemoveFromHierarchy(); 209 | pieRoot = null; 210 | } 211 | } 212 | 213 | private static Vector2 CirclePoint(Vector2 center, float radius, float xIndex, float xCount) 214 | { 215 | var angle = xIndex / xCount * 360f; 216 | var pos = new Vector2 217 | { 218 | x = radius * Mathf.Sin(angle * Mathf.Deg2Rad), 219 | y = radius * Mathf.Cos(angle * Mathf.Deg2Rad), 220 | }; 221 | // Debug.Log(angle); 222 | return pos; 223 | } 224 | 225 | private static void Init() 226 | { 227 | if (pieRoot is { }) 228 | CleanUpPreviousPie(); 229 | 230 | // var methods = AppDomain.CurrentDomain.GetAssemblies() 231 | // .SelectMany(x => x.GetTypes()) 232 | // .Where(x => x.IsClass) 233 | // .SelectMany(x => x.GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic)) 234 | // .Where(x => x.GetCustomAttributes(typeof(PieMenuAttribute), false).FirstOrDefault() != null); 235 | 236 | var methods = TypeCache.GetMethodsWithAttribute(); 237 | 238 | pieRoot = new VisualElement() 239 | { 240 | style = { 241 | position = Position.Absolute, 242 | } 243 | }; 244 | pieRoot.style.width = size.x; 245 | pieRoot.style.height = size.y; 246 | pieRoot.style.display = DisplayStyle.None; 247 | // pieRoot.style.backgroundColor = Color.black; 248 | targetSceneRoot.Add(pieRoot); 249 | 250 | rootPie.subPie.Clear(); 251 | foreach (var method in methods) 252 | { 253 | var attribute = (PieMenuAttribute)method.GetCustomAttributes(typeof(PieMenuAttribute), false).First(); 254 | // Debug.Log(attribute.path); 255 | 256 | CreatePie(attribute.path, attribute, method); 257 | } 258 | currentPie = rootPie; 259 | } 260 | 261 | private static void CreatePie(string fullPath, PieMenuAttribute attr, MethodInfo info) 262 | { 263 | var paths = fullPath.Split('/'); 264 | var pie = rootPie; 265 | 266 | // Create the sub pie for each path segments 267 | if (paths.Length > 1) 268 | { 269 | for (int i = 0; i < paths.Length - 1; i++) 270 | { 271 | var path = paths[i]; 272 | 273 | // Look for existing pie path 274 | var tempPie = pie.subPie.Find(x => x.path == path); 275 | 276 | // Is null, lets create a new one 277 | if (tempPie is null) 278 | { 279 | tempPie = new Pie(path); 280 | tempPie.onTrigger = () => OpenPie(tempPie); 281 | tempPie.parentPie = pie; 282 | pie.subPie.Add(tempPie); 283 | } 284 | 285 | pie = tempPie; 286 | } 287 | } 288 | 289 | // Create the final target pie 290 | var targetPie = new Pie(paths.Last()); 291 | targetPie.onTrigger = () => 292 | { 293 | TogglePie(); 294 | info.Invoke(null, null); 295 | }; 296 | pie.subPie.Add(targetPie); 297 | } 298 | public static void OpenPie(Pie targetPie) 299 | { 300 | currentPie = targetPie; 301 | RefreshPie(); 302 | } 303 | } 304 | } -------------------------------------------------------------------------------- /Editor/PieSystem.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: c064e5b9f9d708a49a1b1205a0eee447 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 BennyKok 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /LICENSE.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: be27884fc87b5c74492735abfcfdbee6 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # unity-pie 2 | 3 | This pacakge is an experimental pie menu for Unity 4 | 5 | ### A 6 | ## Press A for the Pie 7 | 8 | ![Imgur](https://i.imgur.com/J2maHmf.gif) 9 | 10 | ``` 11 | UPM install via git url -> https://github.com/BennyKok/unity-pie.git 12 | ``` 13 | 14 | To try out the feel of the pie menu in unity you can try the probuilder pie integration package 15 | 16 | ``` 17 | UPM install via git url -> https://github.com/BennyKok/unity-pie-probuilder.git 18 | ``` 19 | 20 | ## API Examples 21 | Just like Unity's MenuItemAttribute, instead you use PieMenu!!! 22 | 23 | ``` 24 | [PieMenu(path = "Selection/Object")] 25 | public static void ObjectMode() 26 | { 27 | ProBuilderEditor.selectMode = SelectMode.Object; 28 | } 29 | 30 | [PieMenu(path = "New PolyShape")] 31 | public static void PolyShape() 32 | { 33 | EditorApplication.ExecuteMenuItem("Tools/ProBuilder/Editors/New Poly Shape"); 34 | } 35 | ``` 36 | 37 | ## Explore 38 | Feel free to check me out!! :) 39 | 40 | [Twitter](https://twitter.com/BennyKokMusic) | [Website](https://bennykok.com) | [AssetStore](https://assetstore.unity.com/publishers/28510) 41 | -------------------------------------------------------------------------------- /README.md.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 2f9a937bf68b3a4488a18b27b9d4026e 3 | TextScriptImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "com.bennykok.pie", 3 | "displayName": "Pie", 4 | "version": "0.1.0", 5 | "description": "Pie Pie Pie", 6 | "unity": "2019.4", 7 | "dependencies": { 8 | 9 | }, 10 | "author": { 11 | "name": "BennyKok", 12 | "url": "https://github.com/BennyKok" 13 | } 14 | } -------------------------------------------------------------------------------- /package.json.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: a21818a0dd65efc45a7991a8c768b2de 3 | PackageManifestImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | --------------------------------------------------------------------------------