From 053043c16feac0429d0532902dcdde4e33c16bfb Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Wed, 14 Jun 2017 20:03:54 +0430 Subject: [PATCH 001/231] Better Getting Access Removed Email Image for readability and ease of use. made it beautiful at all. --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c3a5a43..b455184 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,9 @@ All kinds of scripts, snippets & shaders (mainly collected from forum/answers posts) ### Getting access -- PM me your github id in [unity forums](http://forum.unity3d.com/members/mgear.22727/) or by [email](http://i1.wp.com/unitycoder.com/blog/wp-content/uploads/2011/07/mail.jpg), so i'll add you into this organization. +Send your GitHub id to one of the below ways: +- [Unity Forums](http://forum.unity3d.com/members/mgear.22727/) +- support@unitycoder.com ### TODO / Instructions - (To Be Added) From ed443c9dbbef723189454fbbec785fdeb0e5d886 Mon Sep 17 00:00:00 2001 From: mika Date: Thu, 15 Jun 2017 13:23:56 +0800 Subject: [PATCH 002/231] Create README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b455184..9fae77f 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ All kinds of scripts, snippets & shaders (mainly collected from forum/answer ### Getting access Send your GitHub id to one of the below ways: - [Unity Forums](http://forum.unity3d.com/members/mgear.22727/) -- support@unitycoder.com +- support [at] unitycoder [dot] com ### TODO / Instructions - (To Be Added) From 6aec74f7623c811b533656cd36cb4c10bc879970 Mon Sep 17 00:00:00 2001 From: mika Date: Sat, 17 Jun 2017 20:59:16 +0800 Subject: [PATCH 003/231] started contributing instructions --- CONTRIBUTING.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..a69a859 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,6 @@ +How Can I Contribute? + +- Report Bugs, Requests or Suggestions using https://github.com/UnityCommunity/UnityLibrary/issues +- Adding Content to Wiki https://github.com/UnityCommunity/UnityLibrary/wiki +- Updating, Optimizing or Arranging/Cleaning-up existing content +- Submitting fixes or new content using Pull Request (or joining as a member and directly adding to this repository) From fefa6bf3c0f79abe2247adafce3293da8ed63822 Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Sun, 25 Jun 2017 10:02:00 +0430 Subject: [PATCH 004/231] Create README.md Installation Instructions. Modification Instructions. --- ScriptTemplates/README.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 ScriptTemplates/README.md diff --git a/ScriptTemplates/README.md b/ScriptTemplates/README.md new file mode 100644 index 0000000..d8c9719 --- /dev/null +++ b/ScriptTemplates/README.md @@ -0,0 +1,32 @@ +# Script Templates +Script templates are plain text documents that contains a simple script functionally that let's you get started with script faster. + +Here we have bunch of script templates that makes your scripting more fun. + +## Installation +Download the script template(s) you want and copy them to: (Choose your current operating system) + +- **Windows**: C:\Program Files\Unity\Editor\Data\Resources\ScriptTemplates +- **Mac**: /Applications/Unity/Editor/Data/Resources/ScriptTemplates +- **Mac (since 5.2.1f1)**: /Applications/Unity/Unity.app/Contents/Resources/ScriptTemplates + +And paste them. (Some script templates may need replace confirmation) + +All done, now restart the Unity Editor and enjoy. + +## Modification +Every script template has a special format, this format consists of: + +**Format**: {Order in menu}-{Menu item name}-{Initial script name}.txt + +**Example**: 81a-C# Editor Script-NewEditorScript.cs.txt + +Also the content of the file contains a simple script that replaces it's class name with the entered name for the file. +you can find it in the file by **#SCRIPTNAME#** tag. + +[**More information**](https://support.unity3d.com/hc/en-us/articles/210223733-How-to-customize-Unity-script-templates) + +## License +MIT @ [Unity Community](https://github.com/UnityCommunity/) + +Made with :heart: by [Unity Community](https://github.com/UnityCommunity/) From 1fc3b9f07ee05201c5a3d93aaf64c6c28705da65 Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Sun, 25 Jun 2017 10:08:00 +0430 Subject: [PATCH 005/231] Update 81a-C# Editor Script-NewEditorScript.cs.txt --- ...1a-C# Editor Script-NewEditorScript.cs.txt | 39 ++++++------------- 1 file changed, 12 insertions(+), 27 deletions(-) diff --git a/ScriptTemplates/81a-C# Editor Script-NewEditorScript.cs.txt b/ScriptTemplates/81a-C# Editor Script-NewEditorScript.cs.txt index 3e8dc8a..694024f 100644 --- a/ScriptTemplates/81a-C# Editor Script-NewEditorScript.cs.txt +++ b/ScriptTemplates/81a-C# Editor Script-NewEditorScript.cs.txt @@ -1,34 +1,19 @@ -using UnityEditor; -using UnityEngine; using System.Collections; using System.Collections.Generic; +using UnityEngine; +using UnityEditor; -// Custom Editor Script Template -// Place this file into \Unity\Editor\Data\Resources\ScriptTemplates\ - folder -// Then you can right click over Project window and select Create/C# Editor Script -// "81a" in the filename is the menu position - -public class #SCRIPTNAME# : EditorWindow -{ - [MenuItem("Window/#SCRIPTNAME#")] - static void Init() - { - var window = (#SCRIPTNAME#)EditorWindow.GetWindow(typeof(#SCRIPTNAME#)); - window.Show(); - } +public class #SCRIPTNAME# : EditorWindow { - void OnGUI() - { - //TODO: Add other fields + // Use this for initialization + [MenuItem("Window/#SCRIPTNAME#")] + private static void Initialize () { + #NOTRIM# + } - if (GUILayout.Button("My Button")) - { - DoSomething(); - } - } + // Draw the Window GUI + void OnGUI () { + #NOTRIM# + } - void DoSomething() - { - Debug.Log("Do Something!"); - } } From fa3305f4d1561c11e939bdcdb39b57c5cd1b5685 Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Sun, 25 Jun 2017 10:30:59 +0430 Subject: [PATCH 006/231] Create 81a-C# Custom Editor Script-NewCustomEditorScript.cs.txt --- ...Editor Script-NewCustomEditorScript.cs.txt | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 ScriptTemplates/81a-C# Custom Editor Script-NewCustomEditorScript.cs.txt diff --git a/ScriptTemplates/81a-C# Custom Editor Script-NewCustomEditorScript.cs.txt b/ScriptTemplates/81a-C# Custom Editor Script-NewCustomEditorScript.cs.txt new file mode 100644 index 0000000..0ccd8ad --- /dev/null +++ b/ScriptTemplates/81a-C# Custom Editor Script-NewCustomEditorScript.cs.txt @@ -0,0 +1,19 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; + +[CustomEditor(typeof (#SCRIPTNAME#))] +public class #SCRIPTNAME# : Editor { + + // Use this for initialization + void OnEnable () { + + } + + // Use this for drawing the GUI + public override void OnInspectorGUI () { + + } + +} From 0c484bc5383caa688b459d088c64ff30b0c642e1 Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Sun, 25 Jun 2017 10:32:38 +0430 Subject: [PATCH 007/231] Rename 81a-C# Custom Editor Script-NewCustomEditorScript.cs.txt to 81b-C# Custom Editor Script-NewCustomEditorScript.cs.txt --- ...t => 81b-C# Custom Editor Script-NewCustomEditorScript.cs.txt} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename ScriptTemplates/{81a-C# Custom Editor Script-NewCustomEditorScript.cs.txt => 81b-C# Custom Editor Script-NewCustomEditorScript.cs.txt} (100%) diff --git a/ScriptTemplates/81a-C# Custom Editor Script-NewCustomEditorScript.cs.txt b/ScriptTemplates/81b-C# Custom Editor Script-NewCustomEditorScript.cs.txt similarity index 100% rename from ScriptTemplates/81a-C# Custom Editor Script-NewCustomEditorScript.cs.txt rename to ScriptTemplates/81b-C# Custom Editor Script-NewCustomEditorScript.cs.txt From 7d560c2cbe2bd233a616ddd37797b42e480ccaee Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Sun, 25 Jun 2017 10:33:09 +0430 Subject: [PATCH 008/231] Create 81c-C# Interface Script-NewInterfaceScript.cs.txt --- .../81c-C# Interface Script-NewInterfaceScript.cs.txt | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 ScriptTemplates/81c-C# Interface Script-NewInterfaceScript.cs.txt diff --git a/ScriptTemplates/81c-C# Interface Script-NewInterfaceScript.cs.txt b/ScriptTemplates/81c-C# Interface Script-NewInterfaceScript.cs.txt new file mode 100644 index 0000000..47e8cbc --- /dev/null +++ b/ScriptTemplates/81c-C# Interface Script-NewInterfaceScript.cs.txt @@ -0,0 +1,9 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public interface #SCRIPTNAME# { + + void Sample (); + +} From 4258b4141be95cfa86f8a030825dfcc612b26a17 Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Sun, 25 Jun 2017 10:41:29 +0430 Subject: [PATCH 009/231] Update 81b-C# Custom Editor Script-NewCustomEditorScript.cs.txt --- .../81b-C# Custom Editor Script-NewCustomEditorScript.cs.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/ScriptTemplates/81b-C# Custom Editor Script-NewCustomEditorScript.cs.txt b/ScriptTemplates/81b-C# Custom Editor Script-NewCustomEditorScript.cs.txt index 0ccd8ad..71aee88 100644 --- a/ScriptTemplates/81b-C# Custom Editor Script-NewCustomEditorScript.cs.txt +++ b/ScriptTemplates/81b-C# Custom Editor Script-NewCustomEditorScript.cs.txt @@ -4,6 +4,7 @@ using UnityEngine; using UnityEditor; [CustomEditor(typeof (#SCRIPTNAME#))] +[CanEditMultipleObjects] public class #SCRIPTNAME# : Editor { // Use this for initialization From 67d6d9de0aac5929f15049ffbcce1020a5afe5e8 Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Sun, 25 Jun 2017 10:50:41 +0430 Subject: [PATCH 010/231] Create 81d-C# Property Drawer Script-NewPropertyDrawerScript.cs.txt --- ...ty Drawer Script-NewPropertyDrawerScript.cs.txt | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 ScriptTemplates/81d-C# Property Drawer Script-NewPropertyDrawerScript.cs.txt diff --git a/ScriptTemplates/81d-C# Property Drawer Script-NewPropertyDrawerScript.cs.txt b/ScriptTemplates/81d-C# Property Drawer Script-NewPropertyDrawerScript.cs.txt new file mode 100644 index 0000000..8877feb --- /dev/null +++ b/ScriptTemplates/81d-C# Property Drawer Script-NewPropertyDrawerScript.cs.txt @@ -0,0 +1,14 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; + +[CustomPropertyDrawer (typeof (#SCRIPTNAME#))] +public class #SCRIPTNAME# : PropertyDrawer { + + // Use this for drawing the GUI + void OnGUI (Rect position, SerializedProperty property, GUIContent label) { + + } + +} From 28e3c644047b695997b30a757edbc736492e30b2 Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Sun, 25 Jun 2017 10:51:11 +0430 Subject: [PATCH 011/231] Create 82a-Javascript Editor Window-NewEditorScript.js.txt --- ...Javascript Editor Window-NewEditorScript.js.txt | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 ScriptTemplates/82a-Javascript Editor Window-NewEditorScript.js.txt diff --git a/ScriptTemplates/82a-Javascript Editor Window-NewEditorScript.js.txt b/ScriptTemplates/82a-Javascript Editor Window-NewEditorScript.js.txt new file mode 100644 index 0000000..a0fa1bf --- /dev/null +++ b/ScriptTemplates/82a-Javascript Editor Window-NewEditorScript.js.txt @@ -0,0 +1,14 @@ +#pragma strict + +class #SCRIPTNAME# extends EditorWindow { + + @MenuItem ("Window/#SCRIPTNAME#") + static function Initialize () { + EditorWindow.GetWindow (#SCRIPTNAME#); + } + + function OnGUI () { + + } + +} From 2b19dffc6b0e55f4b21dec05d2c46e9c76d9a779 Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Sun, 25 Jun 2017 10:51:30 +0430 Subject: [PATCH 012/231] Create 82b-Javascript Custom Editor-NewCustomEditorScript.js.txt --- ...ipt Custom Editor-NewCustomEditorScript.js.txt | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 ScriptTemplates/82b-Javascript Custom Editor-NewCustomEditorScript.js.txt diff --git a/ScriptTemplates/82b-Javascript Custom Editor-NewCustomEditorScript.js.txt b/ScriptTemplates/82b-Javascript Custom Editor-NewCustomEditorScript.js.txt new file mode 100644 index 0000000..e7ec9bb --- /dev/null +++ b/ScriptTemplates/82b-Javascript Custom Editor-NewCustomEditorScript.js.txt @@ -0,0 +1,15 @@ +#pragma strict + +@CustomEditor (#SCRIPTNAME#) +@CanEditMultipleObjects +class #SCRIPTNAME# extends Editor { + + function OnEnable () { + + } + + function OnInspectorGUI () { + + } + +} From da4bee647343fe0571eb4b58f4897efcb2fe8975 Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Sun, 25 Jun 2017 10:52:16 +0430 Subject: [PATCH 013/231] Create 82c-Javascript Property Drawer-NewPropertyDrawerScript.js.txt --- ...ript Property Drawer-NewPropertyDrawerScript.js.txt | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 ScriptTemplates/82c-Javascript Property Drawer-NewPropertyDrawerScript.js.txt diff --git a/ScriptTemplates/82c-Javascript Property Drawer-NewPropertyDrawerScript.js.txt b/ScriptTemplates/82c-Javascript Property Drawer-NewPropertyDrawerScript.js.txt new file mode 100644 index 0000000..1a79b09 --- /dev/null +++ b/ScriptTemplates/82c-Javascript Property Drawer-NewPropertyDrawerScript.js.txt @@ -0,0 +1,10 @@ +#pragma strict + +@CustomPropertyDrawer (#SCRIPTNAME#) +class #SCRIPTNAME# extends PropertyDrawer { + + function OnGUI () { + + } + +} From 05143e12b1c731d29831d384ed0e0dbbceb6d34a Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Sun, 25 Jun 2017 10:54:25 +0430 Subject: [PATCH 014/231] Update README.md --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 9fae77f..1a39b83 100644 --- a/README.md +++ b/README.md @@ -16,3 +16,8 @@ And then have specific subfolders, like Shaders/Water/.. ### Feedback - Feel free to post ideas/comments in the issues section https://github.com/UnityCommunity/UnityLibrary/issues + +## License +[MIT](https://github.com/UnityCommunity/UnityLibrary/blob/master/LICENSE.md) @ [Unity Community](https://github.com/UnityCommunity/) + +Made with :heart: by [Unity Community](https://github.com/UnityCommunity/) From a471c44c5b8aac841d9083fd132812065a3a9c62 Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Sun, 25 Jun 2017 10:54:38 +0430 Subject: [PATCH 015/231] Update README.md --- ScriptTemplates/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ScriptTemplates/README.md b/ScriptTemplates/README.md index d8c9719..f1b84ee 100644 --- a/ScriptTemplates/README.md +++ b/ScriptTemplates/README.md @@ -27,6 +27,6 @@ you can find it in the file by **#SCRIPTNAME#** tag. [**More information**](https://support.unity3d.com/hc/en-us/articles/210223733-How-to-customize-Unity-script-templates) ## License -MIT @ [Unity Community](https://github.com/UnityCommunity/) +[MIT](https://github.com/UnityCommunity/UnityLibrary/blob/master/LICENSE.md) @ [Unity Community](https://github.com/UnityCommunity/) Made with :heart: by [Unity Community](https://github.com/UnityCommunity/) From 9e7773d98820309858ff2cff9179b4b9370c57de Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Sun, 25 Jun 2017 11:07:00 +0430 Subject: [PATCH 016/231] Update README.md --- README.md | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 1a39b83..d89f413 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,23 @@ -# UnityLibrary -All kinds of scripts, snippets & shaders (mainly collected from forum/answers posts) +# Unity Library +Useful scripts, snippets and shaders here it is gathered. -### Getting access +We have collected most scripts from external sources like Unity Communities (Forums, Answers) and we made it ourselves a little. + +## Content +- [Docs/](https://github.com/UnityCommunity/UnityLibrary/tree/master/Docs) : A small replacement for missing Unity documentations. +- [Scripts/](https://github.com/UnityCommunity/UnityLibrary/tree/master/Scripts) : Complete set of Unity scripts. +- [Scripts/Editor/](https://github.com/UnityCommunity/UnityLibrary/tree/master/Scripts/Editor) : Editor related scripts. +- [Shaders/](https://github.com/UnityCommunity/UnityLibrary/tree/master/Shaders) : Ready-to-use shaders. +- [ScriptTemplates/](https://github.com/UnityCommunity/UnityLibrary/tree/master/ScriptTemplates) : Contains ready-to-use script templates. + +## Join the Community Send your GitHub id to one of the below ways: -- [Unity Forums](http://forum.unity3d.com/members/mgear.22727/) -- support [at] unitycoder [dot] com -### TODO / Instructions -- (To Be Added) -- Not all code has to be working/error-free, the idea is to keep also old code here and then update to newer unity versions when needed -- Scripts/ -- Editor/ (for editor scripts) -- Shaders/ -And then have specific subfolders, like Shaders/Water/.. +- [Unity Forums](http://forum.unity3d.com/members/mgear.22727/) +- support@unitycoder.com -### Feedback -- Feel free to post ideas/comments in the issues section https://github.com/UnityCommunity/UnityLibrary/issues +## Improvements/Ideas/Feedback +Feel free to post your ideas/comments/improvements/recommendations in the issues section https://github.com/UnityCommunity/UnityLibrary/issues ## License [MIT](https://github.com/UnityCommunity/UnityLibrary/blob/master/LICENSE.md) @ [Unity Community](https://github.com/UnityCommunity/) From 6efde23112eddb5c393fbf68c72ab2c947d831cd Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Sun, 25 Jun 2017 11:10:14 +0430 Subject: [PATCH 017/231] Create README.md --- Shaders/README.md | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 Shaders/README.md diff --git a/Shaders/README.md b/Shaders/README.md new file mode 100644 index 0000000..73e20d1 --- /dev/null +++ b/Shaders/README.md @@ -0,0 +1,9 @@ +# Shaders +The one of most important things in game development is the visual experience. + +Here is a complete set of useful shaders that everyone will need. + +## License +[MIT](https://github.com/UnityCommunity/UnityLibrary/blob/master/LICENSE.md) @ [Unity Community](https://github.com/UnityCommunity/) + +Made with :heart: by [Unity Community](https://github.com/UnityCommunity/) From a26dcc3aa320a79e0f7ea212452ca4aa102011b4 Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Sun, 25 Jun 2017 11:12:15 +0430 Subject: [PATCH 018/231] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index d89f413..f0326cf 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,9 @@ Send your GitHub id to one of the below ways: ## Improvements/Ideas/Feedback Feel free to post your ideas/comments/improvements/recommendations in the issues section https://github.com/UnityCommunity/UnityLibrary/issues +## Credits +[Check out Unity Community People](https://github.com/orgs/UnityCommunity/people) + ## License [MIT](https://github.com/UnityCommunity/UnityLibrary/blob/master/LICENSE.md) @ [Unity Community](https://github.com/UnityCommunity/) From 34667bc59c40cfecb32d0f7e2ac0ce64ea66023e Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Sun, 25 Jun 2017 11:12:31 +0430 Subject: [PATCH 019/231] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f0326cf..a572815 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ Send your GitHub id to one of the below ways: Feel free to post your ideas/comments/improvements/recommendations in the issues section https://github.com/UnityCommunity/UnityLibrary/issues ## Credits -[Check out Unity Community People](https://github.com/orgs/UnityCommunity/people) +[Find out Unity Community People](https://github.com/orgs/UnityCommunity/people) ## License [MIT](https://github.com/UnityCommunity/UnityLibrary/blob/master/LICENSE.md) @ [Unity Community](https://github.com/UnityCommunity/) From 96a6770a4fb970e2dc1e9a0242f1ac7e01dbe9f2 Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Sun, 25 Jun 2017 11:17:56 +0430 Subject: [PATCH 020/231] Create README.md --- Scripts/README.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 Scripts/README.md diff --git a/Scripts/README.md b/Scripts/README.md new file mode 100644 index 0000000..7da190e --- /dev/null +++ b/Scripts/README.md @@ -0,0 +1,13 @@ +# Scripts +The game logic. the most important part of game development. + +Do you want to make a car? do you try to invent the Wheel from the beginning? no one do it. + +So we have gathered pre made ready-to-use scripts here just for you. + +If you have experienced any errors or problems, [send it to us](https://github.com/UnityCommunity/UnityLibrary/issues), we are here to help. + +## License +[MIT](https://github.com/UnityCommunity/UnityLibrary/blob/master/LICENSE.md) @ [Unity Community](https://github.com/UnityCommunity/) + +Made with :heart: by [Unity Community](https://github.com/UnityCommunity/) From 66e5cee1afb2bc884b7f976563433898805de437 Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Sun, 25 Jun 2017 11:19:55 +0430 Subject: [PATCH 021/231] Create README.md --- Scripts/Editor/README.md | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 Scripts/Editor/README.md diff --git a/Scripts/Editor/README.md b/Scripts/Editor/README.md new file mode 100644 index 0000000..bbcec7e --- /dev/null +++ b/Scripts/Editor/README.md @@ -0,0 +1,9 @@ +# Editor Scripts +Extend the Unity Editor with the power of Community. + +Experiencing errors and problems, no worry, [File them, and let us fix them](https://github.com/UnityCommunity/UnityLibrary/issues) + +## License +[MIT](https://github.com/UnityCommunity/UnityLibrary/blob/master/LICENSE.md) @ [Unity Community](https://github.com/UnityCommunity/) + +Made with :heart: by [Unity Community](https://github.com/UnityCommunity/) From d9c58a41512d894a28f8b415961936c0861240d9 Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Sun, 25 Jun 2017 11:23:13 +0430 Subject: [PATCH 022/231] Update README.md --- Docs/README.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Docs/README.md b/Docs/README.md index 7d3afde..bfccd83 100644 --- a/Docs/README.md +++ b/Docs/README.md @@ -1,6 +1,7 @@ -Idea for the Docs/ folder: Having minimum working example/snippet for common unity methods and classes +# Docs +Sometimes we see some missing, outdated or broken documentations, example at Unity official documentation, so we have collected some of them and made a good examples and documentations about them. -Because sometimes documentation is -- missing examples -- or they are broken, -- or they are not showing the most common usage (like getting world position on mouse click with 2D raycast), +## License +[MIT](https://github.com/UnityCommunity/UnityLibrary/blob/master/LICENSE.md) @ [Unity Community](https://github.com/UnityCommunity/) + +Made with :heart: by [Unity Community](https://github.com/UnityCommunity/) From d956b43f55f1513d12b807a56912f11f7d221b60 Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Sun, 25 Jun 2017 11:23:55 +0430 Subject: [PATCH 023/231] Update README.md --- Docs/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Docs/README.md b/Docs/README.md index bfccd83..20879e3 100644 --- a/Docs/README.md +++ b/Docs/README.md @@ -1,5 +1,5 @@ # Docs -Sometimes we see some missing, outdated or broken documentations, example at Unity official documentation, so we have collected some of them and made a good examples and documentations about them. +Sometimes we see some missing, outdated or broken documentations and examples at Unity official documentation Manual or Scripting API, so we have collected some of them and made a good examples and documentations about them. ## License [MIT](https://github.com/UnityCommunity/UnityLibrary/blob/master/LICENSE.md) @ [Unity Community](https://github.com/UnityCommunity/) From d044953dfc1dbb2cdf81254297fa76837066dca4 Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Sun, 25 Jun 2017 11:24:45 +0430 Subject: [PATCH 024/231] Update README.md --- Docs/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Docs/README.md b/Docs/README.md index 20879e3..45f96a5 100644 --- a/Docs/README.md +++ b/Docs/README.md @@ -1,6 +1,8 @@ # Docs Sometimes we see some missing, outdated or broken documentations and examples at Unity official documentation Manual or Scripting API, so we have collected some of them and made a good examples and documentations about them. +Do you found a missing documentation or example? [File it here and let us add it](https://github.com/UnityCommunity/UnityLibrary/issues) + ## License [MIT](https://github.com/UnityCommunity/UnityLibrary/blob/master/LICENSE.md) @ [Unity Community](https://github.com/UnityCommunity/) From dfd10f4f4dc2bd36c201357f9676f24b53a7760d Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Sun, 25 Jun 2017 11:28:28 +0430 Subject: [PATCH 025/231] Create README.md --- External/README.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 External/README.md diff --git a/External/README.md b/External/README.md new file mode 100644 index 0000000..dc15afb --- /dev/null +++ b/External/README.md @@ -0,0 +1,7 @@ +# External +External libraries, scripts and utitlities that are related to unity. + +## License +[MIT](https://github.com/UnityCommunity/UnityLibrary/blob/master/LICENSE.md) @ [Unity Community](https://github.com/UnityCommunity/) + +Made with :heart: by [Unity Community](https://github.com/UnityCommunity/) From c3451207a78e7baddb224908436d64f988388b71 Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Sun, 25 Jun 2017 11:28:41 +0430 Subject: [PATCH 026/231] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index a572815..3089932 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,7 @@ We have collected most scripts from external sources like Unity Communities (For - [Scripts/Editor/](https://github.com/UnityCommunity/UnityLibrary/tree/master/Scripts/Editor) : Editor related scripts. - [Shaders/](https://github.com/UnityCommunity/UnityLibrary/tree/master/Shaders) : Ready-to-use shaders. - [ScriptTemplates/](https://github.com/UnityCommunity/UnityLibrary/tree/master/ScriptTemplates) : Contains ready-to-use script templates. +- [External/](https://github.com/UnityCommunity/UnityLibrary/tree/master/External) : External libaries, scripts and utilities that are related to unity. ## Join the Community Send your GitHub id to one of the below ways: From e84a5718202704bcc9247aa5c97ade8408f88690 Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Sun, 25 Jun 2017 11:33:54 +0430 Subject: [PATCH 027/231] Update LICENSE.md --- LICENSE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE.md b/LICENSE.md index a8fc851..1722329 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2016 +Copyright (c) 2017 @ Unity Community Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From 454c38324beed109c9ab19b4904908a93a1b3205 Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Sun, 25 Jun 2017 11:34:09 +0430 Subject: [PATCH 028/231] Update LICENSE.md --- LICENSE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE.md b/LICENSE.md index 1722329..8864d4a 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2017 @ Unity Community +Copyright (c) 2017 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From 9f71e3e3d613621a7dbfd8239dfca9ad72af3aa0 Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Sun, 25 Jun 2017 12:02:23 +0430 Subject: [PATCH 029/231] Update CONTRIBUTING.md --- CONTRIBUTING.md | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a69a859..8a1ff44 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,6 +1,30 @@ -How Can I Contribute? +# Contributing to Unity Library -- Report Bugs, Requests or Suggestions using https://github.com/UnityCommunity/UnityLibrary/issues -- Adding Content to Wiki https://github.com/UnityCommunity/UnityLibrary/wiki -- Updating, Optimizing or Arranging/Cleaning-up existing content -- Submitting fixes or new content using Pull Request (or joining as a member and directly adding to this repository) +:+1::tada: First off, thanks for taking the time to contribute! :tada::+1: + +## Table of Contents + +[How Can I Contribute?](#how-can-i-contribute) + - [Reporting Bugs](#reporting-bugs) + - [Adding Content to Wiki](#adding-content-to-wiki) + - [Making Pull Requests](#making-pull-requests) + +## How Can I Contribute? + +### Reporting Bugs + +This section guides you through submitting a bug report for Atom. Following these guidelines helps maintainers and the community understand your report :pencil:, reproduce the behavior :computer: :computer:, and find related reports :mag_right:. + +Always add a meaningful title to your bug or issue. + +> **Note**: If you find a **Closed** issue that seems like it is the same thing that you're experiencing, open a new issue and include a link to the original issue in the body of your new one. + +If you have experienced any problems with the scripts and content that Unity Library provides, you can submit them to us at [Unity Library Issues Section](https://github.com/UnityCommunity/UnityLibrary/issues) + +### Adding Content to Wiki + +Also you can add content to [Unity Library Wiki](https://github.com/UnityCommunity/UnityLibrary/wiki) but always provide a full and complete content not a partial and error container. + +### Making Pull Requests + +You can submit your [Pull Requests](https://github.com/UnityCommunity/UnityLibrary/pulls) to us and we will merge them when they are ready. always add a meaningful pull request title. From 39bcfc083121c52ef7ad7f9584b7f54e0fd600d3 Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Sun, 25 Jun 2017 12:02:54 +0430 Subject: [PATCH 030/231] Update CONTRIBUTING.md --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8a1ff44..dcaeb87 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -13,7 +13,7 @@ ### Reporting Bugs -This section guides you through submitting a bug report for Atom. Following these guidelines helps maintainers and the community understand your report :pencil:, reproduce the behavior :computer: :computer:, and find related reports :mag_right:. +This section guides you through submitting a bug report for Unity Library. Following these guidelines helps maintainers and the community understand your report :pencil:, reproduce the behavior :computer: :computer:, and find related reports :mag_right:. Always add a meaningful title to your bug or issue. From 584fd84a3e85ef78fe6f9d99432cafa77050b21f Mon Sep 17 00:00:00 2001 From: mika Date: Sun, 25 Jun 2017 23:13:40 +0800 Subject: [PATCH 031/231] email edit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3089932..f0ddec6 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ We have collected most scripts from external sources like Unity Communities (For Send your GitHub id to one of the below ways: - [Unity Forums](http://forum.unity3d.com/members/mgear.22727/) -- support@unitycoder.com +- support [at] unitycoder [.] com ## Improvements/Ideas/Feedback Feel free to post your ideas/comments/improvements/recommendations in the issues section https://github.com/UnityCommunity/UnityLibrary/issues From bb581c0fc78dbc242b3fabfb6e5613912b83f6a8 Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Fri, 30 Jun 2017 17:37:31 +0430 Subject: [PATCH 032/231] Add Resources --- README.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/README.md b/README.md index f0ddec6..c7f9750 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,20 @@ We have collected most scripts from external sources like Unity Communities (For - [ScriptTemplates/](https://github.com/UnityCommunity/UnityLibrary/tree/master/ScriptTemplates) : Contains ready-to-use script templates. - [External/](https://github.com/UnityCommunity/UnityLibrary/tree/master/External) : External libaries, scripts and utilities that are related to unity. +## Resources + +Awesome and Useful Unity Resources: + +[Awesome Unity](https://github.com/RyanNielson/awesome-unity) + +[Unity Script Collection](https://github.com/michidk/Unity-Script-Collection) + +[Unity Design Patterns](https://github.com/Naphier/unity-design-patterns) + +[GameDev Resources](https://github.com/Kavex/GameDev-Resources) + +[Games On GitHub](https://github.com/leereilly/games/) + ## Join the Community Send your GitHub id to one of the below ways: From e00bb3c4d81433529884947b4ccc7ccfe6f51af5 Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Fri, 30 Jun 2017 17:50:55 +0430 Subject: [PATCH 033/231] Add Emojies --- README.md | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index c7f9750..eec11f8 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,11 @@ # Unity Library + Useful scripts, snippets and shaders here it is gathered. We have collected most scripts from external sources like Unity Communities (Forums, Answers) and we made it ourselves a little. ## Content + - [Docs/](https://github.com/UnityCommunity/UnityLibrary/tree/master/Docs) : A small replacement for missing Unity documentations. - [Scripts/](https://github.com/UnityCommunity/UnityLibrary/tree/master/Scripts) : Complete set of Unity scripts. - [Scripts/Editor/](https://github.com/UnityCommunity/UnityLibrary/tree/master/Scripts/Editor) : Editor related scripts. @@ -15,29 +17,33 @@ We have collected most scripts from external sources like Unity Communities (For Awesome and Useful Unity Resources: -[Awesome Unity](https://github.com/RyanNielson/awesome-unity) +[:sparkles: Awesome Unity](https://github.com/RyanNielson/awesome-unity) -[Unity Script Collection](https://github.com/michidk/Unity-Script-Collection) +[:clipboard: Unity Script Collection](https://github.com/michidk/Unity-Script-Collection) -[Unity Design Patterns](https://github.com/Naphier/unity-design-patterns) +[:book: Unity Design Patterns](https://github.com/Naphier/unity-design-patterns) -[GameDev Resources](https://github.com/Kavex/GameDev-Resources) +[:scroll: GameDev Resources](https://github.com/Kavex/GameDev-Resources) -[Games On GitHub](https://github.com/leereilly/games/) +[:video_game: Games On GitHub](https://github.com/leereilly/games/) ## Join the Community + Send your GitHub id to one of the below ways: - [Unity Forums](http://forum.unity3d.com/members/mgear.22727/) - support [at] unitycoder [.] com ## Improvements/Ideas/Feedback + Feel free to post your ideas/comments/improvements/recommendations in the issues section https://github.com/UnityCommunity/UnityLibrary/issues ## Credits + [Find out Unity Community People](https://github.com/orgs/UnityCommunity/people) ## License + [MIT](https://github.com/UnityCommunity/UnityLibrary/blob/master/LICENSE.md) @ [Unity Community](https://github.com/UnityCommunity/) Made with :heart: by [Unity Community](https://github.com/UnityCommunity/) From 8ecf1733f30dfcdad1b7dc84533998523cfd2793 Mon Sep 17 00:00:00 2001 From: lootheo Date: Fri, 30 Jun 2017 12:40:30 -0500 Subject: [PATCH 034/231] Added Alpha Blend Masked Shader --- Shaders/Effects/AlphaBlendMasked.shader | 88 +++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 Shaders/Effects/AlphaBlendMasked.shader diff --git a/Shaders/Effects/AlphaBlendMasked.shader b/Shaders/Effects/AlphaBlendMasked.shader new file mode 100644 index 0000000..302fb84 --- /dev/null +++ b/Shaders/Effects/AlphaBlendMasked.shader @@ -0,0 +1,88 @@ +//Only Renders particles that pass through the object, great for fire or mystic portals. +//Source: https://www.patreon.com/minionsart +Shader "Particles/Alpha Blended Masked" { + Properties{ + _TintColor("Tint Color", Color) = (0.5,0.5,0.5,0.5) + _MainTex("Particle Texture", 2D) = "white" {} + _InvFade("Soft Particles Factor", Range(0.01,3.0)) = 1.0 + } + + Category{ + Tags{ "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" "PreviewType" = "Plane" } + Blend SrcAlpha OneMinusSrcAlpha + ColorMask RGB + ZTest Greater + Cull Off Lighting Off ZWrite Off + + SubShader{ + Pass{ + + CGPROGRAM +#pragma vertex vert +#pragma fragment frag +#pragma target 2.0 +#pragma multi_compile_particles +#pragma multi_compile_fog + +#include "UnityCG.cginc" + + sampler2D _MainTex; + fixed4 _TintColor; + + struct appdata_t { + float4 vertex : POSITION; + fixed4 color : COLOR; + float2 texcoord : TEXCOORD0; + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct v2f { + float4 vertex : SV_POSITION; + fixed4 color : COLOR; + float2 texcoord : TEXCOORD0; + UNITY_FOG_COORDS(1) +#ifdef SOFTPARTICLES_ON + float4 projPos : TEXCOORD2; +#endif + UNITY_VERTEX_OUTPUT_STEREO + }; + + float4 _MainTex_ST; + + v2f vert(appdata_t v) + { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + o.vertex = UnityObjectToClipPos(v.vertex); +#ifdef SOFTPARTICLES_ON + o.projPos = ComputeScreenPos(o.vertex); + COMPUTE_EYEDEPTH(o.projPos.z); +#endif + o.color = v.color * _TintColor; + o.texcoord = TRANSFORM_TEX(v.texcoord,_MainTex); + UNITY_TRANSFER_FOG(o,o.vertex); + return o; + } + + sampler2D_float _CameraDepthTexture; + float _InvFade; + + fixed4 frag(v2f i) : SV_Target + { +#ifdef SOFTPARTICLES_ON + float sceneZ = LinearEyeDepth(SAMPLE_DEPTH_TEXTURE_PROJ(_CameraDepthTexture, UNITY_PROJ_COORD(i.projPos))); + float partZ = i.projPos.z; + float fade = saturate(_InvFade * (sceneZ - partZ)); + i.color.a *= fade; +#endif + + fixed4 col = 2.0f * i.color * tex2D(_MainTex, i.texcoord); + UNITY_APPLY_FOG(i.fogCoord, col); + return col; + } + ENDCG + } + } + } +} \ No newline at end of file From f0dac0a842d656c7bfef1e8784b890b264a6df7a Mon Sep 17 00:00:00 2001 From: lootheo Date: Fri, 30 Jun 2017 12:42:29 -0500 Subject: [PATCH 035/231] +ToonIce Shader --- Shaders/Effects/ToonIce.shader | 63 ++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 Shaders/Effects/ToonIce.shader diff --git a/Shaders/Effects/ToonIce.shader b/Shaders/Effects/ToonIce.shader new file mode 100644 index 0000000..2345639 --- /dev/null +++ b/Shaders/Effects/ToonIce.shader @@ -0,0 +1,63 @@ +Shader "Toon/Ice" { + Properties { + _Color ("Main Color", Color) = (0.5,0.5,0.5,1) + _Ramp ("Toon Ramp (RGB)", 2D) = "gray" {} + _BottomColor("Bottom Color", Color) = (0.23,0,0.95,1) + _RimBrightness("Rim Brightness", Range(3,4)) = 3.5 + _Alpha("Transparency", Range(0,1)) = 0.5 + } + + SubShader { + + Tags{ "Queue" = "Transparent" "RenderType" = "Transparent" } + LOD 200 + Blend SrcAlpha OneMinusSrcAlpha +CGPROGRAM +//#pragma surface surf ToonRamp +#pragma surface surf Lambert alpha + +sampler2D _Ramp; + +// custom lighting function that uses a texture ramp based +// on angle between light direction and normal +#pragma lighting ToonRamp exclude_path:prepass +inline half4 LightingToonRamp (SurfaceOutput s, half3 lightDir, half atten) +{ + #ifndef USING_DIRECTIONAL_LIGHT + lightDir = normalize(lightDir); + #endif + + half d = dot (s.Normal, lightDir)*0.5 + 0.5; + half3 ramp = tex2D (_Ramp, float2(d,d)).rgb; + + half4 c; + c.rgb = s.Albedo * _LightColor0.rgb * ramp * (atten * 2); + c.a = 0; + return c; +} + + +float4 _Color; +float4 _BottomColor; +float _RimBrightness; +float _Alpha; +struct Input { + float3 worldPos; + float3 viewDir; +}; + +void surf (Input IN, inout SurfaceOutput o) { + float3 localPos = saturate(IN.worldPos - mul(unity_ObjectToWorld, float4(0, 0, 0, 1)).xyz); + float softRim = 1.0 - saturate(dot(normalize(IN.viewDir), o.Normal)); + float hardRim = round(softRim); + o.Emission = _Color* lerp(hardRim, softRim, localPos.y) * (_RimBrightness*localPos.y); + float InnerRim = 1.5 + saturate(dot(normalize(IN.viewDir), o.Normal)); + o.Albedo = _Color*pow(InnerRim, 0.7) * lerp(_BottomColor, _Color, localPos.y); + o.Alpha = _Alpha; +} +ENDCG + + } + + Fallback "Diffuse" +} From 80ec6cd13c72f3d2242c0cc8f82ad71bdbe60472 Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Sun, 2 Jul 2017 09:38:46 +0430 Subject: [PATCH 036/231] Add Contribution --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index eec11f8..2a08cb3 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,10 @@ Awesome and Useful Unity Resources: [:video_game: Games On GitHub](https://github.com/leereilly/games/) +## Contribution + +[Read our Contribution Guidelines](https://github.com/UnityCommunity/UnityLibrary/blob/master/CONTRIBUTING.md) + ## Join the Community Send your GitHub id to one of the below ways: From dd0acb623c1ea5cc489d123c00124fc533d5ab4f Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Tue, 4 Jul 2017 12:57:19 +0430 Subject: [PATCH 037/231] Create CODE_OF_CONDUCT.md --- CODE_OF_CONDUCT.md | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 CODE_OF_CONDUCT.md diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..bdf38c0 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,46 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at hasanbayat1393@gmail.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ From ce53c050fcb2ec3dab092e8e0bf8530155664cc5 Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Tue, 4 Jul 2017 13:02:44 +0430 Subject: [PATCH 038/231] Add New Email Address --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 2a08cb3..a115752 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,7 @@ Send your GitHub id to one of the below ways: - [Unity Forums](http://forum.unity3d.com/members/mgear.22727/) - support [at] unitycoder [.] com +- hasanbayat1393@gmail.com ## Improvements/Ideas/Feedback From 8fa111dde74c1003d2464f99db043617c794c8e5 Mon Sep 17 00:00:00 2001 From: Sacristan Date: Tue, 4 Jul 2017 16:30:35 +0300 Subject: [PATCH 039/231] Added Canvas scaler utility --- .../UI/CanvasScalerUtil/CanvasScalerUtil.cs | 30 +++++++++++++ .../CanvasScalerUtil/CanvasScalerUtil.cs.meta | 12 +++++ .../Editor/UI/CanvasScalerUtil/Editor.meta | 9 ++++ .../Editor/CanvasScalerUtilEditor.cs | 45 +++++++++++++++++++ .../Editor/CanvasScalerUtilEditor.cs.meta | 12 +++++ 5 files changed, 108 insertions(+) create mode 100644 Scripts/Editor/UI/CanvasScalerUtil/CanvasScalerUtil.cs create mode 100644 Scripts/Editor/UI/CanvasScalerUtil/CanvasScalerUtil.cs.meta create mode 100644 Scripts/Editor/UI/CanvasScalerUtil/Editor.meta create mode 100644 Scripts/Editor/UI/CanvasScalerUtil/Editor/CanvasScalerUtilEditor.cs create mode 100644 Scripts/Editor/UI/CanvasScalerUtil/Editor/CanvasScalerUtilEditor.cs.meta diff --git a/Scripts/Editor/UI/CanvasScalerUtil/CanvasScalerUtil.cs b/Scripts/Editor/UI/CanvasScalerUtil/CanvasScalerUtil.cs new file mode 100644 index 0000000..a5a890d --- /dev/null +++ b/Scripts/Editor/UI/CanvasScalerUtil/CanvasScalerUtil.cs @@ -0,0 +1,30 @@ +using UnityEngine; + +/// +/// Author: https://github.com/Sacristan +/// Script to hastily create correct canvas scales. Logic handled at editor's side +/// +[RequireComponent(typeof(Canvas))] +public class CanvasScalerUtil : MonoBehaviour +{ + [SerializeField] + private uint canvasWidth = 800; + + [SerializeField] + private uint canvasHeight = 600; + + [SerializeField] + private uint canvasWorldSizeInMeters = 1; + + public uint CanvasWidth { get { return canvasWidth; } } + public uint CanvasHeight { get { return canvasHeight; } } + public uint CanvasWorldSizeInMeters { get { return canvasWorldSizeInMeters; } } + + #region MonoBehaviour + private void Awake() + { + Debug.Log("CanvasScalerUtil has nothing to do with realtime logic"); + Destroy(this); + } + #endregion +} diff --git a/Scripts/Editor/UI/CanvasScalerUtil/CanvasScalerUtil.cs.meta b/Scripts/Editor/UI/CanvasScalerUtil/CanvasScalerUtil.cs.meta new file mode 100644 index 0000000..109bcdc --- /dev/null +++ b/Scripts/Editor/UI/CanvasScalerUtil/CanvasScalerUtil.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: bdd93193cc75c9d4f8fc66423ec514b9 +timeCreated: 1499173346 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Scripts/Editor/UI/CanvasScalerUtil/Editor.meta b/Scripts/Editor/UI/CanvasScalerUtil/Editor.meta new file mode 100644 index 0000000..73f3ef5 --- /dev/null +++ b/Scripts/Editor/UI/CanvasScalerUtil/Editor.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: b598d8a9158f9fe4080b54101474f951 +folderAsset: yes +timeCreated: 1499174027 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Scripts/Editor/UI/CanvasScalerUtil/Editor/CanvasScalerUtilEditor.cs b/Scripts/Editor/UI/CanvasScalerUtil/Editor/CanvasScalerUtilEditor.cs new file mode 100644 index 0000000..e7fe204 --- /dev/null +++ b/Scripts/Editor/UI/CanvasScalerUtil/Editor/CanvasScalerUtilEditor.cs @@ -0,0 +1,45 @@ +using UnityEngine; +using UnityEditor; + +/// +/// Author: Girts Kesteris 2017 +/// Script to hastily create correct canvas scales. Logic handled at editor's side +/// +[CustomEditor(typeof(CanvasScalerUtil))] +public class CanvasScalerUtilEditor : Editor +{ + CanvasScalerUtil t; + + private void OnEnable() + { + t = (CanvasScalerUtil) target; + } + + public override void OnInspectorGUI() + { + base.OnInspectorGUI(); + + if (GUILayout.Button("Scale Canvas")) ScaleCanvas(); + + } + + private void ScaleCanvas() + { + Canvas canvas = t.GetComponent(); + RectTransform rectTransform = t.GetComponent(); + + Vector2 sizeDelta = new Vector2(t.CanvasWidth, t.CanvasHeight); + Vector3 scale = t.CanvasWorldSizeInMeters / (float) t.CanvasWidth * Vector3.one; + + if (canvas.renderMode != RenderMode.WorldSpace) + { + Debug.Log("CanvasScalerUtil: Swiched to WorldSpace Render Mode from " + canvas.renderMode); + canvas.renderMode = RenderMode.WorldSpace; + } + + Debug.LogFormat("CanvasScalerUtil: calculated sizeDelta: {0} scale: {1}", sizeDelta, scale); + + rectTransform.sizeDelta = sizeDelta; + rectTransform.localScale = scale; + } +} diff --git a/Scripts/Editor/UI/CanvasScalerUtil/Editor/CanvasScalerUtilEditor.cs.meta b/Scripts/Editor/UI/CanvasScalerUtil/Editor/CanvasScalerUtilEditor.cs.meta new file mode 100644 index 0000000..d9ac9c7 --- /dev/null +++ b/Scripts/Editor/UI/CanvasScalerUtil/Editor/CanvasScalerUtilEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: f46d15874e9dfbb4882b301fb5dd1160 +timeCreated: 1499174035 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From a957c5f42f914fd3da5eeb01a31a568d533ee0af Mon Sep 17 00:00:00 2001 From: Sacristan Date: Tue, 4 Jul 2017 16:32:24 +0300 Subject: [PATCH 040/231] added few unlit shaders --- Shaders/Unlit/UnlitTransparentColor.shader | 52 ++++++++++ .../UnlitTransparentColorGradient.shader | 95 +++++++++++++++++++ 2 files changed, 147 insertions(+) create mode 100644 Shaders/Unlit/UnlitTransparentColor.shader create mode 100644 Shaders/Unlit/UnlitTransparentColorGradient.shader diff --git a/Shaders/Unlit/UnlitTransparentColor.shader b/Shaders/Unlit/UnlitTransparentColor.shader new file mode 100644 index 0000000..8ba11af --- /dev/null +++ b/Shaders/Unlit/UnlitTransparentColor.shader @@ -0,0 +1,52 @@ +Shader "Custom/Unlit/Transparent Color" { + Properties{ + _Color("Color Tint", Color) = (1,1,1,1) + _MainTex("Base (RGB) Trans (A)", 2D) = "white" {} + } + + SubShader{ + Tags{ "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" } + LOD 100 + + ZWrite Off + Blend SrcAlpha OneMinusSrcAlpha + + Pass{ + CGPROGRAM +#pragma vertex vert +#pragma fragment frag + +#include "UnityCG.cginc" + + struct appdata_t { + float4 vertex : POSITION; + float2 texcoord : TEXCOORD0; + }; + + struct v2f { + float4 vertex : SV_POSITION; + half2 texcoord : TEXCOORD0; + }; + + sampler2D _MainTex; + float4 _MainTex_ST; + fixed4 _Color; + + v2f vert(appdata_t v) + { + v2f o; + o.vertex = UnityObjectToClipPos(v.vertex); + o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex); + return o; + } + + fixed4 frag(v2f i) : SV_Target + { + fixed4 col = tex2D(_MainTex, i.texcoord) * _Color; + return col; + } + ENDCG + } + } + +} \ No newline at end of file diff --git a/Shaders/Unlit/UnlitTransparentColorGradient.shader b/Shaders/Unlit/UnlitTransparentColorGradient.shader new file mode 100644 index 0000000..e3df762 --- /dev/null +++ b/Shaders/Unlit/UnlitTransparentColorGradient.shader @@ -0,0 +1,95 @@ +Shader "Custom/Unlit/Transparent Color Gradient" { + Properties{ + _MainTex("Base (RGB) Trans (A)", 2D) = "white" { } + _Color("Color1", Color) = (1.000000,1.000000,1.000000,1.000000) + _Color2("Color2", Color) = (1.000000,1.000000,1.000000,1.000000) + } + + SubShader{ + LOD 100 + Tags{ "QUEUE" = "Transparent" "IGNOREPROJECTOR" = "true" "RenderType" = "Transparent" } + Pass{ + Tags{ "QUEUE" = "Transparent" "IGNOREPROJECTOR" = "true" "RenderType" = "Transparent" } + Blend SrcAlpha OneMinusSrcAlpha + + CGPROGRAM +#pragma vertex vert +#pragma fragment frag +#pragma target 2.0 +#include "UnityCG.cginc" +#pragma multi_compile_fog +#define USING_FOG (defined(FOG_LINEAR) || defined(FOG_EXP) || defined(FOG_EXP2)) + + // uniforms + float4 _MainTex_ST; + + // vertex shader input data + struct appdata { + float3 pos : POSITION; + float3 uv0 : TEXCOORD0; + }; + + // vertex-to-fragment interpolators + struct v2f { + fixed4 color : COLOR0; + float2 uv0 : TEXCOORD0; +#if USING_FOG + fixed fog : TEXCOORD1; +#endif + float4 pos : SV_POSITION; + float4 screenPos: TEXCOORD2; + }; + + // vertex shader + v2f vert(appdata IN) { + v2f o; + half4 color = half4(0,0,0,1.1); + float3 eyePos = mul(UNITY_MATRIX_MV, float4(IN.pos,1)).xyz; + half3 viewDir = 0.0; + o.color = saturate(color); + // compute texture coordinates + o.uv0 = IN.uv0.xy * _MainTex_ST.xy + _MainTex_ST.zw; + // fog +#if USING_FOG + float fogCoord = length(eyePos.xyz); // radial fog distance + UNITY_CALC_FOG_FACTOR(fogCoord); + o.fog = saturate(unityFogFactor); +#endif + // transform position + o.pos = UnityObjectToClipPos(IN.pos); + o.screenPos = ComputeScreenPos(o.pos); + return o; + } + + // textures + sampler2D _MainTex; + fixed4 _Color; + fixed4 _Color2; + + // fragment shader + fixed4 frag(v2f IN) : SV_Target{ + fixed4 col; + fixed4 tex, tmp0, tmp1, tmp2; + // SetTexture #0 + tex = tex2D(_MainTex, IN.uv0.xy); + + float2 screenPosition = (IN.screenPos.xy / IN.screenPos.w); + + //float2 screenUV = IN.screenPos.xy / IN.screenPos.w; + fixed4 color = lerp(_Color, _Color2, screenPosition.x); + + col.rgb = tex * color; + col.a = tex.a * color.a; + // fog +#if USING_FOG + col.rgb = lerp(unity_FogColor.rgb, col.rgb, IN.fog); +#endif + return col; + } + + // texenvs + //! TexEnv0: 01010102 01050106 [_MainTex] [_Color] + ENDCG + } + } +} \ No newline at end of file From b1b394e2039d0a42c37c48aecc0dd2672273c95b Mon Sep 17 00:00:00 2001 From: Sacristan Date: Tue, 4 Jul 2017 16:34:20 +0300 Subject: [PATCH 041/231] added few effect shaders --- Shaders/Effects/Glow.shader | 117 +++++++++++++++++++++++++++++++ Shaders/Effects/Highlight.shader | 13 ++++ 2 files changed, 130 insertions(+) create mode 100644 Shaders/Effects/Glow.shader create mode 100644 Shaders/Effects/Highlight.shader diff --git a/Shaders/Effects/Glow.shader b/Shaders/Effects/Glow.shader new file mode 100644 index 0000000..775b7d2 --- /dev/null +++ b/Shaders/Effects/Glow.shader @@ -0,0 +1,117 @@ +Shader "Custom/Glow" { + + + + Properties { + + + + _Color ("Color", Color) = (1,1,1,1) + + + + } + + + + SubShader { + + + + Tags { "RenderType"="Transparent" } + + + + LOD 200 + + + + ZTest Always + + + + Cull Off + + + + + + + + + + + + CGPROGRAM + + + + #pragma surface surf Lambert decal:add + + + + + + + + float4 _Color; + + + + + + + + struct Input { + + + + float3 viewDir; + + + + float3 worldNormal; + + + + }; + + + + + + + + void surf (Input IN, inout SurfaceOutput o) { + + + + o.Alpha = _Color.a * pow(abs(dot(normalize(IN.viewDir), + + + + normalize(IN.worldNormal))),4.0); + + + + o.Emission = _Color.rgb * o.Alpha; + + + + } + + + + ENDCG + + + + } + + + + FallBack "Diffuse" + + + +} diff --git a/Shaders/Effects/Highlight.shader b/Shaders/Effects/Highlight.shader new file mode 100644 index 0000000..cbc20a7 --- /dev/null +++ b/Shaders/Effects/Highlight.shader @@ -0,0 +1,13 @@ +Shader "Custom/Highlight" { +Properties { + _Color ("Main Color", Color) = (1,1,1,1) +} +SubShader { + Pass { + ZWrite Off + Offset -1, -1 + Blend SrcAlpha OneMinusSrcAlpha + Color [_Color] + } +} +} From 8192431f3d77d055f73c5fa1fc304fc326d13111 Mon Sep 17 00:00:00 2001 From: Sacristan Date: Tue, 4 Jul 2017 16:35:39 +0300 Subject: [PATCH 042/231] added depth mask shader --- Shaders/Mask/DepthMask.shader | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 Shaders/Mask/DepthMask.shader diff --git a/Shaders/Mask/DepthMask.shader b/Shaders/Mask/DepthMask.shader new file mode 100644 index 0000000..f6294f2 --- /dev/null +++ b/Shaders/Mask/DepthMask.shader @@ -0,0 +1,11 @@ +Shader "Custom/Mask/Depth" { + + SubShader{ + Tags{ "Queue" = "Geometry+10" } + + ColorMask 0 + ZWrite On + + Pass{} + } +} \ No newline at end of file From 6284cc80ce2c94c98f5e08917f51c632e3c44d67 Mon Sep 17 00:00:00 2001 From: Sacristan Date: Tue, 4 Jul 2017 16:58:40 +0300 Subject: [PATCH 043/231] fixed issue with canvas scaler not accepting float in meter field --- Scripts/Editor/UI/CanvasScalerUtil/CanvasScalerUtil.cs | 4 ++-- .../UI/CanvasScalerUtil/Editor/CanvasScalerUtilEditor.cs | 4 +--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/Scripts/Editor/UI/CanvasScalerUtil/CanvasScalerUtil.cs b/Scripts/Editor/UI/CanvasScalerUtil/CanvasScalerUtil.cs index a5a890d..c4abb0b 100644 --- a/Scripts/Editor/UI/CanvasScalerUtil/CanvasScalerUtil.cs +++ b/Scripts/Editor/UI/CanvasScalerUtil/CanvasScalerUtil.cs @@ -14,11 +14,11 @@ public class CanvasScalerUtil : MonoBehaviour private uint canvasHeight = 600; [SerializeField] - private uint canvasWorldSizeInMeters = 1; + private float canvasWorldSizeInMeters = 1; public uint CanvasWidth { get { return canvasWidth; } } public uint CanvasHeight { get { return canvasHeight; } } - public uint CanvasWorldSizeInMeters { get { return canvasWorldSizeInMeters; } } + public float CanvasWorldSizeInMeters { get { return canvasWorldSizeInMeters; } } #region MonoBehaviour private void Awake() diff --git a/Scripts/Editor/UI/CanvasScalerUtil/Editor/CanvasScalerUtilEditor.cs b/Scripts/Editor/UI/CanvasScalerUtil/Editor/CanvasScalerUtilEditor.cs index e7fe204..ff6f8e1 100644 --- a/Scripts/Editor/UI/CanvasScalerUtil/Editor/CanvasScalerUtilEditor.cs +++ b/Scripts/Editor/UI/CanvasScalerUtil/Editor/CanvasScalerUtilEditor.cs @@ -18,9 +18,7 @@ private void OnEnable() public override void OnInspectorGUI() { base.OnInspectorGUI(); - if (GUILayout.Button("Scale Canvas")) ScaleCanvas(); - } private void ScaleCanvas() @@ -29,7 +27,7 @@ private void ScaleCanvas() RectTransform rectTransform = t.GetComponent(); Vector2 sizeDelta = new Vector2(t.CanvasWidth, t.CanvasHeight); - Vector3 scale = t.CanvasWorldSizeInMeters / (float) t.CanvasWidth * Vector3.one; + Vector3 scale = t.CanvasWorldSizeInMeters / t.CanvasWidth * Vector3.one; if (canvas.renderMode != RenderMode.WorldSpace) { From 141750e0fe4b9031f1a86fe890c5c82b3abcd664 Mon Sep 17 00:00:00 2001 From: Sacristan Date: Tue, 4 Jul 2017 16:59:43 +0300 Subject: [PATCH 044/231] added grid generator --- .../Editor/GridGeneratorEditor.cs | 64 +++++++++++++++++++ Scripts/Editor/GridGenerator/GridGenerator.cs | 22 +++++++ 2 files changed, 86 insertions(+) create mode 100644 Scripts/Editor/GridGenerator/Editor/GridGeneratorEditor.cs create mode 100644 Scripts/Editor/GridGenerator/GridGenerator.cs diff --git a/Scripts/Editor/GridGenerator/Editor/GridGeneratorEditor.cs b/Scripts/Editor/GridGenerator/Editor/GridGeneratorEditor.cs new file mode 100644 index 0000000..cbe23e7 --- /dev/null +++ b/Scripts/Editor/GridGenerator/Editor/GridGeneratorEditor.cs @@ -0,0 +1,64 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; +using UnityEditor.SceneManagement; +using System.Linq; + +[CustomEditor(typeof(GridGenerator))] +public class GridGeneratorEditor : Editor +{ + GridGenerator t; + + private void OnEnable() + { + t = (GridGenerator) target; + } + + public override void OnInspectorGUI() + { + base.OnInspectorGUI(); + + if (GUILayout.Button("Cleanup")) + { + CleanUp(); + } + + if (GUILayout.Button("Generate Grid")) + { + CleanUp(); + GenerateGrid(); + } + } + + private void CleanUp() + { + List tempList = t.transform.Cast().ToList(); + tempList.ForEach(x => DestroyImmediate(x.gameObject)); + } + + private void GenerateGrid() + { + for (int x = 0; x < t.SizeX; x++) + { + for (int y = 0; y < t.SizeY; y++) + { + Vector3 localOffset = new Vector3( + t.Offset.x * x, + 0, + t.Offset.y * y + ); + + GameObject spawnedObject = Instantiate(t.PrefabToPlace); + + spawnedObject.transform.SetParent(t.transform); + spawnedObject.transform.localPosition = localOffset; + + spawnedObject.name = string.Format("{0} ({1},{2})", t.PrefabToPlace.name, x, y); + } + } + + EditorSceneManager.MarkSceneDirty(EditorSceneManager.GetActiveScene()); + } + +} diff --git a/Scripts/Editor/GridGenerator/GridGenerator.cs b/Scripts/Editor/GridGenerator/GridGenerator.cs new file mode 100644 index 0000000..9dd3697 --- /dev/null +++ b/Scripts/Editor/GridGenerator/GridGenerator.cs @@ -0,0 +1,22 @@ +using UnityEngine; + +public class GridGenerator : MonoBehaviour +{ + [SerializeField] + private GameObject prefabToPlace; + + [SerializeField] + private uint sizeX = 2; + + [SerializeField] + private uint sizeY = 2; + + [SerializeField] + private Vector2 offset = Vector2.one; + + public GameObject PrefabToPlace { get { return prefabToPlace; } } + public Vector2 Offset { get { return offset; } } + + public uint SizeX { get { return sizeX; } } + public uint SizeY { get { return sizeY; } } +} From 1359926234882c73f02f0734129af5a4938dacb7 Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Thu, 6 Jul 2017 14:17:43 +0430 Subject: [PATCH 045/231] Fix Issues Link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a115752..701ce4e 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ Send your GitHub id to one of the below ways: ## Improvements/Ideas/Feedback -Feel free to post your ideas/comments/improvements/recommendations in the issues section https://github.com/UnityCommunity/UnityLibrary/issues +Feel free to [Post your ideas/comments/improvements/recommendations](https://github.com/UnityCommunity/UnityLibrary/issues) ## Credits From 2542c5cd395bb418240dc5c84f08ca0cf32d7c03 Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Fri, 7 Jul 2017 17:01:46 +0430 Subject: [PATCH 046/231] Add Getting Started --- README.md | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 701ce4e..2b42aa3 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,27 @@ # Unity Library -Useful scripts, snippets and shaders here it is gathered. +:tada: Welcome to Unity Library :tada: + +Useful scripts, snippets and shaders here it is gathered for free. We have collected most scripts from external sources like Unity Communities (Forums, Answers) and we made it ourselves a little. +## Getting Started + +This repository contains all kind of utilities for Unity from scripts to shaders. + +You can [browse this repository](#content) and find your desired utility or you can [clone this repository](https://help.github.com/articles/cloning-a-repository/) and browse the files: + +```bash +git clone https://github.com/UnityCommunity/UnityLibrary.git +``` + +or you can find useful stuff by [browsing awesome resources in the below](#resources). + +[:sparkles: Contribution is Welcome](#contribution) + +[:fire: Join the Community](#join-the-community) + ## Content - [Docs/](https://github.com/UnityCommunity/UnityLibrary/tree/master/Docs) : A small replacement for missing Unity documentations. From 530189ed3d995106ae8733fc6707a22d39ff7f36 Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Sat, 8 Jul 2017 14:21:26 +0430 Subject: [PATCH 047/231] Update README.md --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 2b42aa3..4d9afb8 100644 --- a/README.md +++ b/README.md @@ -47,23 +47,23 @@ Awesome and Useful Unity Resources: ## Contribution -[Read our Contribution Guidelines](https://github.com/UnityCommunity/UnityLibrary/blob/master/CONTRIBUTING.md) +[:closed_book: Read our Contribution Guidelines](https://github.com/UnityCommunity/UnityLibrary/blob/master/CONTRIBUTING.md) ## Join the Community Send your GitHub id to one of the below ways: -- [Unity Forums](http://forum.unity3d.com/members/mgear.22727/) +- [:speech_balloon: Unity Forums](http://forum.unity3d.com/members/mgear.22727/) - support [at] unitycoder [.] com -- hasanbayat1393@gmail.com +- [:e-mail: hasanbayat1393@gmail.com](mailto:hasanbayat1393@gmail.com) ## Improvements/Ideas/Feedback -Feel free to [Post your ideas/comments/improvements/recommendations](https://github.com/UnityCommunity/UnityLibrary/issues) +Feel free to [:postbox: Post your ideas/comments/improvements/recommendations](https://github.com/UnityCommunity/UnityLibrary/issues) ## Credits -[Find out Unity Community People](https://github.com/orgs/UnityCommunity/people) +[:mag: Find out Unity Community People](https://github.com/orgs/UnityCommunity/people) ## License From 75c27882923d8828bf59b38ebf6947dfb280038a Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Sat, 8 Jul 2017 14:28:08 +0430 Subject: [PATCH 048/231] Update CONTRIBUTING.md --- CONTRIBUTING.md | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index dcaeb87..f1f6205 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -13,18 +13,28 @@ ### Reporting Bugs -This section guides you through submitting a bug report for Unity Library. Following these guidelines helps maintainers and the community understand your report :pencil:, reproduce the behavior :computer: :computer:, and find related reports :mag_right:. +You can test the existing utitlties and report us the bugs/improvements/ideas. -Always add a meaningful title to your bug or issue. +Always add a meaningful title to your issue. -> **Note**: If you find a **Closed** issue that seems like it is the same thing that you're experiencing, open a new issue and include a link to the original issue in the body of your new one. +### Adding Content to Wiki -If you have experienced any problems with the scripts and content that Unity Library provides, you can submit them to us at [Unity Library Issues Section](https://github.com/UnityCommunity/UnityLibrary/issues) +You add tutorials and usage guideline for your content or existing content at [Wiki](https://github.com/UnityCommunity/UnityLibrary/wiki) -### Adding Content to Wiki +Always add a good and meaningful title and content. + +### Adding Content to Library + +You can add your own content and utilities to the library by [making pull requests](https://github.com/UnityCommunity/UnityLibrary/pulls). -Also you can add content to [Unity Library Wiki](https://github.com/UnityCommunity/UnityLibrary/wiki) but always provide a full and complete content not a partial and error container. +Always check the library to make sure you aren't adding a duplicate. + +Always test your utitlity to make sure it works as expected and is error free. + +Also you can make a new folder in the relevant category for your utility and include a README.md file for that to provide documentation and usage guideline. ### Making Pull Requests -You can submit your [Pull Requests](https://github.com/UnityCommunity/UnityLibrary/pulls) to us and we will merge them when they are ready. always add a meaningful pull request title. +You can submit your [Pull Requests](https://github.com/UnityCommunity/UnityLibrary/pulls) to us and we will merge them when they are ready. + +Always add a meaningful pull request title. From e6ce5f09b742460bc103e8c92499e089f1a513c2 Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Sat, 8 Jul 2017 14:29:09 +0430 Subject: [PATCH 049/231] Update CONTRIBUTING.md --- CONTRIBUTING.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f1f6205..cb85a27 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -7,6 +7,7 @@ [How Can I Contribute?](#how-can-i-contribute) - [Reporting Bugs](#reporting-bugs) - [Adding Content to Wiki](#adding-content-to-wiki) + - [Adding Content to Library](#adding-content-to-library) - [Making Pull Requests](#making-pull-requests) ## How Can I Contribute? @@ -33,6 +34,8 @@ Always test your utitlity to make sure it works as expected and is error free. Also you can make a new folder in the relevant category for your utility and include a README.md file for that to provide documentation and usage guideline. +New Category suggestion is welcome. + ### Making Pull Requests You can submit your [Pull Requests](https://github.com/UnityCommunity/UnityLibrary/pulls) to us and we will merge them when they are ready. From 1706824c5646af28d86adff2786106bd9b86ac29 Mon Sep 17 00:00:00 2001 From: mika Date: Tue, 11 Jul 2017 21:59:20 +0300 Subject: [PATCH 050/231] Create CopyPasteHelper.cs --- Scripts/Editor/Tools/CopyPasteHelper.cs | 95 +++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 Scripts/Editor/Tools/CopyPasteHelper.cs diff --git a/Scripts/Editor/Tools/CopyPasteHelper.cs b/Scripts/Editor/Tools/CopyPasteHelper.cs new file mode 100644 index 0000000..0ed5b7a --- /dev/null +++ b/Scripts/Editor/Tools/CopyPasteHelper.cs @@ -0,0 +1,95 @@ +using UnityEditor; +using UnityEngine; +using System.IO; +// Editor tool to easily paste scripts from web (automagically creates new file) +// original source: https://unitycoder.com/blog/2017/07/12/editor-plugin-paste-script-to-file/ + +namespace UnityLibrary +{ + public class CopyPasteHelper : EditorWindow + { + // settings: output folder is set as Assets/Scripts/Paste/ + static string baseFolder = "Scripts"; + static string subFolder = "Paste"; + + [MenuItem("Window/UnityLibrary/CopyPasteHelper")] + public static void ShowWindow() + { + //Show existing window instance. If one doesn't exist, make one. + var window = EditorWindow.GetWindow(typeof(CopyPasteHelper)); + window.titleContent = new GUIContent("CopyPasteHelper"); + window.minSize = new Vector2(64, 24); + } + + // mainloop + void OnGUI() + { + if (GUILayout.Button("C#", GUILayout.Width(44))) + { + CreateScript(); + } + } + + static void CreateScript() + { + // combine paths, TODO: cleanup + var fileName = "NewScript.cs"; // default filename if cannot parse from text + var mainFolder = Application.dataPath + Path.DirectorySeparatorChar + baseFolder + Path.DirectorySeparatorChar; + var childFolder = subFolder + Path.DirectorySeparatorChar; + var fullPath = mainFolder + childFolder + fileName; + + // check folders and create them if missing + if (Directory.Exists(mainFolder) == false) + { + Debug.Log("Creating missing folder: " + mainFolder); + AssetDatabase.CreateFolder("Assets", baseFolder); + } + if (Directory.Exists(mainFolder + childFolder) == false) + { + Debug.Log("Creating missing folder: " + mainFolder + childFolder); + AssetDatabase.CreateFolder("Assets" + Path.DirectorySeparatorChar + baseFolder, subFolder); + } + + // get clipboard text + string clipBoardContents = ReadClipBoard(); + if (string.IsNullOrEmpty(clipBoardContents.Trim())) + { + Debug.LogError("Nothing to paste.."); + return; + } + + // TODO: validate and detect string type (c# or shader) + // TODO: get script class name or shader name from string + + // confirm overwrite dialog + if (File.Exists(fullPath) == true) + { + // TODO: add option to autorename file (and class name) + if (EditorUtility.DisplayDialog("Copy Paste Helper", "Replace existing file: " + fullPath, "Replace", "Cancel") == false) + { + return; + } + } + + // save to file + File.WriteAllText(fullPath, clipBoardContents, System.Text.Encoding.Default); + Debug.Log("CopyPasteHelper Script saved at: " + fullPath); + + AssetDatabase.Refresh(); + + // show-select created asset + Object newScript = AssetDatabase.LoadAssetAtPath("Assets" + Path.DirectorySeparatorChar + baseFolder + Path.DirectorySeparatorChar + subFolder + Path.DirectorySeparatorChar + fileName, typeof(Object)); + EditorGUIUtility.PingObject(newScript); + } + + + // paste text to temporary texteditor and then get text + public static string ReadClipBoard() + { + TextEditor textEditor = new TextEditor(); + textEditor.multiline = true; + textEditor.Paste(); + return textEditor.text; + } + } +} From e36d27f405017dcf40f2926d9218fc29cae51586 Mon Sep 17 00:00:00 2001 From: mika Date: Tue, 11 Jul 2017 23:13:13 +0300 Subject: [PATCH 051/231] add google forms link for joining, new private message link --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 4d9afb8..c172633 100644 --- a/README.md +++ b/README.md @@ -53,8 +53,8 @@ Awesome and Useful Unity Resources: Send your GitHub id to one of the below ways: -- [:speech_balloon: Unity Forums](http://forum.unity3d.com/members/mgear.22727/) -- support [at] unitycoder [.] com +- [:speech_balloon: Unity Forums](https://forum.unity3d.com/conversations/add?to=mgear) *Private message +- Signup using [Google Forms](https://goo.gl/forms/DFspn3ByJBoLWEth2) *Can take few days until processed - [:e-mail: hasanbayat1393@gmail.com](mailto:hasanbayat1393@gmail.com) ## Improvements/Ideas/Feedback From 8dd5e16fb6d0eaef8c77a348c7a08d96ba47e0e2 Mon Sep 17 00:00:00 2001 From: mika Date: Thu, 13 Jul 2017 09:28:44 +0300 Subject: [PATCH 052/231] CopyPasteHelper: parse filename, output shaders --- Scripts/Editor/Tools/CopyPasteHelper.cs | 127 ++++++++++++++++++++++-- 1 file changed, 116 insertions(+), 11 deletions(-) diff --git a/Scripts/Editor/Tools/CopyPasteHelper.cs b/Scripts/Editor/Tools/CopyPasteHelper.cs index 0ed5b7a..aca2a8b 100644 --- a/Scripts/Editor/Tools/CopyPasteHelper.cs +++ b/Scripts/Editor/Tools/CopyPasteHelper.cs @@ -1,17 +1,23 @@ using UnityEditor; using UnityEngine; using System.IO; +using System; +using Object = UnityEngine.Object; + // Editor tool to easily paste scripts from web (automagically creates new file) // original source: https://unitycoder.com/blog/2017/07/12/editor-plugin-paste-script-to-file/ +// additional browser helper (add copy button to unity docs) https://unitycoder.com/blog/2017/07/13/browser-plugin-add-copy-button-to-unity-scripting-docs/ namespace UnityLibrary { public class CopyPasteHelper : EditorWindow { // settings: output folder is set as Assets/Scripts/Paste/ + // TODO: need to support shaders folder too static string baseFolder = "Scripts"; static string subFolder = "Paste"; + [MenuItem("Window/UnityLibrary/CopyPasteHelper")] public static void ShowWindow() { @@ -24,19 +30,17 @@ public static void ShowWindow() // mainloop void OnGUI() { - if (GUILayout.Button("C#", GUILayout.Width(44))) + if (GUILayout.Button("Paste", GUILayout.Width(44))) { - CreateScript(); + PasteToFile(); } } - static void CreateScript() + static void PasteToFile() { // combine paths, TODO: cleanup - var fileName = "NewScript.cs"; // default filename if cannot parse from text var mainFolder = Application.dataPath + Path.DirectorySeparatorChar + baseFolder + Path.DirectorySeparatorChar; var childFolder = subFolder + Path.DirectorySeparatorChar; - var fullPath = mainFolder + childFolder + fileName; // check folders and create them if missing if (Directory.Exists(mainFolder) == false) @@ -51,15 +55,19 @@ static void CreateScript() } // get clipboard text - string clipBoardContents = ReadClipBoard(); - if (string.IsNullOrEmpty(clipBoardContents.Trim())) + var clipboardString = ReadClipboard(); + if (string.IsNullOrEmpty(clipboardString.Trim())) { Debug.LogError("Nothing to paste.."); return; } - // TODO: validate and detect string type (c# or shader) - // TODO: get script class name or shader name from string + // TODO: check if its editor script, then place to editor/ folder + + var fileName = GetFileName(clipboardString); + var fullPath = mainFolder + childFolder + fileName; + + // TODO: fix line endings (so that there wont be visual studio popup) // confirm overwrite dialog if (File.Exists(fullPath) == true) @@ -72,24 +80,121 @@ static void CreateScript() } // save to file - File.WriteAllText(fullPath, clipBoardContents, System.Text.Encoding.Default); + File.WriteAllText(fullPath, clipboardString, System.Text.Encoding.Default); Debug.Log("CopyPasteHelper Script saved at: " + fullPath); AssetDatabase.Refresh(); + // FIXME: script compilation can fail here if it was bad script, then the lines below wont run? + // show-select created asset Object newScript = AssetDatabase.LoadAssetAtPath("Assets" + Path.DirectorySeparatorChar + baseFolder + Path.DirectorySeparatorChar + subFolder + Path.DirectorySeparatorChar + fileName, typeof(Object)); EditorGUIUtility.PingObject(newScript); + + // FIXME: this doesnt work, file is still there but becomes zombie (have to delete through explorer..) + // Undo.RegisterCreatedObjectUndo(newScript, "CopyPaste Helper object creation"); } // paste text to temporary texteditor and then get text - public static string ReadClipBoard() + static string ReadClipboard() { TextEditor textEditor = new TextEditor(); textEditor.multiline = true; textEditor.Paste(); return textEditor.text; } + + + // returns class name (or shader name) and file extension .cs or .shader + static string GetFileName(string str) + { + var fileName = "NewScript"; + var fileExtension = ".cs"; + + // check if this looks like c# or shader + if (str.IndexOf("using ") > -1 || str.IndexOf("class ") > -1 || str.IndexOf("namespace ") > -1) + { + // should be c#, try to get class name + // NOTE: this would fail if comment lines have same "class " string + var classSplit = str.Split(new string[] { "class " }, StringSplitOptions.None); + + var index = 0; + var looping = true; + while (looping == true) + { + var c = classSplit[1].Substring(index++, 1); + // check characters until hit end of class name + switch (c) + { + case " ": + case ":": + case "{": + case "\t": + case ",": + case "\r": + case "\n": + looping = false; + break; + default: + break; + } + + if (index >= classSplit[1].Length) + { + fileName = "NewScript"; // default.. + Debug.LogError("Failed parsing class name.."); + looping = false; + index = -1; + } + } + + // we founded end of class name + if (index > 0) + { + fileName = classSplit[1].Substring(0, --index); + } else + { + Debug.LogError("Failed parsing class name.."); + } + + } else if (str.IndexOf("Shader ") > -1 || str.IndexOf("SubShader") > -1 || str.IndexOf("CGPROGRAM") > -1) + { + fileName = "NewShader"; + + // probably its shader then, get name + // TODO: this would fail if name starts without space: 'Shader"myshader..' + var classSplit = str.Split(new string[] { "Shader " }, StringSplitOptions.None); + + if (classSplit.Length > 0) + { + var shaderNameSplit = classSplit[1].Split('"'); + + if (shaderNameSplit.Length > 1) + { + // TODO: this takes the whole shader name string, custom/some/more/here.shader, could take name without path + fileName = shaderNameSplit[1]; + } else + { + Debug.LogError("Failed parsing shader name.."); + } + } else + { + Debug.LogError("Failed parsing shader name.."); + } + + fileExtension = ".shader"; + } else + { + // unknown format + Debug.LogError("Unknown format..saving as default c#"); + } + + // just to be sure, cleanup illegal characters from filename, https://stackoverflow.com/a/13617375/5452781 + var invalidChars = Path.GetInvalidFileNameChars(); + fileName = string.Join("_", fileName.Split(invalidChars, StringSplitOptions.RemoveEmptyEntries)).TrimEnd('.'); + + return fileName + fileExtension; + } } } From e8e947ad16d601e313807521bca42c251d6a6a29 Mon Sep 17 00:00:00 2001 From: mika Date: Fri, 14 Jul 2017 18:28:22 +0300 Subject: [PATCH 053/231] Create SmoothMouseLookAveraged.cs --- Scripts/Camera/SmoothMouseLookAveraged.cs | 104 ++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 Scripts/Camera/SmoothMouseLookAveraged.cs diff --git a/Scripts/Camera/SmoothMouseLookAveraged.cs b/Scripts/Camera/SmoothMouseLookAveraged.cs new file mode 100644 index 0000000..b0e17ce --- /dev/null +++ b/Scripts/Camera/SmoothMouseLookAveraged.cs @@ -0,0 +1,104 @@ +using UnityEngine; +using System.Collections; +using System.Collections.Generic; + +// source: https://forum.unity3d.com/threads/a-free-simple-smooth-mouselook.73117/#post-3101292 +// added: lockCursor + +namespace UnityLibrary +{ + public class SmoothMouseLookAveraged : MonoBehaviour + { + [Header("Info")] + private List _rotArrayX = new List(); // TODO: could use fixed array, or queue + private List _rotArrayY = new List(); + private float rotAverageX; + private float rotAverageY; + private float mouseDeltaX; + private float mouseDeltaY; + + [Header("Settings")] + public float _sensitivityX = 1.5f; + public float _sensitivityY = 1.5f; + [Tooltip("The more steps, the smoother it will be.")] + public int _averageFromThisManySteps = 3; + public bool lockCursor = false; + + [Header("References")] + [Tooltip("Object to be rotated when mouse moves left/right.")] + public Transform _playerRootT; + [Tooltip("Object to be rotated when mouse moves up/down.")] + public Transform _cameraT; + + //============================================ + // FUNCTIONS (UNITY) + //============================================ + + void Start() + { + Cursor.visible = !lockCursor; + } + + void Update() + { + HandleCursorLock(); + MouseLookAveraged(); + } + + //============================================ + // FUNCTIONS (CUSTOM) + //============================================ + + void HandleCursorLock() + { + // pressing esc toggles between hide/show and lock/unlock cursor + if (Input.GetKeyDown(KeyCode.Escape)) + { + lockCursor = !lockCursor; + } + + // Ensure the cursor is always locked when set + Cursor.lockState = lockCursor ? CursorLockMode.Locked : CursorLockMode.None; + Cursor.visible = !lockCursor; + } + + + + void MouseLookAveraged() + { + rotAverageX = 0f; + rotAverageY = 0f; + mouseDeltaX = 0f; + mouseDeltaY = 0f; + + mouseDeltaX += Input.GetAxis("Mouse X") * _sensitivityX; + mouseDeltaY += Input.GetAxis("Mouse Y") * _sensitivityY; + + // Add current rot to list, at end + _rotArrayX.Add(mouseDeltaX); + _rotArrayY.Add(mouseDeltaY); + + // Reached max number of steps? Remove oldest from list + if (_rotArrayX.Count >= _averageFromThisManySteps) + _rotArrayX.RemoveAt(0); + + if (_rotArrayY.Count >= _averageFromThisManySteps) + _rotArrayY.RemoveAt(0); + + // Add all of these rotations together + for (int i_counterX = 0; i_counterX < _rotArrayX.Count; i_counterX++) + rotAverageX += _rotArrayX[i_counterX]; + + for (int i_counterY = 0; i_counterY < _rotArrayY.Count; i_counterY++) + rotAverageY += _rotArrayY[i_counterY]; + + // Get average + rotAverageX /= _rotArrayX.Count; + rotAverageY /= _rotArrayY.Count; + + // Apply + _playerRootT.Rotate(0f, rotAverageX, 0f, Space.World); + _cameraT.Rotate(-rotAverageY, 0f, 0f, Space.Self); + } + } +} From e9af2cc88c90258e2f3dde72e7bf5871d5b77bb3 Mon Sep 17 00:00:00 2001 From: lootheo Date: Wed, 19 Jul 2017 02:50:12 -0500 Subject: [PATCH 054/231] +Follow2D Script (Acceleration Missing) --- Scripts/2D/Follow2D.cs | 97 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 Scripts/2D/Follow2D.cs diff --git a/Scripts/2D/Follow2D.cs b/Scripts/2D/Follow2D.cs new file mode 100644 index 0000000..c1c6834 --- /dev/null +++ b/Scripts/2D/Follow2D.cs @@ -0,0 +1,97 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + + +/// +/// Follows a GameObject in a Smooth way and with various settings +/// Author: Manuel Otheo (@Lootheo) with guidance from Hasan Bayat (EmpireWorld) +/// +/// +/// How to use: Attach it to a GameObject and then assign the target to follow and the variables like offset and speed +/// If it's not moving check the speed +/// +/// TODO: Add Acceleration Follow +/// +public class Follow2D : MonoBehaviour { + public enum FollowType { MoveTowards, Lerp, Slerp, SmoothDamp, Acceleration} + + public Transform target; + public FollowType followType = FollowType.MoveTowards; + public Vector2 speed; + public Vector2 time; + + public Vector2 offset; + + public bool bounds; + public Vector2 lowerBounds; + public Vector2 higherBounds; + + + private Vector2 velocity; + private Vector2 step; + // Use this for initialization + void Start () { + + } + + void FixedUpdate() + { + switch (followType) + { + case FollowType.MoveTowards: + MoveTowards(); + break; + case FollowType.Lerp: + Lerp(); + break; + case FollowType.Slerp: + Slerp(); + break; + case FollowType.SmoothDamp: + SmoothDamp(); + break; + case FollowType.Acceleration: + + break; + } + + if (bounds) + { + CheckForBounds(); + } + } + + void MoveTowards() + { + step = speed * Time.deltaTime; + transform.position = new Vector2(Vector2.MoveTowards(transform.position, (Vector2)target.position+offset, step.x).x, Vector2.MoveTowards(transform.position, (Vector2)target.position+offset, step.x).y); + } + void Lerp() + { + float posX = Mathf.Lerp(transform.position.x, target.position.x+offset.x, time.x* Time.fixedDeltaTime); + float posY = Mathf.Lerp(transform.position.y, target.position.y + offset.y, time.y * Time.fixedDeltaTime); + transform.position = new Vector3(posX, posY, transform.position.z); + } + void Slerp() + { + float posX = Vector3.Slerp(transform.position, (Vector3)((Vector2)target.position + offset), time.x*Time.fixedDeltaTime).x; + float posY = Vector3.Slerp(transform.position, (Vector3)((Vector2)target.position + offset), time.y * Time.fixedDeltaTime).y; + transform.position = new Vector3(posX, posY, transform.position.z); + } + + void SmoothDamp() + { + Vector2 position; + + position.x = Mathf.SmoothDamp(transform.position.x, target.position.x+offset.x, ref velocity.x, time.x); + position.y = Mathf.SmoothDamp(transform.position.y, target.position.y+offset.y, ref velocity.y, time.y); + + transform.position = new Vector3(position.x, position.y, transform.position.z); + } + + void CheckForBounds() + { + transform.position = new Vector3(Mathf.Clamp(transform.position.x, lowerBounds.x, higherBounds.x), Mathf.Clamp(transform.position.y, lowerBounds.y, higherBounds.y), transform.position.z); + } +} From 8585eb267e87756ed7e9c0cb5f3443e582ac5842 Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Wed, 19 Jul 2017 12:54:18 +0430 Subject: [PATCH 055/231] Update Follow2D.cs Fix Syntax Make methods virtual Add regions --- Scripts/2D/Follow2D.cs | 59 ++++++++++++++++++++++++++++++------------ 1 file changed, 42 insertions(+), 17 deletions(-) diff --git a/Scripts/2D/Follow2D.cs b/Scripts/2D/Follow2D.cs index c1c6834..e89317e 100644 --- a/Scripts/2D/Follow2D.cs +++ b/Scripts/2D/Follow2D.cs @@ -1,4 +1,4 @@ -using System.Collections; +using System.Collections; using System.Collections.Generic; using UnityEngine; @@ -14,29 +14,45 @@ /// TODO: Add Acceleration Follow /// public class Follow2D : MonoBehaviour { - public enum FollowType { MoveTowards, Lerp, Slerp, SmoothDamp, Acceleration} + public enum FollowType { + MoveTowards, + Lerp, + Slerp, + SmoothDamp, + Acceleration + } + + #region Fields + public Transform target; public FollowType followType = FollowType.MoveTowards; public Vector2 speed; public Vector2 time; - public Vector2 offset; - public bool bounds; public Vector2 lowerBounds; public Vector2 higherBounds; - - - private Vector2 velocity; - private Vector2 step; - // Use this for initialization - void Start () { + + #endregion - } + #region Variables + + protected Vector2 velocity; + protected Vector2 step; + + #endregion + + #region MonoBehaviour Messages - void FixedUpdate() + protected virtual void FixedUpdate() { + + // Exit if the target object not specified + if (target == null) { + return; + } + switch (followType) { case FollowType.MoveTowards: @@ -61,26 +77,32 @@ void FixedUpdate() CheckForBounds(); } } + + #endregion + + #region Methods - void MoveTowards() + protected virtual void MoveTowards() { step = speed * Time.deltaTime; transform.position = new Vector2(Vector2.MoveTowards(transform.position, (Vector2)target.position+offset, step.x).x, Vector2.MoveTowards(transform.position, (Vector2)target.position+offset, step.x).y); } - void Lerp() + + protected virtual void Lerp() { float posX = Mathf.Lerp(transform.position.x, target.position.x+offset.x, time.x* Time.fixedDeltaTime); float posY = Mathf.Lerp(transform.position.y, target.position.y + offset.y, time.y * Time.fixedDeltaTime); transform.position = new Vector3(posX, posY, transform.position.z); } - void Slerp() + + protected virtual void Slerp() { float posX = Vector3.Slerp(transform.position, (Vector3)((Vector2)target.position + offset), time.x*Time.fixedDeltaTime).x; float posY = Vector3.Slerp(transform.position, (Vector3)((Vector2)target.position + offset), time.y * Time.fixedDeltaTime).y; transform.position = new Vector3(posX, posY, transform.position.z); } - void SmoothDamp() + protected virtual void SmoothDamp() { Vector2 position; @@ -90,8 +112,11 @@ void SmoothDamp() transform.position = new Vector3(position.x, position.y, transform.position.z); } - void CheckForBounds() + protected virtual void CheckForBounds() { transform.position = new Vector3(Mathf.Clamp(transform.position.x, lowerBounds.x, higherBounds.x), Mathf.Clamp(transform.position.y, lowerBounds.y, higherBounds.y), transform.position.z); } + + #endregion + } From 42be3677b2c25359e14dbc6202021171c0c124b5 Mon Sep 17 00:00:00 2001 From: lootheo Date: Thu, 20 Jul 2017 00:02:31 -0500 Subject: [PATCH 056/231] Updated the shaders and fixed the return value of ComputeDepth from UnlitFakeCurved --- Shaders/Debug/DebugNormalsTangents.shader | 4 +++- Shaders/Debug/LerpColorNearToFarPlane.shader | 4 +++- Shaders/SkyBox/Cubemap-Simple.shader | 4 +++- Shaders/TextureMapping/Equirectangular.shader | 4 +++- Shaders/Vertex/UnlitFakeCurved.shader | 8 +++++--- Shaders/Vertex/VertexColorMesh.shader | 4 +++- 6 files changed, 20 insertions(+), 8 deletions(-) diff --git a/Shaders/Debug/DebugNormalsTangents.shader b/Shaders/Debug/DebugNormalsTangents.shader index 46baefb..46ee47b 100644 --- a/Shaders/Debug/DebugNormalsTangents.shader +++ b/Shaders/Debug/DebugNormalsTangents.shader @@ -1,3 +1,5 @@ +// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' + // source: http://forum.unity3d.com/threads/tangent-space-normal-map-seams-problem-fixed.384063/#post-2496937 Shader "Custom/DebugNormalsTangents" { @@ -35,7 +37,7 @@ SubShader { v2f vert (appdata_tan v) { v2f o; - o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); + o.vertex = UnityObjectToClipPos(v.vertex); o.texcoord = v.texcoord; half3 wNormal = UnityObjectToWorldNormal(v.normal); diff --git a/Shaders/Debug/LerpColorNearToFarPlane.shader b/Shaders/Debug/LerpColorNearToFarPlane.shader index ee0c252..ac97b8b 100644 --- a/Shaders/Debug/LerpColorNearToFarPlane.shader +++ b/Shaders/Debug/LerpColorNearToFarPlane.shader @@ -1,3 +1,5 @@ +// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' + // source: https://forum.unity3d.com/threads/depth-shader-invert-it.12692/#post-89430 // lerp 2 colors between camera NearClipPlane to FarClipPlane @@ -33,7 +35,7 @@ Shader "UnityCommunity/Debug/LerpColorNearToFarPlane" v2f vert(appdata v) { v2f o; - o.pos = mul(UNITY_MATRIX_MVP, v.vertex); + o.pos = UnityObjectToClipPos(v.vertex); float depth; COMPUTE_EYEDEPTH(depth); float factor = depth * _ProjectionParams.w; diff --git a/Shaders/SkyBox/Cubemap-Simple.shader b/Shaders/SkyBox/Cubemap-Simple.shader index d31b1dd..5da0211 100644 --- a/Shaders/SkyBox/Cubemap-Simple.shader +++ b/Shaders/SkyBox/Cubemap-Simple.shader @@ -1,3 +1,5 @@ +// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' + // simplified skybox shader (unity 5.3.x) // removed tint, rotation, exposure, HDR calculation @@ -30,7 +32,7 @@ Shader "UnityLibrary/Skybox/Cubemap-Simple" v2f vert (appdata_t v) { v2f o; - o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); + o.vertex = UnityObjectToClipPos(v.vertex); o.texcoord = v.vertex.xyz; return o; } diff --git a/Shaders/TextureMapping/Equirectangular.shader b/Shaders/TextureMapping/Equirectangular.shader index 0ade973..5f0ee7a 100644 --- a/Shaders/TextureMapping/Equirectangular.shader +++ b/Shaders/TextureMapping/Equirectangular.shader @@ -1,3 +1,5 @@ +// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' + //from https://forum.unity3d.com/threads/what-is-wrong-with-unitys-spherical-mapping-how-to-fix-it.321205/ /* @@ -41,7 +43,7 @@ Shader "Custom/Equirectangular" { v2f vert (appdata v) { v2f o; - o.pos = mul(UNITY_MATRIX_MVP, v.vertex); + o.pos = UnityObjectToClipPos(v.vertex); o.normal = v.normal; return o; } diff --git a/Shaders/Vertex/UnlitFakeCurved.shader b/Shaders/Vertex/UnlitFakeCurved.shader index 156fb20..642d654 100644 --- a/Shaders/Vertex/UnlitFakeCurved.shader +++ b/Shaders/Vertex/UnlitFakeCurved.shader @@ -1,3 +1,5 @@ +// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' + // Unlit Fake Curved World Shader // Usage: Attach to objects that needs to be curved // Adjust main camera to look downwards 15 degrees, and few meters higher than the ground @@ -40,7 +42,7 @@ Shader "UnityLibrary/UnlitFakeCurved" float4 _MainTex_ST; // taken from UnityCG.cginc": #define COMPUTE_DEPTH_01 -(UnityObjectToViewPos( v.vertex ).z * _ProjectionParams.w) - float ComputeDepth01(float vertexZ) + float ComputeDepth01(float3 vertexZ) { return -(UnityObjectToViewPos( vertexZ ).z * _ProjectionParams.w); } @@ -48,9 +50,9 @@ Shader "UnityLibrary/UnlitFakeCurved" v2f vert (appdata v) { v2f o; - o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); + o.vertex = UnityObjectToClipPos(v.vertex); - float depth = 1-ComputeDepth01(v.vertex.z); // invert depth + float depth = 1-ComputeDepth01(v.vertex); // invert depth o.vertex.y *= exp(depth); // push Y coordinate based on distance o.uv = TRANSFORM_TEX(v.uv, _MainTex); diff --git a/Shaders/Vertex/VertexColorMesh.shader b/Shaders/Vertex/VertexColorMesh.shader index 4a210f4..e1790ef 100644 --- a/Shaders/Vertex/VertexColorMesh.shader +++ b/Shaders/Vertex/VertexColorMesh.shader @@ -1,3 +1,5 @@ +// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' + // vertex colors shader for mesh Shader "UnityCommunity/Vertex/VertexColorMesh" @@ -30,7 +32,7 @@ Shader "UnityCommunity/Vertex/VertexColorMesh" v2f vert (appdata v) { v2f o; - o.pos = mul(UNITY_MATRIX_MVP, v.vertex); + o.pos = UnityObjectToClipPos(v.vertex); o.color = v.color; return o; } From 8deb880c019bc7304b1b871fae053084957abb1f Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Thu, 20 Jul 2017 11:02:05 +0430 Subject: [PATCH 057/231] Update README.md --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index c172633..a7b90e0 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,14 @@ Useful scripts, snippets and shaders here it is gathered for free. We have collected most scripts from external sources like Unity Communities (Forums, Answers) and we made it ourselves a little. +## Call for Help + +[Help us update our old scripts](https://github.com/UnityCommunity/UnityLibrary/issues/15) + +[Help us update our old shaders](https://github.com/UnityCommunity/UnityLibrary/issues/14) + +You can post the old scripts, shaders, ... names to us and we will update them. + ## Getting Started This repository contains all kind of utilities for Unity from scripts to shaders. From 9f5a68ef6095365fdd46fc8ad6c716feee3439fa Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Thu, 20 Jul 2017 11:04:32 +0430 Subject: [PATCH 058/231] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index a7b90e0..de9349e 100644 --- a/README.md +++ b/README.md @@ -8,11 +8,11 @@ We have collected most scripts from external sources like Unity Communities (For ## Call for Help -[Help us update our old scripts](https://github.com/UnityCommunity/UnityLibrary/issues/15) +[:star: Help us update our old scripts](https://github.com/UnityCommunity/UnityLibrary/issues/15) -[Help us update our old shaders](https://github.com/UnityCommunity/UnityLibrary/issues/14) +[:star2: Help us update our old shaders](https://github.com/UnityCommunity/UnityLibrary/issues/14) -You can post the old scripts, shaders, ... names to us and we will update them. +You can post the old scripts, shaders, ... names to us and we will update them, or you can update them yourself and make a pull request. ## Getting Started From 0f7faa30d840c6de4679336bcfb6393a5e597ece Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Thu, 20 Jul 2017 12:09:03 +0430 Subject: [PATCH 059/231] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index de9349e..89b1108 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,8 @@ or you can find useful stuff by [browsing awesome resources in the below](#resou [:fire: Join the Community](#join-the-community) +[:door: Join our Slack Channel](https://join.slack.com/t/unitylibrary/shared_invite/MjE1MDA2NzExNDEwLTE1MDA0OTE5NzktOGJmYTI0ZDlkNA) + ## Content - [Docs/](https://github.com/UnityCommunity/UnityLibrary/tree/master/Docs) : A small replacement for missing Unity documentations. From 421dde1bf5a032e7425fc5362813b1e5756b6711 Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Thu, 20 Jul 2017 14:20:02 +0430 Subject: [PATCH 060/231] Add Gitter Channel --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 89b1108..4352b01 100644 --- a/README.md +++ b/README.md @@ -32,6 +32,8 @@ or you can find useful stuff by [browsing awesome resources in the below](#resou [:door: Join our Slack Channel](https://join.slack.com/t/unitylibrary/shared_invite/MjE1MDA2NzExNDEwLTE1MDA0OTE5NzktOGJmYTI0ZDlkNA) +[:door: Join our Gitter Channel](https://gitter.im/UnityCommunity/Lobby?utm_source=share-link&utm_medium=link&utm_campaign=share-link) + ## Content - [Docs/](https://github.com/UnityCommunity/UnityLibrary/tree/master/Docs) : A small replacement for missing Unity documentations. From 684a7eddb02fc35db7ebeda77d7659d3a7440600 Mon Sep 17 00:00:00 2001 From: mika Date: Thu, 20 Jul 2017 16:05:35 +0300 Subject: [PATCH 061/231] add discord link --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 4352b01..f761c49 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,8 @@ or you can find useful stuff by [browsing awesome resources in the below](#resou [:door: Join our Gitter Channel](https://gitter.im/UnityCommunity/Lobby?utm_source=share-link&utm_medium=link&utm_campaign=share-link) +[:door: Join our Discord Channel](https://discord.gg/cXT97hU) + ## Content - [Docs/](https://github.com/UnityCommunity/UnityLibrary/tree/master/Docs) : A small replacement for missing Unity documentations. From 85295feb7c3dfdea9521250a733d4f97f8a6e814 Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Thu, 20 Jul 2017 22:11:57 +0430 Subject: [PATCH 062/231] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index f761c49..679b876 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,8 @@ or you can find useful stuff by [browsing awesome resources in the below](#resou Awesome and Useful Unity Resources: +[:white_check_mark: Check out our Development Board](https://trello.com/b/1sOcvQzd/unity-library) + [:sparkles: Awesome Unity](https://github.com/RyanNielson/awesome-unity) [:clipboard: Unity Script Collection](https://github.com/michidk/Unity-Script-Collection) From e21a5842a30b39ef44c8846120e50dbef4aed48b Mon Sep 17 00:00:00 2001 From: mika Date: Thu, 20 Jul 2017 23:33:00 +0300 Subject: [PATCH 063/231] Update RandomTiles.cs #15 --- Scripts/2D/Tilemaps/RandomTiles.cs | 76 ++++++++++++++++++++++-------- 1 file changed, 57 insertions(+), 19 deletions(-) diff --git a/Scripts/2D/Tilemaps/RandomTiles.cs b/Scripts/2D/Tilemaps/RandomTiles.cs index 1885928..92644c1 100644 --- a/Scripts/2D/Tilemaps/RandomTiles.cs +++ b/Scripts/2D/Tilemaps/RandomTiles.cs @@ -1,33 +1,71 @@ -// Requires: Unity 5.5.0a1 or later -// Fills tilemap with random tiles -// Usage: Attach this script to Tilemap layer, assign tiles, hit play +// tested with unity version: 2017.2.0b4 +// info: Fills tilemap with random tiles +// usage: Attach this script to empty gameobject, assign some tiles, then press play using UnityEngine; +using UnityEngine.Tilemaps; -public class RandomTiles : MonoBehaviour +namespace UnityLibary { - public Tile[] tiles; - - void Start() + public class RandomTiles : MonoBehaviour { - RandomTileMap(); - } + public int width = 32; + public int height = 32; - void RandomTileMap() - { - TileMap map = GetComponent(); + public Tile[] tiles; - int sizeX = 32; - int sizeY = 16; + void Start() + { + RandomTileMap(); + } - for (int x = 0; x < sizeX; x++) + void RandomTileMap() { - for (int y = 0; y < sizeY; y++) + // validation + if (tiles == null || tiles.Length < 1) + { + Debug.LogError("Tiles not assigned", gameObject); + return; + } + + var parent = transform.parent; + if (parent == null) + { + var go = new GameObject("grid"); + go.AddComponent(); + transform.SetParent(go.transform); + } else + { + if (parent.GetComponent() == null) + { + parent.gameObject.AddComponent(); + } + } + + TilemapRenderer tr = GetComponent(); + if (tr == null) + { + tr = gameObject.AddComponent(); + } + + Tilemap map = GetComponent(); + if (map == null) { - var tilePos = new Vector3Int(x, y, 0); - map.SetTile(tilePos, tiles[Random.Range(0, tiles.Length)]); + map = gameObject.AddComponent(); + } + + + // random map generation + Vector3Int tilePos = Vector3Int.zero; + for (int x = 0; x < width; x++) + { + for (int y = 0; y < height; y++) + { + tilePos.x = x; + tilePos.y = y; + map.SetTile(tilePos, tiles[Random.Range(0, tiles.Length)]); + } } } } - } From 862a00bf0513e85b1db14a456405feab8cb5ead5 Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Fri, 21 Jul 2017 09:23:46 +0430 Subject: [PATCH 064/231] Update README.md --- README.md | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 679b876..01cfaa3 100644 --- a/README.md +++ b/README.md @@ -30,12 +30,6 @@ or you can find useful stuff by [browsing awesome resources in the below](#resou [:fire: Join the Community](#join-the-community) -[:door: Join our Slack Channel](https://join.slack.com/t/unitylibrary/shared_invite/MjE1MDA2NzExNDEwLTE1MDA0OTE5NzktOGJmYTI0ZDlkNA) - -[:door: Join our Gitter Channel](https://gitter.im/UnityCommunity/Lobby?utm_source=share-link&utm_medium=link&utm_campaign=share-link) - -[:door: Join our Discord Channel](https://discord.gg/cXT97hU) - ## Content - [Docs/](https://github.com/UnityCommunity/UnityLibrary/tree/master/Docs) : A small replacement for missing Unity documentations. @@ -49,8 +43,6 @@ or you can find useful stuff by [browsing awesome resources in the below](#resou Awesome and Useful Unity Resources: -[:white_check_mark: Check out our Development Board](https://trello.com/b/1sOcvQzd/unity-library) - [:sparkles: Awesome Unity](https://github.com/RyanNielson/awesome-unity) [:clipboard: Unity Script Collection](https://github.com/michidk/Unity-Script-Collection) @@ -73,6 +65,13 @@ Send your GitHub id to one of the below ways: - Signup using [Google Forms](https://goo.gl/forms/DFspn3ByJBoLWEth2) *Can take few days until processed - [:e-mail: hasanbayat1393@gmail.com](mailto:hasanbayat1393@gmail.com) +Our communities: + +- [Join our Slack Channel](https://join.slack.com/t/unitylibrary/shared_invite/MjE1MDA2NzExNDEwLTE1MDA0OTE5NzktOGJmYTI0ZDlkNA) +- [Join our Gitter Channel](https://gitter.im/UnityCommunity/Lobby?utm_source=share-link&utm_medium=link&utm_campaign=share-link) +- [Join our Discord Channel](https://discord.gg/cXT97hU) +- [Development Board](https://trello.com/b/1sOcvQzd/unity-library) + ## Improvements/Ideas/Feedback Feel free to [:postbox: Post your ideas/comments/improvements/recommendations](https://github.com/UnityCommunity/UnityLibrary/issues) From 1a30d2fb9799213aa92a1147d214d4ab3e9c3c6b Mon Sep 17 00:00:00 2001 From: lootheo Date: Sat, 22 Jul 2017 06:17:45 -0500 Subject: [PATCH 065/231] Update Old Scripts #15 - Changed Getcomponent for GetComponent in Camera_depthTextureMode.cs - Added pre-compile directive in RandomTiles.cs for 2017.2 or newer - Added pre-compile directive in TileMapHierarchyHelper.cs for 2017.2 or newer and changed list from TileMap to Tilemap - Same with TileMapLayerHelper - Updated WowCamera.cs -Fixed SpriteBackgroundRemover - Commented GrabDesktop entirely with instructions on how-to-use - Added compile-time directive to ColorCorrectionCurvesLayers.cs and GrayscaleLayers.cs to be used by old versions. --- Docs/Camera/Camera_depthTextureMode.cs | 2 +- .../2D/Tilemaps/Editor/TilemapLayerHelper.cs | 21 ++++++-- Scripts/2D/Tilemaps/RandomTiles.cs | 16 +++++- Scripts/2D/Tilemaps/TileMapHierarchyHelper.cs | 18 ++++++- Scripts/Camera/WowCamera.cs | 4 +- Scripts/Editor/SpriteBackgroundRemover.cs | 4 +- Scripts/Helpers/Screenshot/GrabDesktop.cs | 54 ++++++++++++++----- .../Scripts/ColorCorrectionCurvesLayers.cs | 5 +- Shaders/ImageEffects/GrayscaleLayers.cs | 4 ++ 9 files changed, 100 insertions(+), 28 deletions(-) diff --git a/Docs/Camera/Camera_depthTextureMode.cs b/Docs/Camera/Camera_depthTextureMode.cs index a1610dd..2b70930 100644 --- a/Docs/Camera/Camera_depthTextureMode.cs +++ b/Docs/Camera/Camera_depthTextureMode.cs @@ -9,7 +9,7 @@ public class Camera_depthTextureMode : MonoBehaviour { void OnEnable() { - var cam = Getcomponent(); + var cam = GetComponent(); if (cam!=null) { // enable camera depth texture diff --git a/Scripts/2D/Tilemaps/Editor/TilemapLayerHelper.cs b/Scripts/2D/Tilemaps/Editor/TilemapLayerHelper.cs index 5222265..3258a03 100644 --- a/Scripts/2D/Tilemaps/Editor/TilemapLayerHelper.cs +++ b/Scripts/2D/Tilemaps/Editor/TilemapLayerHelper.cs @@ -1,6 +1,10 @@ using UnityEngine; using UnityEditor; -using UnityEngine.TileMap; + +#if UNITY_2017_2_OR_NEWER +using UnityEngine.Tilemaps; + +//Requires Unity 2017.2 or newer // TilemapLayerHelper // Use PageDown/PageUp to select between tilemap layers @@ -57,7 +61,7 @@ void OnGUI() if (GUI.changed && tileRoot) { // get list of tilemap layers - var childTileMaps = tileRoot.GetComponentsInChildren(); + var childTileMaps = tileRoot.GetComponentsInChildren(); layerNames = new string[childTileMaps.Length]; tilemapGos = new GameObject[childTileMaps.Length]; @@ -191,9 +195,9 @@ void SetTileMapLayerColors() { if (i == selectedLayer || !fadeOtherLayers) { - tilemapGos[i].GetComponent().color = Color.white; + tilemapGos[i].GetComponent().color = Color.white; } else { - tilemapGos[i].GetComponent().color = Color.white * 0.5f; + tilemapGos[i].GetComponent().color = Color.white * 0.5f; } } } @@ -208,3 +212,12 @@ int Wrap(int i, int i_max) return ((i % i_max) + i_max) % i_max; } } +#else +public class TilemapLayerHelper : MonoBehaviour +{ + public void Start() + { + Debug.LogWarning("This version of unity doesnt support UnityEngine.Tilemaps"); + } +} +#endif \ No newline at end of file diff --git a/Scripts/2D/Tilemaps/RandomTiles.cs b/Scripts/2D/Tilemaps/RandomTiles.cs index 92644c1..39b62d0 100644 --- a/Scripts/2D/Tilemaps/RandomTiles.cs +++ b/Scripts/2D/Tilemaps/RandomTiles.cs @@ -1,10 +1,12 @@ // tested with unity version: 2017.2.0b4 // info: Fills tilemap with random tiles // usage: Attach this script to empty gameobject, assign some tiles, then press play +// please make sure that you have at least version 2017.2 or the experimental 2d unity 5_5 +// https://forum.unity3d.com/threads/update-july-2017.484397/ using UnityEngine; +#if UNITY_2017_2_OR_NEWER using UnityEngine.Tilemaps; - namespace UnityLibary { public class RandomTiles : MonoBehaviour @@ -34,7 +36,8 @@ void RandomTileMap() var go = new GameObject("grid"); go.AddComponent(); transform.SetParent(go.transform); - } else + } + else { if (parent.GetComponent() == null) { @@ -69,3 +72,12 @@ void RandomTileMap() } } } +#else +public class RandomTiles : MonoBehaviour +{ + public void Start() + { + Debug.LogWarning("This version of unity doesnt support UnityEngine.Tilemaps"); + } +} +#endif diff --git a/Scripts/2D/Tilemaps/TileMapHierarchyHelper.cs b/Scripts/2D/Tilemaps/TileMapHierarchyHelper.cs index b10c6bb..fdfc17b 100644 --- a/Scripts/2D/Tilemaps/TileMapHierarchyHelper.cs +++ b/Scripts/2D/Tilemaps/TileMapHierarchyHelper.cs @@ -1,11 +1,16 @@ using UnityEditor; using UnityEditor.SceneManagement; using UnityEngine; + // Hierarchy icons http://answers.unity3d.com/answers/1113260/view.html // displays icons for tilemaps in hierarchy // adds up/down arrows for tilemap layers (to arrange them up or down) +//requires unity 2017.2 or newer + +#if UNITY_2017_2_OR_NEWER +using UnityEngine.Tilemaps; [InitializeOnLoad] class TileMapHierarchyHelper { @@ -40,8 +45,8 @@ static void HierarchyItemCallBack(int instanceID, Rect selectionRect) GameObject go = EditorUtility.InstanceIDToObject(instanceID) as GameObject; - // if (go && Selection.activeGameObject == go && go.GetComponent()) - if (go && go.GetComponent()) + // if (go && Selection.activeGameObject == go && go.GetComponent()) + if (go && go.GetComponent()) { // buttons if (GUI.Button(r, upArrow, GUIStyle.none)) @@ -69,3 +74,12 @@ static void MoveInHierarchy(GameObject go, int delta) go.transform.SetSiblingIndex(go.transform.GetSiblingIndex() + delta); } } +#else +public class RandomTiles : MonoBehaviour +{ + public void Start() + { + Debug.LogWarning("This version of unity doesnt support UnityEngine.Tilemaps"); + } +} +#endif diff --git a/Scripts/Camera/WowCamera.cs b/Scripts/Camera/WowCamera.cs index 20ed6eb..adcb48c 100644 --- a/Scripts/Camera/WowCamera.cs +++ b/Scripts/Camera/WowCamera.cs @@ -46,8 +46,8 @@ void Start () correctedDistance = distance; // Make the rigid body not change rotation - if (rigidbody) - rigidbody.freezeRotation = true; + if (GetComponent()) + GetComponent().freezeRotation = true; } diff --git a/Scripts/Editor/SpriteBackgroundRemover.cs b/Scripts/Editor/SpriteBackgroundRemover.cs index 1d9f44b..9104491 100644 --- a/Scripts/Editor/SpriteBackgroundRemover.cs +++ b/Scripts/Editor/SpriteBackgroundRemover.cs @@ -12,12 +12,12 @@ public class SpriteBackgroundRemover : EditorWindow Texture2D img; Texture2D newImg; Color colorToRemove = Color.magenta; - public static SpriteBackgroundRemove win; + public static SpriteBackgroundRemover win; [MenuItem("Window/Tools/Alpha-fy Images")] static void Init() { - win = ScriptableObject.CreateInstance(typeof(SpriteBackgroundRemove)) as SpriteBackgroundRemove; + win = ScriptableObject.CreateInstance(typeof(SpriteBackgroundRemover)) as SpriteBackgroundRemover; win.minSize = new Vector2(300, 350); win.ShowUtility(); } diff --git a/Scripts/Helpers/Screenshot/GrabDesktop.cs b/Scripts/Helpers/Screenshot/GrabDesktop.cs index 03f7153..51cc65f 100644 --- a/Scripts/Helpers/Screenshot/GrabDesktop.cs +++ b/Scripts/Helpers/Screenshot/GrabDesktop.cs @@ -1,29 +1,55 @@ using UnityEngine; -using System.Collections; -using System.Drawing; -using Screen = System.Windows.Forms.Screen; + using Application = UnityEngine.Application; -using System.Drawing.Imaging; +using System; +using System.Runtime.InteropServices; // Drag windows desktop image using System.Drawing.dll // guide on using System.Drawing.dll in unity : http://answers.unity3d.com/answers/253571/view.html +/// +/// Instructions: +/// 1.- Uncomment the code below +/// 2.- Create a "Plugins" folder in your project +/// 3.- Import the System.Drawing.dll and System.Windows.Forms.dll from Unity_Location\Editor\Data\Mono\lib\mono\2.0 +/// + +//Uncomment this: + +/* +//using System.Windows.Forms.Screen; +//using System.Drawing; +//using System.Drawing.Imaging; public class GrabDesktop : MonoBehaviour { - void Start() + [DllImport("kernel32", SetLastError = true)] + static extern IntPtr LoadLibrary(string lpFileName); + + static bool CheckLibrary(string fileName) + { + return LoadLibrary(fileName) == IntPtr.Zero; + } + private void Start() { - // screenshot source: http://stackoverflow.com/a/363008/5452781 + try + { + // screenshot source: http://stackoverflow.com/a/363008/5452781 - //Create a new bitmap. - var bmpScreenshot = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppArgb); + //Create a new bitmap. + var bmpScreenshot = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppArgb); - // Create a graphics object from the bitmap. - var gfxScreenshot = System.Drawing.Graphics.FromImage(bmpScreenshot); + // Create a graphics object from the bitmap. + var gfxScreenshot = System.Drawing.Graphics.FromImage(bmpScreenshot); - // Take the screenshot from the upper left corner to the right bottom corner. - gfxScreenshot.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy); + // Take the screenshot from the upper left corner to the right bottom corner. + gfxScreenshot.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy); - // Save the screenshot to the specified path that the user has chosen. - bmpScreenshot.Save(Application.dataPath + "/Screenshot.png", ImageFormat.Png); + // Save the screenshot to the specified path that the user has chosen. + bmpScreenshot.Save(Application.dataPath + "/Screenshot.png", ImageFormat.Png); + }catch(Exception e) { + Debug.LogError("You must import the dll to the project, refer to the instructions in the Script for more details"); + } + } } +*/ diff --git a/Scripts/StandardAssets/Effects/ImageEffects/Scripts/ColorCorrectionCurvesLayers.cs b/Scripts/StandardAssets/Effects/ImageEffects/Scripts/ColorCorrectionCurvesLayers.cs index a71557c..f97eeda 100644 --- a/Scripts/StandardAssets/Effects/ImageEffects/Scripts/ColorCorrectionCurvesLayers.cs +++ b/Scripts/StandardAssets/Effects/ImageEffects/Scripts/ColorCorrectionCurvesLayers.cs @@ -3,7 +3,9 @@ // Usage: Place this file into /Standard Assets/Effects/ImageEffects/Scripts/-folder // Requires: https://github.com/UnityCommunity/UnityLibrary/blob/master/Scripts/Editor/ImageEffects/ColorCorrectionCurvesEditorLayers +// Deprecated for the post-processing stack +#if !UNITY_5_3_OR_NEWER namespace UnityStandardAssets.ImageEffects { [ExecuteInEditMode] @@ -58,7 +60,7 @@ public enum ColorCorrectionMode private Camera _camera; - new void Start () + void Start () { base.Start (); updateTexturesOnStartup = true; @@ -230,3 +232,4 @@ Camera GetTmpCam() } } } +#endif diff --git a/Shaders/ImageEffects/GrayscaleLayers.cs b/Shaders/ImageEffects/GrayscaleLayers.cs index bb26764..47f7bd5 100644 --- a/Shaders/ImageEffects/GrayscaleLayers.cs +++ b/Shaders/ImageEffects/GrayscaleLayers.cs @@ -4,8 +4,11 @@ // Grayscale effect, with added ExcludeLayer option // Usage: Attach this script to camera, Select excludeLayers, Set your excluded objects to that layer + +#if !UNITY_5_3_OR_NEWER namespace UnityStandardAssets.ImageEffects { + [ExecuteInEditMode] [AddComponentMenu("Image Effects/Color Adjustments/Grayscale")] public class GrayscaleLayers : ImageEffectBase @@ -72,3 +75,4 @@ Camera GetTmpCam() } } } +#endif From fead9c81815a2930513299b4fdf937b58022605c Mon Sep 17 00:00:00 2001 From: lootheo Date: Sat, 22 Jul 2017 06:21:08 -0500 Subject: [PATCH 066/231] -Small fix to TileMapHierarchyHelper --- Scripts/2D/Tilemaps/TileMapHierarchyHelper.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Scripts/2D/Tilemaps/TileMapHierarchyHelper.cs b/Scripts/2D/Tilemaps/TileMapHierarchyHelper.cs index fdfc17b..2176e9d 100644 --- a/Scripts/2D/Tilemaps/TileMapHierarchyHelper.cs +++ b/Scripts/2D/Tilemaps/TileMapHierarchyHelper.cs @@ -75,7 +75,7 @@ static void MoveInHierarchy(GameObject go, int delta) } } #else -public class RandomTiles : MonoBehaviour +public class TileMapHierarchyHelper : MonoBehaviour { public void Start() { From df9377c7efc5db4d6301af4fdba809c91bae4026 Mon Sep 17 00:00:00 2001 From: EmpireWorld Date: Sun, 23 Jul 2017 11:27:22 +0430 Subject: [PATCH 067/231] Create Unity Project --- .gitignore | 45 ++ .../Scripts}/2D/Camera/PixelPerfectCamera.cs | 0 .../Scripts}/2D/Camera/ScaleCamera.cs | 0 .../2D/Colliders/ScreenEdgeColliders.cs | 0 {Scripts => Assets/Scripts}/2D/Follow2D.cs | 0 .../2D/Tilemaps/Editor/TilemapLayerHelper.cs | 0 .../Scripts}/2D/Tilemaps/Icons/.gitkeep | 0 .../2D/Tilemaps/Icons/icon_DownArrow2.png | Bin .../2D/Tilemaps/Icons/icon_UpArrow2.png | Bin .../2D/Tilemaps/Icons/icon_tilemap.png | Bin .../Tilemaps/Icons/icon_tilemap_disabled.png | Bin .../Scripts}/2D/Tilemaps/RandomTiles.cs | 0 .../2D/Tilemaps/TileMapHierarchyHelper.cs | 0 .../AssetBundles/AssetBundleLoader.cs | 0 .../Scripts}/Camera/CameraShake.cs | 0 .../Scripts}/Camera/CameraSwitcher.cs | 0 .../Scripts}/Camera/SmoothMouseLook.cs | 0 .../Camera/SmoothMouseLookAveraged.cs | 0 .../Scripts}/Camera/WowCamera.cs | 0 .../Scripts}/Camera/ZoomWithMouse.cs | 0 .../Editor/BuildProcess/PostProcessBuild.cs | 0 .../Scripts}/Editor/EditorShortCutKeys.cs | 0 .../Editor/Gizmos/DrawCameraFrustumGizmos.cs | 0 .../Editor/GridGeneratorEditor.cs | 0 .../Editor/GridGenerator/GridGenerator.cs | 0 .../ColorCorrectionCurvesEditorLayers | 0 {Scripts => Assets/Scripts}/Editor/README.md | 0 .../Scripts}/Editor/SetPivot.cs | 0 .../Editor/SpriteBackgroundRemover.cs | 0 .../Scripts}/Editor/Tools/CopyPasteHelper.cs | 0 .../UI/CanvasScalerUtil/CanvasScalerUtil.cs | 0 .../CanvasScalerUtil/CanvasScalerUtil.cs.meta | 0 .../Editor/UI/CanvasScalerUtil/Editor.meta | 0 .../Editor/CanvasScalerUtilEditor.cs | 0 .../Editor/CanvasScalerUtilEditor.cs.meta | 0 .../Scripts}/Helpers/Debug/Timer.cs | 0 .../Scripts}/Helpers/DrawGLLine.cs | 0 .../Scripts}/Helpers/DrawRendererBounds.cs | 0 .../Scripts}/Helpers/Drawing/DrawCrossHair.cs | 0 .../Scripts}/Helpers/FPSCounter.cs | 0 .../Helpers/FileSystem/FileSystemWatch.cs | 0 .../Helpers/FileSystem/OpenExternalFile.cs | 0 .../Helpers/Screenshot/GrabDesktop.cs | 0 .../Helpers/String/StringOperationUtil.cs | 0 .../Scripts}/Helpers/Version/GetVersion.cs | 0 .../Scripts}/Misc/Messaging/Callback.cs | 0 .../Scripts}/Misc/Messaging/Callback.cs.meta | 0 .../Scripts}/Misc/Messaging/Messenger.cs | 0 .../Scripts}/Misc/Messaging/Messenger.cs.meta | 0 .../Misc/Messaging/MessengerUnitTest.cs | 0 .../Misc/Messaging/MessengerUnitTest.cs.meta | 0 .../Scripts}/Misc/Messaging/README.md | 0 .../Scripts}/Misc/MeteorRing.cs | 0 .../Scripts}/Misc/TexturePixels2Quads.cs | 0 {Scripts => Assets/Scripts}/README.md | 0 .../Scripts/ColorCorrectionCurvesLayers.cs | 0 .../Scripts}/Threading/ThreadPoolTest.cs | 0 .../Debug/DebugNormalsTangents.shader | 0 .../Debug/LerpColorNearToFarPlane.shader | 0 .../Effects/2D/ExplosionCircle.shader | 0 .../Shaders}/Effects/AlphaBlendMasked.shader | 0 .../Shaders}/Effects/Glow.shader | 0 .../Shaders}/Effects/Highlight.shader | 0 .../Shaders}/Effects/ToonIce.shader | 0 .../Shaders}/Effects/WireFrame.shader | 0 .../Shaders}/ImageEffects/GrayscaleLayers.cs | 0 .../Shaders}/Mask/DepthMask.shader | 0 {Shaders => Assets/Shaders}/README.md | 0 .../Reflective/BumpedSpecularFresnel.shader | 0 .../ReliefMapping/ReliefMapping.shader | 0 .../Shaders}/SkyBox/Cubemap-Simple.shader | 0 .../Shaders}/Sprites/SpriteDropShadow.shader | 0 .../Shaders}/Sprites/SpriteHDRBloom.shader | 0 .../Terrain/Splatmask4Textures.shader | 0 .../Terrain/Trees/Unity-BillboardTree.shader | 0 .../TextureMapping/Equirectangular.shader | 0 .../Shaders}/UI/UI_Always_On_Top.shader | 0 .../Unlit/UnlitTransparentColor.shader | 0 .../UnlitTransparentColorGradient.shader | 0 .../Shaders}/Vertex/UnlitFakeCurved.shader | 0 .../UnlitTransparentColorGradient.shader | 0 .../Shaders}/Vertex/VertexColorMesh.shader | 0 ProjectSettings/AudioManager.asset | 17 + ProjectSettings/ClusterInputManager.asset | 6 + ProjectSettings/DynamicsManager.asset | 19 + ProjectSettings/EditorBuildSettings.asset | 7 + ProjectSettings/EditorSettings.asset | 16 + ProjectSettings/GraphicsSettings.asset | 61 ++ ProjectSettings/InputManager.asset | 295 +++++++++ ProjectSettings/NavMeshAreas.asset | 89 +++ ProjectSettings/NetworkManager.asset | 8 + ProjectSettings/Physics2DSettings.asset | 36 ++ ProjectSettings/ProjectSettings.asset | 594 ++++++++++++++++++ ProjectSettings/ProjectVersion.txt | 1 + ProjectSettings/QualitySettings.asset | 193 ++++++ ProjectSettings/TagManager.asset | 43 ++ ProjectSettings/TimeManager.asset | 9 + ProjectSettings/UnityConnectSettings.asset | 34 + 98 files changed, 1473 insertions(+) create mode 100644 .gitignore rename {Scripts => Assets/Scripts}/2D/Camera/PixelPerfectCamera.cs (100%) rename {Scripts => Assets/Scripts}/2D/Camera/ScaleCamera.cs (100%) rename {Scripts => Assets/Scripts}/2D/Colliders/ScreenEdgeColliders.cs (100%) rename {Scripts => Assets/Scripts}/2D/Follow2D.cs (100%) rename {Scripts => Assets/Scripts}/2D/Tilemaps/Editor/TilemapLayerHelper.cs (100%) rename {Scripts => Assets/Scripts}/2D/Tilemaps/Icons/.gitkeep (100%) rename {Scripts => Assets/Scripts}/2D/Tilemaps/Icons/icon_DownArrow2.png (100%) rename {Scripts => Assets/Scripts}/2D/Tilemaps/Icons/icon_UpArrow2.png (100%) rename {Scripts => Assets/Scripts}/2D/Tilemaps/Icons/icon_tilemap.png (100%) rename {Scripts => Assets/Scripts}/2D/Tilemaps/Icons/icon_tilemap_disabled.png (100%) rename {Scripts => Assets/Scripts}/2D/Tilemaps/RandomTiles.cs (100%) rename {Scripts => Assets/Scripts}/2D/Tilemaps/TileMapHierarchyHelper.cs (100%) rename {Scripts => Assets/Scripts}/AssetBundles/AssetBundleLoader.cs (100%) rename {Scripts => Assets/Scripts}/Camera/CameraShake.cs (100%) rename {Scripts => Assets/Scripts}/Camera/CameraSwitcher.cs (100%) rename {Scripts => Assets/Scripts}/Camera/SmoothMouseLook.cs (100%) rename {Scripts => Assets/Scripts}/Camera/SmoothMouseLookAveraged.cs (100%) rename {Scripts => Assets/Scripts}/Camera/WowCamera.cs (100%) rename {Scripts => Assets/Scripts}/Camera/ZoomWithMouse.cs (100%) rename {Scripts => Assets/Scripts}/Editor/BuildProcess/PostProcessBuild.cs (100%) rename {Scripts => Assets/Scripts}/Editor/EditorShortCutKeys.cs (100%) rename {Scripts => Assets/Scripts}/Editor/Gizmos/DrawCameraFrustumGizmos.cs (100%) rename {Scripts => Assets/Scripts}/Editor/GridGenerator/Editor/GridGeneratorEditor.cs (100%) rename {Scripts => Assets/Scripts}/Editor/GridGenerator/GridGenerator.cs (100%) rename {Scripts => Assets/Scripts}/Editor/ImageEffects/ColorCorrectionCurvesEditorLayers (100%) rename {Scripts => Assets/Scripts}/Editor/README.md (100%) rename {Scripts => Assets/Scripts}/Editor/SetPivot.cs (100%) rename {Scripts => Assets/Scripts}/Editor/SpriteBackgroundRemover.cs (100%) rename {Scripts => Assets/Scripts}/Editor/Tools/CopyPasteHelper.cs (100%) rename {Scripts => Assets/Scripts}/Editor/UI/CanvasScalerUtil/CanvasScalerUtil.cs (100%) rename {Scripts => Assets/Scripts}/Editor/UI/CanvasScalerUtil/CanvasScalerUtil.cs.meta (100%) rename {Scripts => Assets/Scripts}/Editor/UI/CanvasScalerUtil/Editor.meta (100%) rename {Scripts => Assets/Scripts}/Editor/UI/CanvasScalerUtil/Editor/CanvasScalerUtilEditor.cs (100%) rename {Scripts => Assets/Scripts}/Editor/UI/CanvasScalerUtil/Editor/CanvasScalerUtilEditor.cs.meta (100%) rename {Scripts => Assets/Scripts}/Helpers/Debug/Timer.cs (100%) rename {Scripts => Assets/Scripts}/Helpers/DrawGLLine.cs (100%) rename {Scripts => Assets/Scripts}/Helpers/DrawRendererBounds.cs (100%) rename {Scripts => Assets/Scripts}/Helpers/Drawing/DrawCrossHair.cs (100%) rename {Scripts => Assets/Scripts}/Helpers/FPSCounter.cs (100%) rename {Scripts => Assets/Scripts}/Helpers/FileSystem/FileSystemWatch.cs (100%) rename {Scripts => Assets/Scripts}/Helpers/FileSystem/OpenExternalFile.cs (100%) rename {Scripts => Assets/Scripts}/Helpers/Screenshot/GrabDesktop.cs (100%) rename {Scripts => Assets/Scripts}/Helpers/String/StringOperationUtil.cs (100%) rename {Scripts => Assets/Scripts}/Helpers/Version/GetVersion.cs (100%) rename {Scripts => Assets/Scripts}/Misc/Messaging/Callback.cs (100%) rename {Scripts => Assets/Scripts}/Misc/Messaging/Callback.cs.meta (100%) rename {Scripts => Assets/Scripts}/Misc/Messaging/Messenger.cs (100%) rename {Scripts => Assets/Scripts}/Misc/Messaging/Messenger.cs.meta (100%) rename {Scripts => Assets/Scripts}/Misc/Messaging/MessengerUnitTest.cs (100%) rename {Scripts => Assets/Scripts}/Misc/Messaging/MessengerUnitTest.cs.meta (100%) rename {Scripts => Assets/Scripts}/Misc/Messaging/README.md (100%) rename {Scripts => Assets/Scripts}/Misc/MeteorRing.cs (100%) rename {Scripts => Assets/Scripts}/Misc/TexturePixels2Quads.cs (100%) rename {Scripts => Assets/Scripts}/README.md (100%) rename {Scripts => Assets/Scripts}/StandardAssets/Effects/ImageEffects/Scripts/ColorCorrectionCurvesLayers.cs (100%) rename {Scripts => Assets/Scripts}/Threading/ThreadPoolTest.cs (100%) rename {Shaders => Assets/Shaders}/Debug/DebugNormalsTangents.shader (100%) rename {Shaders => Assets/Shaders}/Debug/LerpColorNearToFarPlane.shader (100%) rename {Shaders => Assets/Shaders}/Effects/2D/ExplosionCircle.shader (100%) rename {Shaders => Assets/Shaders}/Effects/AlphaBlendMasked.shader (100%) rename {Shaders => Assets/Shaders}/Effects/Glow.shader (100%) rename {Shaders => Assets/Shaders}/Effects/Highlight.shader (100%) rename {Shaders => Assets/Shaders}/Effects/ToonIce.shader (100%) rename {Shaders => Assets/Shaders}/Effects/WireFrame.shader (100%) rename {Shaders => Assets/Shaders}/ImageEffects/GrayscaleLayers.cs (100%) rename {Shaders => Assets/Shaders}/Mask/DepthMask.shader (100%) rename {Shaders => Assets/Shaders}/README.md (100%) rename {Shaders => Assets/Shaders}/Reflective/BumpedSpecularFresnel.shader (100%) rename {Shaders => Assets/Shaders}/ReliefMapping/ReliefMapping.shader (100%) rename {Shaders => Assets/Shaders}/SkyBox/Cubemap-Simple.shader (100%) rename {Shaders => Assets/Shaders}/Sprites/SpriteDropShadow.shader (100%) rename {Shaders => Assets/Shaders}/Sprites/SpriteHDRBloom.shader (100%) rename {Shaders => Assets/Shaders}/Terrain/Splatmask4Textures.shader (100%) rename {Shaders => Assets/Shaders}/Terrain/Trees/Unity-BillboardTree.shader (100%) rename {Shaders => Assets/Shaders}/TextureMapping/Equirectangular.shader (100%) rename {Shaders => Assets/Shaders}/UI/UI_Always_On_Top.shader (100%) rename {Shaders => Assets/Shaders}/Unlit/UnlitTransparentColor.shader (100%) rename {Shaders => Assets/Shaders}/Unlit/UnlitTransparentColorGradient.shader (100%) rename {Shaders => Assets/Shaders}/Vertex/UnlitFakeCurved.shader (100%) rename {Shaders => Assets/Shaders}/Vertex/UnlitTransparentColorGradient.shader (100%) rename {Shaders => Assets/Shaders}/Vertex/VertexColorMesh.shader (100%) create mode 100644 ProjectSettings/AudioManager.asset create mode 100644 ProjectSettings/ClusterInputManager.asset create mode 100644 ProjectSettings/DynamicsManager.asset create mode 100644 ProjectSettings/EditorBuildSettings.asset create mode 100644 ProjectSettings/EditorSettings.asset create mode 100644 ProjectSettings/GraphicsSettings.asset create mode 100644 ProjectSettings/InputManager.asset create mode 100644 ProjectSettings/NavMeshAreas.asset create mode 100644 ProjectSettings/NetworkManager.asset create mode 100644 ProjectSettings/Physics2DSettings.asset create mode 100644 ProjectSettings/ProjectSettings.asset create mode 100644 ProjectSettings/ProjectVersion.txt create mode 100644 ProjectSettings/QualitySettings.asset create mode 100644 ProjectSettings/TagManager.asset create mode 100644 ProjectSettings/TimeManager.asset create mode 100644 ProjectSettings/UnityConnectSettings.asset diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bc36673 --- /dev/null +++ b/.gitignore @@ -0,0 +1,45 @@ +### Unity ### +/[Ll]ibrary/ +/[Tt]emp/ +/[Oo]bj/ +/[Bb]uild/ +/[Bb]uilds/ +/Assets/AssetStoreTools* + +# Visual Studio 2015 cache directory +/.vs/ + +# Autogenerated VS/MD/Consulo solution and project files +ExportedObj/ +.consulo/ +*.csproj +*.unityproj +*.sln +*.suo +*.tmp +*.user +*.userprefs +*.pidb +*.booproj +*.svd +*.pdb + +# Unity3D generated meta files +*.pidb.meta + +# Unity3D Generated File On Crash Reports +sysinfo.txt + +# Builds +*.apk +*.unitypackage + +# OS Specific +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +Icon? +ehthumbs.db +Thumbs.db \ No newline at end of file diff --git a/Scripts/2D/Camera/PixelPerfectCamera.cs b/Assets/Scripts/2D/Camera/PixelPerfectCamera.cs similarity index 100% rename from Scripts/2D/Camera/PixelPerfectCamera.cs rename to Assets/Scripts/2D/Camera/PixelPerfectCamera.cs diff --git a/Scripts/2D/Camera/ScaleCamera.cs b/Assets/Scripts/2D/Camera/ScaleCamera.cs similarity index 100% rename from Scripts/2D/Camera/ScaleCamera.cs rename to Assets/Scripts/2D/Camera/ScaleCamera.cs diff --git a/Scripts/2D/Colliders/ScreenEdgeColliders.cs b/Assets/Scripts/2D/Colliders/ScreenEdgeColliders.cs similarity index 100% rename from Scripts/2D/Colliders/ScreenEdgeColliders.cs rename to Assets/Scripts/2D/Colliders/ScreenEdgeColliders.cs diff --git a/Scripts/2D/Follow2D.cs b/Assets/Scripts/2D/Follow2D.cs similarity index 100% rename from Scripts/2D/Follow2D.cs rename to Assets/Scripts/2D/Follow2D.cs diff --git a/Scripts/2D/Tilemaps/Editor/TilemapLayerHelper.cs b/Assets/Scripts/2D/Tilemaps/Editor/TilemapLayerHelper.cs similarity index 100% rename from Scripts/2D/Tilemaps/Editor/TilemapLayerHelper.cs rename to Assets/Scripts/2D/Tilemaps/Editor/TilemapLayerHelper.cs diff --git a/Scripts/2D/Tilemaps/Icons/.gitkeep b/Assets/Scripts/2D/Tilemaps/Icons/.gitkeep similarity index 100% rename from Scripts/2D/Tilemaps/Icons/.gitkeep rename to Assets/Scripts/2D/Tilemaps/Icons/.gitkeep diff --git a/Scripts/2D/Tilemaps/Icons/icon_DownArrow2.png b/Assets/Scripts/2D/Tilemaps/Icons/icon_DownArrow2.png similarity index 100% rename from Scripts/2D/Tilemaps/Icons/icon_DownArrow2.png rename to Assets/Scripts/2D/Tilemaps/Icons/icon_DownArrow2.png diff --git a/Scripts/2D/Tilemaps/Icons/icon_UpArrow2.png b/Assets/Scripts/2D/Tilemaps/Icons/icon_UpArrow2.png similarity index 100% rename from Scripts/2D/Tilemaps/Icons/icon_UpArrow2.png rename to Assets/Scripts/2D/Tilemaps/Icons/icon_UpArrow2.png diff --git a/Scripts/2D/Tilemaps/Icons/icon_tilemap.png b/Assets/Scripts/2D/Tilemaps/Icons/icon_tilemap.png similarity index 100% rename from Scripts/2D/Tilemaps/Icons/icon_tilemap.png rename to Assets/Scripts/2D/Tilemaps/Icons/icon_tilemap.png diff --git a/Scripts/2D/Tilemaps/Icons/icon_tilemap_disabled.png b/Assets/Scripts/2D/Tilemaps/Icons/icon_tilemap_disabled.png similarity index 100% rename from Scripts/2D/Tilemaps/Icons/icon_tilemap_disabled.png rename to Assets/Scripts/2D/Tilemaps/Icons/icon_tilemap_disabled.png diff --git a/Scripts/2D/Tilemaps/RandomTiles.cs b/Assets/Scripts/2D/Tilemaps/RandomTiles.cs similarity index 100% rename from Scripts/2D/Tilemaps/RandomTiles.cs rename to Assets/Scripts/2D/Tilemaps/RandomTiles.cs diff --git a/Scripts/2D/Tilemaps/TileMapHierarchyHelper.cs b/Assets/Scripts/2D/Tilemaps/TileMapHierarchyHelper.cs similarity index 100% rename from Scripts/2D/Tilemaps/TileMapHierarchyHelper.cs rename to Assets/Scripts/2D/Tilemaps/TileMapHierarchyHelper.cs diff --git a/Scripts/AssetBundles/AssetBundleLoader.cs b/Assets/Scripts/AssetBundles/AssetBundleLoader.cs similarity index 100% rename from Scripts/AssetBundles/AssetBundleLoader.cs rename to Assets/Scripts/AssetBundles/AssetBundleLoader.cs diff --git a/Scripts/Camera/CameraShake.cs b/Assets/Scripts/Camera/CameraShake.cs similarity index 100% rename from Scripts/Camera/CameraShake.cs rename to Assets/Scripts/Camera/CameraShake.cs diff --git a/Scripts/Camera/CameraSwitcher.cs b/Assets/Scripts/Camera/CameraSwitcher.cs similarity index 100% rename from Scripts/Camera/CameraSwitcher.cs rename to Assets/Scripts/Camera/CameraSwitcher.cs diff --git a/Scripts/Camera/SmoothMouseLook.cs b/Assets/Scripts/Camera/SmoothMouseLook.cs similarity index 100% rename from Scripts/Camera/SmoothMouseLook.cs rename to Assets/Scripts/Camera/SmoothMouseLook.cs diff --git a/Scripts/Camera/SmoothMouseLookAveraged.cs b/Assets/Scripts/Camera/SmoothMouseLookAveraged.cs similarity index 100% rename from Scripts/Camera/SmoothMouseLookAveraged.cs rename to Assets/Scripts/Camera/SmoothMouseLookAveraged.cs diff --git a/Scripts/Camera/WowCamera.cs b/Assets/Scripts/Camera/WowCamera.cs similarity index 100% rename from Scripts/Camera/WowCamera.cs rename to Assets/Scripts/Camera/WowCamera.cs diff --git a/Scripts/Camera/ZoomWithMouse.cs b/Assets/Scripts/Camera/ZoomWithMouse.cs similarity index 100% rename from Scripts/Camera/ZoomWithMouse.cs rename to Assets/Scripts/Camera/ZoomWithMouse.cs diff --git a/Scripts/Editor/BuildProcess/PostProcessBuild.cs b/Assets/Scripts/Editor/BuildProcess/PostProcessBuild.cs similarity index 100% rename from Scripts/Editor/BuildProcess/PostProcessBuild.cs rename to Assets/Scripts/Editor/BuildProcess/PostProcessBuild.cs diff --git a/Scripts/Editor/EditorShortCutKeys.cs b/Assets/Scripts/Editor/EditorShortCutKeys.cs similarity index 100% rename from Scripts/Editor/EditorShortCutKeys.cs rename to Assets/Scripts/Editor/EditorShortCutKeys.cs diff --git a/Scripts/Editor/Gizmos/DrawCameraFrustumGizmos.cs b/Assets/Scripts/Editor/Gizmos/DrawCameraFrustumGizmos.cs similarity index 100% rename from Scripts/Editor/Gizmos/DrawCameraFrustumGizmos.cs rename to Assets/Scripts/Editor/Gizmos/DrawCameraFrustumGizmos.cs diff --git a/Scripts/Editor/GridGenerator/Editor/GridGeneratorEditor.cs b/Assets/Scripts/Editor/GridGenerator/Editor/GridGeneratorEditor.cs similarity index 100% rename from Scripts/Editor/GridGenerator/Editor/GridGeneratorEditor.cs rename to Assets/Scripts/Editor/GridGenerator/Editor/GridGeneratorEditor.cs diff --git a/Scripts/Editor/GridGenerator/GridGenerator.cs b/Assets/Scripts/Editor/GridGenerator/GridGenerator.cs similarity index 100% rename from Scripts/Editor/GridGenerator/GridGenerator.cs rename to Assets/Scripts/Editor/GridGenerator/GridGenerator.cs diff --git a/Scripts/Editor/ImageEffects/ColorCorrectionCurvesEditorLayers b/Assets/Scripts/Editor/ImageEffects/ColorCorrectionCurvesEditorLayers similarity index 100% rename from Scripts/Editor/ImageEffects/ColorCorrectionCurvesEditorLayers rename to Assets/Scripts/Editor/ImageEffects/ColorCorrectionCurvesEditorLayers diff --git a/Scripts/Editor/README.md b/Assets/Scripts/Editor/README.md similarity index 100% rename from Scripts/Editor/README.md rename to Assets/Scripts/Editor/README.md diff --git a/Scripts/Editor/SetPivot.cs b/Assets/Scripts/Editor/SetPivot.cs similarity index 100% rename from Scripts/Editor/SetPivot.cs rename to Assets/Scripts/Editor/SetPivot.cs diff --git a/Scripts/Editor/SpriteBackgroundRemover.cs b/Assets/Scripts/Editor/SpriteBackgroundRemover.cs similarity index 100% rename from Scripts/Editor/SpriteBackgroundRemover.cs rename to Assets/Scripts/Editor/SpriteBackgroundRemover.cs diff --git a/Scripts/Editor/Tools/CopyPasteHelper.cs b/Assets/Scripts/Editor/Tools/CopyPasteHelper.cs similarity index 100% rename from Scripts/Editor/Tools/CopyPasteHelper.cs rename to Assets/Scripts/Editor/Tools/CopyPasteHelper.cs diff --git a/Scripts/Editor/UI/CanvasScalerUtil/CanvasScalerUtil.cs b/Assets/Scripts/Editor/UI/CanvasScalerUtil/CanvasScalerUtil.cs similarity index 100% rename from Scripts/Editor/UI/CanvasScalerUtil/CanvasScalerUtil.cs rename to Assets/Scripts/Editor/UI/CanvasScalerUtil/CanvasScalerUtil.cs diff --git a/Scripts/Editor/UI/CanvasScalerUtil/CanvasScalerUtil.cs.meta b/Assets/Scripts/Editor/UI/CanvasScalerUtil/CanvasScalerUtil.cs.meta similarity index 100% rename from Scripts/Editor/UI/CanvasScalerUtil/CanvasScalerUtil.cs.meta rename to Assets/Scripts/Editor/UI/CanvasScalerUtil/CanvasScalerUtil.cs.meta diff --git a/Scripts/Editor/UI/CanvasScalerUtil/Editor.meta b/Assets/Scripts/Editor/UI/CanvasScalerUtil/Editor.meta similarity index 100% rename from Scripts/Editor/UI/CanvasScalerUtil/Editor.meta rename to Assets/Scripts/Editor/UI/CanvasScalerUtil/Editor.meta diff --git a/Scripts/Editor/UI/CanvasScalerUtil/Editor/CanvasScalerUtilEditor.cs b/Assets/Scripts/Editor/UI/CanvasScalerUtil/Editor/CanvasScalerUtilEditor.cs similarity index 100% rename from Scripts/Editor/UI/CanvasScalerUtil/Editor/CanvasScalerUtilEditor.cs rename to Assets/Scripts/Editor/UI/CanvasScalerUtil/Editor/CanvasScalerUtilEditor.cs diff --git a/Scripts/Editor/UI/CanvasScalerUtil/Editor/CanvasScalerUtilEditor.cs.meta b/Assets/Scripts/Editor/UI/CanvasScalerUtil/Editor/CanvasScalerUtilEditor.cs.meta similarity index 100% rename from Scripts/Editor/UI/CanvasScalerUtil/Editor/CanvasScalerUtilEditor.cs.meta rename to Assets/Scripts/Editor/UI/CanvasScalerUtil/Editor/CanvasScalerUtilEditor.cs.meta diff --git a/Scripts/Helpers/Debug/Timer.cs b/Assets/Scripts/Helpers/Debug/Timer.cs similarity index 100% rename from Scripts/Helpers/Debug/Timer.cs rename to Assets/Scripts/Helpers/Debug/Timer.cs diff --git a/Scripts/Helpers/DrawGLLine.cs b/Assets/Scripts/Helpers/DrawGLLine.cs similarity index 100% rename from Scripts/Helpers/DrawGLLine.cs rename to Assets/Scripts/Helpers/DrawGLLine.cs diff --git a/Scripts/Helpers/DrawRendererBounds.cs b/Assets/Scripts/Helpers/DrawRendererBounds.cs similarity index 100% rename from Scripts/Helpers/DrawRendererBounds.cs rename to Assets/Scripts/Helpers/DrawRendererBounds.cs diff --git a/Scripts/Helpers/Drawing/DrawCrossHair.cs b/Assets/Scripts/Helpers/Drawing/DrawCrossHair.cs similarity index 100% rename from Scripts/Helpers/Drawing/DrawCrossHair.cs rename to Assets/Scripts/Helpers/Drawing/DrawCrossHair.cs diff --git a/Scripts/Helpers/FPSCounter.cs b/Assets/Scripts/Helpers/FPSCounter.cs similarity index 100% rename from Scripts/Helpers/FPSCounter.cs rename to Assets/Scripts/Helpers/FPSCounter.cs diff --git a/Scripts/Helpers/FileSystem/FileSystemWatch.cs b/Assets/Scripts/Helpers/FileSystem/FileSystemWatch.cs similarity index 100% rename from Scripts/Helpers/FileSystem/FileSystemWatch.cs rename to Assets/Scripts/Helpers/FileSystem/FileSystemWatch.cs diff --git a/Scripts/Helpers/FileSystem/OpenExternalFile.cs b/Assets/Scripts/Helpers/FileSystem/OpenExternalFile.cs similarity index 100% rename from Scripts/Helpers/FileSystem/OpenExternalFile.cs rename to Assets/Scripts/Helpers/FileSystem/OpenExternalFile.cs diff --git a/Scripts/Helpers/Screenshot/GrabDesktop.cs b/Assets/Scripts/Helpers/Screenshot/GrabDesktop.cs similarity index 100% rename from Scripts/Helpers/Screenshot/GrabDesktop.cs rename to Assets/Scripts/Helpers/Screenshot/GrabDesktop.cs diff --git a/Scripts/Helpers/String/StringOperationUtil.cs b/Assets/Scripts/Helpers/String/StringOperationUtil.cs similarity index 100% rename from Scripts/Helpers/String/StringOperationUtil.cs rename to Assets/Scripts/Helpers/String/StringOperationUtil.cs diff --git a/Scripts/Helpers/Version/GetVersion.cs b/Assets/Scripts/Helpers/Version/GetVersion.cs similarity index 100% rename from Scripts/Helpers/Version/GetVersion.cs rename to Assets/Scripts/Helpers/Version/GetVersion.cs diff --git a/Scripts/Misc/Messaging/Callback.cs b/Assets/Scripts/Misc/Messaging/Callback.cs similarity index 100% rename from Scripts/Misc/Messaging/Callback.cs rename to Assets/Scripts/Misc/Messaging/Callback.cs diff --git a/Scripts/Misc/Messaging/Callback.cs.meta b/Assets/Scripts/Misc/Messaging/Callback.cs.meta similarity index 100% rename from Scripts/Misc/Messaging/Callback.cs.meta rename to Assets/Scripts/Misc/Messaging/Callback.cs.meta diff --git a/Scripts/Misc/Messaging/Messenger.cs b/Assets/Scripts/Misc/Messaging/Messenger.cs similarity index 100% rename from Scripts/Misc/Messaging/Messenger.cs rename to Assets/Scripts/Misc/Messaging/Messenger.cs diff --git a/Scripts/Misc/Messaging/Messenger.cs.meta b/Assets/Scripts/Misc/Messaging/Messenger.cs.meta similarity index 100% rename from Scripts/Misc/Messaging/Messenger.cs.meta rename to Assets/Scripts/Misc/Messaging/Messenger.cs.meta diff --git a/Scripts/Misc/Messaging/MessengerUnitTest.cs b/Assets/Scripts/Misc/Messaging/MessengerUnitTest.cs similarity index 100% rename from Scripts/Misc/Messaging/MessengerUnitTest.cs rename to Assets/Scripts/Misc/Messaging/MessengerUnitTest.cs diff --git a/Scripts/Misc/Messaging/MessengerUnitTest.cs.meta b/Assets/Scripts/Misc/Messaging/MessengerUnitTest.cs.meta similarity index 100% rename from Scripts/Misc/Messaging/MessengerUnitTest.cs.meta rename to Assets/Scripts/Misc/Messaging/MessengerUnitTest.cs.meta diff --git a/Scripts/Misc/Messaging/README.md b/Assets/Scripts/Misc/Messaging/README.md similarity index 100% rename from Scripts/Misc/Messaging/README.md rename to Assets/Scripts/Misc/Messaging/README.md diff --git a/Scripts/Misc/MeteorRing.cs b/Assets/Scripts/Misc/MeteorRing.cs similarity index 100% rename from Scripts/Misc/MeteorRing.cs rename to Assets/Scripts/Misc/MeteorRing.cs diff --git a/Scripts/Misc/TexturePixels2Quads.cs b/Assets/Scripts/Misc/TexturePixels2Quads.cs similarity index 100% rename from Scripts/Misc/TexturePixels2Quads.cs rename to Assets/Scripts/Misc/TexturePixels2Quads.cs diff --git a/Scripts/README.md b/Assets/Scripts/README.md similarity index 100% rename from Scripts/README.md rename to Assets/Scripts/README.md diff --git a/Scripts/StandardAssets/Effects/ImageEffects/Scripts/ColorCorrectionCurvesLayers.cs b/Assets/Scripts/StandardAssets/Effects/ImageEffects/Scripts/ColorCorrectionCurvesLayers.cs similarity index 100% rename from Scripts/StandardAssets/Effects/ImageEffects/Scripts/ColorCorrectionCurvesLayers.cs rename to Assets/Scripts/StandardAssets/Effects/ImageEffects/Scripts/ColorCorrectionCurvesLayers.cs diff --git a/Scripts/Threading/ThreadPoolTest.cs b/Assets/Scripts/Threading/ThreadPoolTest.cs similarity index 100% rename from Scripts/Threading/ThreadPoolTest.cs rename to Assets/Scripts/Threading/ThreadPoolTest.cs diff --git a/Shaders/Debug/DebugNormalsTangents.shader b/Assets/Shaders/Debug/DebugNormalsTangents.shader similarity index 100% rename from Shaders/Debug/DebugNormalsTangents.shader rename to Assets/Shaders/Debug/DebugNormalsTangents.shader diff --git a/Shaders/Debug/LerpColorNearToFarPlane.shader b/Assets/Shaders/Debug/LerpColorNearToFarPlane.shader similarity index 100% rename from Shaders/Debug/LerpColorNearToFarPlane.shader rename to Assets/Shaders/Debug/LerpColorNearToFarPlane.shader diff --git a/Shaders/Effects/2D/ExplosionCircle.shader b/Assets/Shaders/Effects/2D/ExplosionCircle.shader similarity index 100% rename from Shaders/Effects/2D/ExplosionCircle.shader rename to Assets/Shaders/Effects/2D/ExplosionCircle.shader diff --git a/Shaders/Effects/AlphaBlendMasked.shader b/Assets/Shaders/Effects/AlphaBlendMasked.shader similarity index 100% rename from Shaders/Effects/AlphaBlendMasked.shader rename to Assets/Shaders/Effects/AlphaBlendMasked.shader diff --git a/Shaders/Effects/Glow.shader b/Assets/Shaders/Effects/Glow.shader similarity index 100% rename from Shaders/Effects/Glow.shader rename to Assets/Shaders/Effects/Glow.shader diff --git a/Shaders/Effects/Highlight.shader b/Assets/Shaders/Effects/Highlight.shader similarity index 100% rename from Shaders/Effects/Highlight.shader rename to Assets/Shaders/Effects/Highlight.shader diff --git a/Shaders/Effects/ToonIce.shader b/Assets/Shaders/Effects/ToonIce.shader similarity index 100% rename from Shaders/Effects/ToonIce.shader rename to Assets/Shaders/Effects/ToonIce.shader diff --git a/Shaders/Effects/WireFrame.shader b/Assets/Shaders/Effects/WireFrame.shader similarity index 100% rename from Shaders/Effects/WireFrame.shader rename to Assets/Shaders/Effects/WireFrame.shader diff --git a/Shaders/ImageEffects/GrayscaleLayers.cs b/Assets/Shaders/ImageEffects/GrayscaleLayers.cs similarity index 100% rename from Shaders/ImageEffects/GrayscaleLayers.cs rename to Assets/Shaders/ImageEffects/GrayscaleLayers.cs diff --git a/Shaders/Mask/DepthMask.shader b/Assets/Shaders/Mask/DepthMask.shader similarity index 100% rename from Shaders/Mask/DepthMask.shader rename to Assets/Shaders/Mask/DepthMask.shader diff --git a/Shaders/README.md b/Assets/Shaders/README.md similarity index 100% rename from Shaders/README.md rename to Assets/Shaders/README.md diff --git a/Shaders/Reflective/BumpedSpecularFresnel.shader b/Assets/Shaders/Reflective/BumpedSpecularFresnel.shader similarity index 100% rename from Shaders/Reflective/BumpedSpecularFresnel.shader rename to Assets/Shaders/Reflective/BumpedSpecularFresnel.shader diff --git a/Shaders/ReliefMapping/ReliefMapping.shader b/Assets/Shaders/ReliefMapping/ReliefMapping.shader similarity index 100% rename from Shaders/ReliefMapping/ReliefMapping.shader rename to Assets/Shaders/ReliefMapping/ReliefMapping.shader diff --git a/Shaders/SkyBox/Cubemap-Simple.shader b/Assets/Shaders/SkyBox/Cubemap-Simple.shader similarity index 100% rename from Shaders/SkyBox/Cubemap-Simple.shader rename to Assets/Shaders/SkyBox/Cubemap-Simple.shader diff --git a/Shaders/Sprites/SpriteDropShadow.shader b/Assets/Shaders/Sprites/SpriteDropShadow.shader similarity index 100% rename from Shaders/Sprites/SpriteDropShadow.shader rename to Assets/Shaders/Sprites/SpriteDropShadow.shader diff --git a/Shaders/Sprites/SpriteHDRBloom.shader b/Assets/Shaders/Sprites/SpriteHDRBloom.shader similarity index 100% rename from Shaders/Sprites/SpriteHDRBloom.shader rename to Assets/Shaders/Sprites/SpriteHDRBloom.shader diff --git a/Shaders/Terrain/Splatmask4Textures.shader b/Assets/Shaders/Terrain/Splatmask4Textures.shader similarity index 100% rename from Shaders/Terrain/Splatmask4Textures.shader rename to Assets/Shaders/Terrain/Splatmask4Textures.shader diff --git a/Shaders/Terrain/Trees/Unity-BillboardTree.shader b/Assets/Shaders/Terrain/Trees/Unity-BillboardTree.shader similarity index 100% rename from Shaders/Terrain/Trees/Unity-BillboardTree.shader rename to Assets/Shaders/Terrain/Trees/Unity-BillboardTree.shader diff --git a/Shaders/TextureMapping/Equirectangular.shader b/Assets/Shaders/TextureMapping/Equirectangular.shader similarity index 100% rename from Shaders/TextureMapping/Equirectangular.shader rename to Assets/Shaders/TextureMapping/Equirectangular.shader diff --git a/Shaders/UI/UI_Always_On_Top.shader b/Assets/Shaders/UI/UI_Always_On_Top.shader similarity index 100% rename from Shaders/UI/UI_Always_On_Top.shader rename to Assets/Shaders/UI/UI_Always_On_Top.shader diff --git a/Shaders/Unlit/UnlitTransparentColor.shader b/Assets/Shaders/Unlit/UnlitTransparentColor.shader similarity index 100% rename from Shaders/Unlit/UnlitTransparentColor.shader rename to Assets/Shaders/Unlit/UnlitTransparentColor.shader diff --git a/Shaders/Unlit/UnlitTransparentColorGradient.shader b/Assets/Shaders/Unlit/UnlitTransparentColorGradient.shader similarity index 100% rename from Shaders/Unlit/UnlitTransparentColorGradient.shader rename to Assets/Shaders/Unlit/UnlitTransparentColorGradient.shader diff --git a/Shaders/Vertex/UnlitFakeCurved.shader b/Assets/Shaders/Vertex/UnlitFakeCurved.shader similarity index 100% rename from Shaders/Vertex/UnlitFakeCurved.shader rename to Assets/Shaders/Vertex/UnlitFakeCurved.shader diff --git a/Shaders/Vertex/UnlitTransparentColorGradient.shader b/Assets/Shaders/Vertex/UnlitTransparentColorGradient.shader similarity index 100% rename from Shaders/Vertex/UnlitTransparentColorGradient.shader rename to Assets/Shaders/Vertex/UnlitTransparentColorGradient.shader diff --git a/Shaders/Vertex/VertexColorMesh.shader b/Assets/Shaders/Vertex/VertexColorMesh.shader similarity index 100% rename from Shaders/Vertex/VertexColorMesh.shader rename to Assets/Shaders/Vertex/VertexColorMesh.shader diff --git a/ProjectSettings/AudioManager.asset b/ProjectSettings/AudioManager.asset new file mode 100644 index 0000000..da61125 --- /dev/null +++ b/ProjectSettings/AudioManager.asset @@ -0,0 +1,17 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!11 &1 +AudioManager: + m_ObjectHideFlags: 0 + m_Volume: 1 + Rolloff Scale: 1 + Doppler Factor: 1 + Default Speaker Mode: 2 + m_SampleRate: 0 + m_DSPBufferSize: 0 + m_VirtualVoiceCount: 512 + m_RealVoiceCount: 32 + m_SpatializerPlugin: + m_AmbisonicDecoderPlugin: + m_DisableAudio: 0 + m_VirtualizeEffects: 1 diff --git a/ProjectSettings/ClusterInputManager.asset b/ProjectSettings/ClusterInputManager.asset new file mode 100644 index 0000000..e7886b2 --- /dev/null +++ b/ProjectSettings/ClusterInputManager.asset @@ -0,0 +1,6 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!236 &1 +ClusterInputManager: + m_ObjectHideFlags: 0 + m_Inputs: [] diff --git a/ProjectSettings/DynamicsManager.asset b/ProjectSettings/DynamicsManager.asset new file mode 100644 index 0000000..1931946 --- /dev/null +++ b/ProjectSettings/DynamicsManager.asset @@ -0,0 +1,19 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!55 &1 +PhysicsManager: + m_ObjectHideFlags: 0 + serializedVersion: 3 + m_Gravity: {x: 0, y: -9.81, z: 0} + m_DefaultMaterial: {fileID: 0} + m_BounceThreshold: 2 + m_SleepThreshold: 0.005 + m_DefaultContactOffset: 0.01 + m_DefaultSolverIterations: 6 + m_DefaultSolverVelocityIterations: 1 + m_QueriesHitBackfaces: 0 + m_QueriesHitTriggers: 1 + m_EnableAdaptiveForce: 0 + m_EnablePCM: 1 + m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + m_AutoSimulation: 1 diff --git a/ProjectSettings/EditorBuildSettings.asset b/ProjectSettings/EditorBuildSettings.asset new file mode 100644 index 0000000..6dc24f7 --- /dev/null +++ b/ProjectSettings/EditorBuildSettings.asset @@ -0,0 +1,7 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1045 &1 +EditorBuildSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Scenes: [] diff --git a/ProjectSettings/EditorSettings.asset b/ProjectSettings/EditorSettings.asset new file mode 100644 index 0000000..f33b6fb --- /dev/null +++ b/ProjectSettings/EditorSettings.asset @@ -0,0 +1,16 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!159 &1 +EditorSettings: + m_ObjectHideFlags: 0 + serializedVersion: 4 + m_ExternalVersionControlSupport: Visible Meta Files + m_SerializationMode: 2 + m_DefaultBehaviorMode: 0 + m_SpritePackerMode: 0 + m_SpritePackerPaddingPower: 1 + m_ProjectGenerationIncludedExtensions: txt;xml;fnt;cd + m_ProjectGenerationRootNamespace: + m_UserGeneratedProjectSuffix: + m_CollabEditorSettings: + inProgressEnabled: 1 diff --git a/ProjectSettings/GraphicsSettings.asset b/ProjectSettings/GraphicsSettings.asset new file mode 100644 index 0000000..74d7b53 --- /dev/null +++ b/ProjectSettings/GraphicsSettings.asset @@ -0,0 +1,61 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!30 &1 +GraphicsSettings: + m_ObjectHideFlags: 0 + serializedVersion: 12 + m_Deferred: + m_Mode: 1 + m_Shader: {fileID: 69, guid: 0000000000000000f000000000000000, type: 0} + m_DeferredReflections: + m_Mode: 1 + m_Shader: {fileID: 74, guid: 0000000000000000f000000000000000, type: 0} + m_ScreenSpaceShadows: + m_Mode: 1 + m_Shader: {fileID: 64, guid: 0000000000000000f000000000000000, type: 0} + m_LegacyDeferred: + m_Mode: 1 + m_Shader: {fileID: 63, guid: 0000000000000000f000000000000000, type: 0} + m_DepthNormals: + m_Mode: 1 + m_Shader: {fileID: 62, guid: 0000000000000000f000000000000000, type: 0} + m_MotionVectors: + m_Mode: 1 + m_Shader: {fileID: 75, guid: 0000000000000000f000000000000000, type: 0} + m_LightHalo: + m_Mode: 1 + m_Shader: {fileID: 105, guid: 0000000000000000f000000000000000, type: 0} + m_LensFlare: + m_Mode: 1 + m_Shader: {fileID: 102, guid: 0000000000000000f000000000000000, type: 0} + m_AlwaysIncludedShaders: + - {fileID: 7, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 15104, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 15105, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 15106, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0} + m_PreloadedShaders: [] + m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000, + type: 0} + m_CustomRenderPipeline: {fileID: 0} + m_TransparencySortMode: 0 + m_TransparencySortAxis: {x: 0, y: 0, z: 1} + m_DefaultRenderingPath: 1 + m_DefaultMobileRenderingPath: 1 + m_TierSettings: [] + m_LightmapStripping: 0 + m_FogStripping: 0 + m_InstancingStripping: 0 + m_LightmapKeepPlain: 1 + m_LightmapKeepDirCombined: 1 + m_LightmapKeepDynamicPlain: 1 + m_LightmapKeepDynamicDirCombined: 1 + m_LightmapKeepShadowMask: 1 + m_LightmapKeepSubtractive: 1 + m_FogKeepLinear: 1 + m_FogKeepExp: 1 + m_FogKeepExp2: 1 + m_AlbedoSwatchInfos: [] + m_LightsUseLinearIntensity: 0 + m_LightsUseColorTemperature: 0 diff --git a/ProjectSettings/InputManager.asset b/ProjectSettings/InputManager.asset new file mode 100644 index 0000000..17c8f53 --- /dev/null +++ b/ProjectSettings/InputManager.asset @@ -0,0 +1,295 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!13 &1 +InputManager: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Axes: + - serializedVersion: 3 + m_Name: Horizontal + descriptiveName: + descriptiveNegativeName: + negativeButton: left + positiveButton: right + altNegativeButton: a + altPositiveButton: d + gravity: 3 + dead: 0.001 + sensitivity: 3 + snap: 1 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Vertical + descriptiveName: + descriptiveNegativeName: + negativeButton: down + positiveButton: up + altNegativeButton: s + altPositiveButton: w + gravity: 3 + dead: 0.001 + sensitivity: 3 + snap: 1 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire1 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left ctrl + altNegativeButton: + altPositiveButton: mouse 0 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire2 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left alt + altNegativeButton: + altPositiveButton: mouse 1 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire3 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left shift + altNegativeButton: + altPositiveButton: mouse 2 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Jump + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: space + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Mouse X + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0 + sensitivity: 0.1 + snap: 0 + invert: 0 + type: 1 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Mouse Y + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0 + sensitivity: 0.1 + snap: 0 + invert: 0 + type: 1 + axis: 1 + joyNum: 0 + - serializedVersion: 3 + m_Name: Mouse ScrollWheel + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0 + sensitivity: 0.1 + snap: 0 + invert: 0 + type: 1 + axis: 2 + joyNum: 0 + - serializedVersion: 3 + m_Name: Horizontal + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0.19 + sensitivity: 1 + snap: 0 + invert: 0 + type: 2 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Vertical + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0.19 + sensitivity: 1 + snap: 0 + invert: 1 + type: 2 + axis: 1 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire1 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 0 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire2 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 1 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire3 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 2 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Jump + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 3 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Submit + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: return + altNegativeButton: + altPositiveButton: joystick button 0 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Submit + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: enter + altNegativeButton: + altPositiveButton: space + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Cancel + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: escape + altNegativeButton: + altPositiveButton: joystick button 1 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 diff --git a/ProjectSettings/NavMeshAreas.asset b/ProjectSettings/NavMeshAreas.asset new file mode 100644 index 0000000..6dd520f --- /dev/null +++ b/ProjectSettings/NavMeshAreas.asset @@ -0,0 +1,89 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!126 &1 +NavMeshProjectSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + areas: + - name: Walkable + cost: 1 + - name: Not Walkable + cost: 1 + - name: Jump + cost: 2 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + m_LastAgentTypeID: -887442657 + m_Settings: + - serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.75 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + m_SettingNames: + - Humanoid diff --git a/ProjectSettings/NetworkManager.asset b/ProjectSettings/NetworkManager.asset new file mode 100644 index 0000000..5dc6a83 --- /dev/null +++ b/ProjectSettings/NetworkManager.asset @@ -0,0 +1,8 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!149 &1 +NetworkManager: + m_ObjectHideFlags: 0 + m_DebugLevel: 0 + m_Sendrate: 15 + m_AssetToPrefab: {} diff --git a/ProjectSettings/Physics2DSettings.asset b/ProjectSettings/Physics2DSettings.asset new file mode 100644 index 0000000..e3b2d0b --- /dev/null +++ b/ProjectSettings/Physics2DSettings.asset @@ -0,0 +1,36 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!19 &1 +Physics2DSettings: + m_ObjectHideFlags: 0 + serializedVersion: 3 + m_Gravity: {x: 0, y: -9.81} + m_DefaultMaterial: {fileID: 0} + m_VelocityIterations: 8 + m_PositionIterations: 3 + m_VelocityThreshold: 1 + m_MaxLinearCorrection: 0.2 + m_MaxAngularCorrection: 8 + m_MaxTranslationSpeed: 100 + m_MaxRotationSpeed: 360 + m_BaumgarteScale: 0.2 + m_BaumgarteTimeOfImpactScale: 0.75 + m_TimeToSleep: 0.5 + m_LinearSleepTolerance: 0.01 + m_AngularSleepTolerance: 2 + m_DefaultContactOffset: 0.01 + m_AutoSimulation: 1 + m_QueriesHitTriggers: 1 + m_QueriesStartInColliders: 1 + m_ChangeStopsCallbacks: 0 + m_CallbacksOnDisable: 1 + m_AlwaysShowColliders: 0 + m_ShowColliderSleep: 1 + m_ShowColliderContacts: 0 + m_ShowColliderAABB: 0 + m_ContactArrowScale: 0.2 + m_ColliderAwakeColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.7529412} + m_ColliderAsleepColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.36078432} + m_ColliderContactColor: {r: 1, g: 0, b: 1, a: 0.6862745} + m_ColliderAABBColor: {r: 1, g: 1, b: 0, a: 0.2509804} + m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset new file mode 100644 index 0000000..2f7c187 --- /dev/null +++ b/ProjectSettings/ProjectSettings.asset @@ -0,0 +1,594 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!129 &1 +PlayerSettings: + m_ObjectHideFlags: 0 + serializedVersion: 12 + productGUID: 36f97d821ecfac149ae5eae5c4496e56 + AndroidProfiler: 0 + defaultScreenOrientation: 4 + targetDevice: 2 + useOnDemandResources: 0 + accelerometerFrequency: 60 + companyName: DefaultCompany + productName: UnityLibrary + defaultCursor: {fileID: 0} + cursorHotspot: {x: 0, y: 0} + m_SplashScreenBackgroundColor: {r: 0.13725491, g: 0.12156863, b: 0.1254902, a: 1} + m_ShowUnitySplashScreen: 1 + m_ShowUnitySplashLogo: 1 + m_SplashScreenOverlayOpacity: 1 + m_SplashScreenAnimation: 1 + m_SplashScreenLogoStyle: 1 + m_SplashScreenDrawMode: 0 + m_SplashScreenBackgroundAnimationZoom: 1 + m_SplashScreenLogoAnimationZoom: 1 + m_SplashScreenBackgroundLandscapeAspect: 1 + m_SplashScreenBackgroundPortraitAspect: 1 + m_SplashScreenBackgroundLandscapeUvs: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + m_SplashScreenBackgroundPortraitUvs: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + m_SplashScreenLogos: [] + m_SplashScreenBackgroundLandscape: {fileID: 0} + m_SplashScreenBackgroundPortrait: {fileID: 0} + m_VirtualRealitySplashScreen: {fileID: 0} + m_HolographicTrackingLossScreen: {fileID: 0} + defaultScreenWidth: 1024 + defaultScreenHeight: 768 + defaultScreenWidthWeb: 960 + defaultScreenHeightWeb: 600 + m_StereoRenderingPath: 0 + m_ActiveColorSpace: 0 + m_MTRendering: 1 + m_MobileMTRendering: 0 + m_StackTraceTypes: 010000000100000001000000010000000100000001000000 + iosShowActivityIndicatorOnLoading: -1 + androidShowActivityIndicatorOnLoading: -1 + tizenShowActivityIndicatorOnLoading: -1 + iosAppInBackgroundBehavior: 0 + displayResolutionDialog: 1 + iosAllowHTTPDownload: 1 + allowedAutorotateToPortrait: 1 + allowedAutorotateToPortraitUpsideDown: 1 + allowedAutorotateToLandscapeRight: 1 + allowedAutorotateToLandscapeLeft: 1 + useOSAutorotation: 1 + use32BitDisplayBuffer: 1 + disableDepthAndStencilBuffers: 0 + defaultIsFullScreen: 1 + defaultIsNativeResolution: 1 + runInBackground: 0 + captureSingleScreen: 0 + muteOtherAudioSources: 0 + Prepare IOS For Recording: 0 + Force IOS Speakers When Recording: 0 + submitAnalytics: 1 + usePlayerLog: 1 + bakeCollisionMeshes: 0 + forceSingleInstance: 0 + resizableWindow: 0 + useMacAppStoreValidation: 0 + macAppStoreCategory: public.app-category.games + gpuSkinning: 0 + graphicsJobs: 0 + xboxPIXTextureCapture: 0 + xboxEnableAvatar: 0 + xboxEnableKinect: 0 + xboxEnableKinectAutoTracking: 0 + xboxEnableFitness: 0 + visibleInBackground: 1 + allowFullscreenSwitch: 1 + graphicsJobMode: 0 + macFullscreenMode: 2 + d3d9FullscreenMode: 1 + d3d11FullscreenMode: 1 + xboxSpeechDB: 0 + xboxEnableHeadOrientation: 0 + xboxEnableGuest: 0 + xboxEnablePIXSampling: 0 + n3dsDisableStereoscopicView: 0 + n3dsEnableSharedListOpt: 1 + n3dsEnableVSync: 0 + ignoreAlphaClear: 0 + xboxOneResolution: 0 + xboxOneMonoLoggingLevel: 0 + xboxOneLoggingLevel: 1 + xboxOneDisableEsram: 0 + videoMemoryForVertexBuffers: 0 + psp2PowerMode: 0 + psp2AcquireBGM: 1 + wiiUTVResolution: 0 + wiiUGamePadMSAA: 1 + wiiUSupportsNunchuk: 0 + wiiUSupportsClassicController: 0 + wiiUSupportsBalanceBoard: 0 + wiiUSupportsMotionPlus: 0 + wiiUSupportsProController: 0 + wiiUAllowScreenCapture: 1 + wiiUControllerCount: 0 + m_SupportedAspectRatios: + 4:3: 1 + 5:4: 1 + 16:10: 1 + 16:9: 1 + Others: 1 + bundleVersion: 1.0 + preloadedAssets: [] + metroInputSource: 0 + m_HolographicPauseOnTrackingLoss: 1 + xboxOneDisableKinectGpuReservation: 0 + xboxOneEnable7thCore: 0 + vrSettings: + cardboard: + depthFormat: 0 + enableTransitionView: 0 + daydream: + depthFormat: 0 + useSustainedPerformanceMode: 0 + hololens: + depthFormat: 1 + protectGraphicsMemory: 0 + useHDRDisplay: 0 + targetPixelDensity: 0 + resolutionScalingMode: 0 + applicationIdentifier: {} + buildNumber: {} + AndroidBundleVersionCode: 1 + AndroidMinSdkVersion: 16 + AndroidTargetSdkVersion: 0 + AndroidPreferredInstallLocation: 1 + aotOptions: + stripEngineCode: 1 + iPhoneStrippingLevel: 0 + iPhoneScriptCallOptimization: 0 + ForceInternetPermission: 0 + ForceSDCardPermission: 0 + CreateWallpaper: 0 + APKExpansionFiles: 0 + keepLoadedShadersAlive: 0 + StripUnusedMeshComponents: 0 + VertexChannelCompressionMask: + serializedVersion: 2 + m_Bits: 238 + iPhoneSdkVersion: 988 + iOSTargetOSVersionString: + tvOSSdkVersion: 0 + tvOSRequireExtendedGameController: 0 + tvOSTargetOSVersionString: + uIPrerenderedIcon: 0 + uIRequiresPersistentWiFi: 0 + uIRequiresFullScreen: 1 + uIStatusBarHidden: 1 + uIExitOnSuspend: 0 + uIStatusBarStyle: 0 + iPhoneSplashScreen: {fileID: 0} + iPhoneHighResSplashScreen: {fileID: 0} + iPhoneTallHighResSplashScreen: {fileID: 0} + iPhone47inSplashScreen: {fileID: 0} + iPhone55inPortraitSplashScreen: {fileID: 0} + iPhone55inLandscapeSplashScreen: {fileID: 0} + iPadPortraitSplashScreen: {fileID: 0} + iPadHighResPortraitSplashScreen: {fileID: 0} + iPadLandscapeSplashScreen: {fileID: 0} + iPadHighResLandscapeSplashScreen: {fileID: 0} + appleTVSplashScreen: {fileID: 0} + tvOSSmallIconLayers: [] + tvOSLargeIconLayers: [] + tvOSTopShelfImageLayers: [] + tvOSTopShelfImageWideLayers: [] + iOSLaunchScreenType: 0 + iOSLaunchScreenPortrait: {fileID: 0} + iOSLaunchScreenLandscape: {fileID: 0} + iOSLaunchScreenBackgroundColor: + serializedVersion: 2 + rgba: 0 + iOSLaunchScreenFillPct: 100 + iOSLaunchScreenSize: 100 + iOSLaunchScreenCustomXibPath: + iOSLaunchScreeniPadType: 0 + iOSLaunchScreeniPadImage: {fileID: 0} + iOSLaunchScreeniPadBackgroundColor: + serializedVersion: 2 + rgba: 0 + iOSLaunchScreeniPadFillPct: 100 + iOSLaunchScreeniPadSize: 100 + iOSLaunchScreeniPadCustomXibPath: + iOSDeviceRequirements: [] + iOSURLSchemes: [] + iOSBackgroundModes: 0 + iOSMetalForceHardShadows: 0 + metalEditorSupport: 1 + metalAPIValidation: 1 + iOSRenderExtraFrameOnPause: 0 + appleDeveloperTeamID: + iOSManualSigningProvisioningProfileID: + tvOSManualSigningProvisioningProfileID: + appleEnableAutomaticSigning: 0 + AndroidTargetDevice: 0 + AndroidSplashScreenScale: 0 + androidSplashScreen: {fileID: 0} + AndroidKeystoreName: + AndroidKeyaliasName: + AndroidTVCompatibility: 1 + AndroidIsGame: 1 + androidEnableBanner: 1 + m_AndroidBanners: + - width: 320 + height: 180 + banner: {fileID: 0} + androidGamepadSupportLevel: 0 + resolutionDialogBanner: {fileID: 0} + m_BuildTargetIcons: [] + m_BuildTargetBatching: [] + m_BuildTargetGraphicsAPIs: [] + m_BuildTargetVRSettings: [] + openGLRequireES31: 0 + openGLRequireES31AEP: 0 + webPlayerTemplate: APPLICATION:Default + m_TemplateCustomTags: {} + wiiUTitleID: 0005000011000000 + wiiUGroupID: 00010000 + wiiUCommonSaveSize: 4096 + wiiUAccountSaveSize: 2048 + wiiUOlvAccessKey: 0 + wiiUTinCode: 0 + wiiUJoinGameId: 0 + wiiUJoinGameModeMask: 0000000000000000 + wiiUCommonBossSize: 0 + wiiUAccountBossSize: 0 + wiiUAddOnUniqueIDs: [] + wiiUMainThreadStackSize: 3072 + wiiULoaderThreadStackSize: 1024 + wiiUSystemHeapSize: 128 + wiiUTVStartupScreen: {fileID: 0} + wiiUGamePadStartupScreen: {fileID: 0} + wiiUDrcBufferDisabled: 0 + wiiUProfilerLibPath: + playModeTestRunnerEnabled: 0 + actionOnDotNetUnhandledException: 1 + enableInternalProfiler: 0 + logObjCUncaughtExceptions: 1 + enableCrashReportAPI: 0 + cameraUsageDescription: + locationUsageDescription: + microphoneUsageDescription: + switchNetLibKey: + switchSocketMemoryPoolSize: 6144 + switchSocketAllocatorPoolSize: 128 + switchSocketConcurrencyLimit: 14 + switchScreenResolutionBehavior: 2 + switchUseCPUProfiler: 0 + switchApplicationID: 0x01004b9000490000 + switchNSODependencies: + switchTitleNames_0: + switchTitleNames_1: + switchTitleNames_2: + switchTitleNames_3: + switchTitleNames_4: + switchTitleNames_5: + switchTitleNames_6: + switchTitleNames_7: + switchTitleNames_8: + switchTitleNames_9: + switchTitleNames_10: + switchTitleNames_11: + switchPublisherNames_0: + switchPublisherNames_1: + switchPublisherNames_2: + switchPublisherNames_3: + switchPublisherNames_4: + switchPublisherNames_5: + switchPublisherNames_6: + switchPublisherNames_7: + switchPublisherNames_8: + switchPublisherNames_9: + switchPublisherNames_10: + switchPublisherNames_11: + switchIcons_0: {fileID: 0} + switchIcons_1: {fileID: 0} + switchIcons_2: {fileID: 0} + switchIcons_3: {fileID: 0} + switchIcons_4: {fileID: 0} + switchIcons_5: {fileID: 0} + switchIcons_6: {fileID: 0} + switchIcons_7: {fileID: 0} + switchIcons_8: {fileID: 0} + switchIcons_9: {fileID: 0} + switchIcons_10: {fileID: 0} + switchIcons_11: {fileID: 0} + switchSmallIcons_0: {fileID: 0} + switchSmallIcons_1: {fileID: 0} + switchSmallIcons_2: {fileID: 0} + switchSmallIcons_3: {fileID: 0} + switchSmallIcons_4: {fileID: 0} + switchSmallIcons_5: {fileID: 0} + switchSmallIcons_6: {fileID: 0} + switchSmallIcons_7: {fileID: 0} + switchSmallIcons_8: {fileID: 0} + switchSmallIcons_9: {fileID: 0} + switchSmallIcons_10: {fileID: 0} + switchSmallIcons_11: {fileID: 0} + switchManualHTML: + switchAccessibleURLs: + switchLegalInformation: + switchMainThreadStackSize: 1048576 + switchPresenceGroupId: 0x01004b9000490000 + switchLogoHandling: 0 + switchReleaseVersion: 0 + switchDisplayVersion: 1.0.0 + switchStartupUserAccount: 0 + switchTouchScreenUsage: 0 + switchSupportedLanguagesMask: 0 + switchLogoType: 0 + switchApplicationErrorCodeCategory: + switchUserAccountSaveDataSize: 0 + switchUserAccountSaveDataJournalSize: 0 + switchApplicationAttribute: 0 + switchCardSpecSize: 4 + switchCardSpecClock: 25 + switchRatingsMask: 0 + switchRatingsInt_0: 0 + switchRatingsInt_1: 0 + switchRatingsInt_2: 0 + switchRatingsInt_3: 0 + switchRatingsInt_4: 0 + switchRatingsInt_5: 0 + switchRatingsInt_6: 0 + switchRatingsInt_7: 0 + switchRatingsInt_8: 0 + switchRatingsInt_9: 0 + switchRatingsInt_10: 0 + switchRatingsInt_11: 0 + switchLocalCommunicationIds_0: 0x01004b9000490000 + switchLocalCommunicationIds_1: + switchLocalCommunicationIds_2: + switchLocalCommunicationIds_3: + switchLocalCommunicationIds_4: + switchLocalCommunicationIds_5: + switchLocalCommunicationIds_6: + switchLocalCommunicationIds_7: + switchParentalControl: 0 + switchAllowsScreenshot: 1 + switchDataLossConfirmation: 0 + switchSupportedNpadStyles: 3 + switchSocketConfigEnabled: 0 + switchTcpInitialSendBufferSize: 32 + switchTcpInitialReceiveBufferSize: 64 + switchTcpAutoSendBufferSizeMax: 256 + switchTcpAutoReceiveBufferSizeMax: 256 + switchUdpSendBufferSize: 9 + switchUdpReceiveBufferSize: 42 + switchSocketBufferEfficiency: 4 + ps4NPAgeRating: 12 + ps4NPTitleSecret: + ps4NPTrophyPackPath: + ps4ParentalLevel: 11 + ps4ContentID: ED1633-NPXX51362_00-0000000000000000 + ps4Category: 0 + ps4MasterVersion: 01.00 + ps4AppVersion: 01.00 + ps4AppType: 0 + ps4ParamSfxPath: + ps4VideoOutPixelFormat: 0 + ps4VideoOutInitialWidth: 1920 + ps4VideoOutBaseModeInitialWidth: 1920 + ps4VideoOutReprojectionRate: 120 + ps4PronunciationXMLPath: + ps4PronunciationSIGPath: + ps4BackgroundImagePath: + ps4StartupImagePath: + ps4SaveDataImagePath: + ps4SdkOverride: + ps4BGMPath: + ps4ShareFilePath: + ps4ShareOverlayImagePath: + ps4PrivacyGuardImagePath: + ps4NPtitleDatPath: + ps4RemotePlayKeyAssignment: -1 + ps4RemotePlayKeyMappingDir: + ps4PlayTogetherPlayerCount: 0 + ps4EnterButtonAssignment: 1 + ps4ApplicationParam1: 0 + ps4ApplicationParam2: 0 + ps4ApplicationParam3: 0 + ps4ApplicationParam4: 0 + ps4DownloadDataSize: 0 + ps4GarlicHeapSize: 2048 + ps4ProGarlicHeapSize: 2560 + ps4Passcode: frAQBc8Wsa1xVPfvJcrgRYwTiizs2trQ + ps4pnSessions: 1 + ps4pnPresence: 1 + ps4pnFriends: 1 + ps4pnGameCustomData: 1 + playerPrefsSupport: 0 + restrictedAudioUsageRights: 0 + ps4UseResolutionFallback: 0 + ps4ReprojectionSupport: 0 + ps4UseAudio3dBackend: 0 + ps4SocialScreenEnabled: 0 + ps4ScriptOptimizationLevel: 0 + ps4Audio3dVirtualSpeakerCount: 14 + ps4attribCpuUsage: 0 + ps4PatchPkgPath: + ps4PatchLatestPkgPath: + ps4PatchChangeinfoPath: + ps4PatchDayOne: 0 + ps4attribUserManagement: 0 + ps4attribMoveSupport: 0 + ps4attrib3DSupport: 0 + ps4attribShareSupport: 0 + ps4attribExclusiveVR: 0 + ps4disableAutoHideSplash: 0 + ps4videoRecordingFeaturesUsed: 0 + ps4contentSearchFeaturesUsed: 0 + ps4attribEyeToEyeDistanceSettingVR: 0 + ps4IncludedModules: [] + monoEnv: + psp2Splashimage: {fileID: 0} + psp2NPTrophyPackPath: + psp2NPSupportGBMorGJP: 0 + psp2NPAgeRating: 12 + psp2NPTitleDatPath: + psp2NPCommsID: + psp2NPCommunicationsID: + psp2NPCommsPassphrase: + psp2NPCommsSig: + psp2ParamSfxPath: + psp2ManualPath: + psp2LiveAreaGatePath: + psp2LiveAreaBackroundPath: + psp2LiveAreaPath: + psp2LiveAreaTrialPath: + psp2PatchChangeInfoPath: + psp2PatchOriginalPackage: + psp2PackagePassword: F69AzBlax3CF3EDNhm3soLBPh71Yexui + psp2KeystoneFile: + psp2MemoryExpansionMode: 0 + psp2DRMType: 0 + psp2StorageType: 0 + psp2MediaCapacity: 0 + psp2DLCConfigPath: + psp2ThumbnailPath: + psp2BackgroundPath: + psp2SoundPath: + psp2TrophyCommId: + psp2TrophyPackagePath: + psp2PackagedResourcesPath: + psp2SaveDataQuota: 10240 + psp2ParentalLevel: 1 + psp2ShortTitle: Not Set + psp2ContentID: IV0000-ABCD12345_00-0123456789ABCDEF + psp2Category: 0 + psp2MasterVersion: 01.00 + psp2AppVersion: 01.00 + psp2TVBootMode: 0 + psp2EnterButtonAssignment: 2 + psp2TVDisableEmu: 0 + psp2AllowTwitterDialog: 1 + psp2Upgradable: 0 + psp2HealthWarning: 0 + psp2UseLibLocation: 0 + psp2InfoBarOnStartup: 0 + psp2InfoBarColor: 0 + psp2ScriptOptimizationLevel: 0 + psmSplashimage: {fileID: 0} + splashScreenBackgroundSourceLandscape: {fileID: 0} + splashScreenBackgroundSourcePortrait: {fileID: 0} + spritePackerPolicy: + webGLMemorySize: 256 + webGLExceptionSupport: 1 + webGLNameFilesAsHashes: 0 + webGLDataCaching: 0 + webGLDebugSymbols: 0 + webGLEmscriptenArgs: + webGLModulesDirectory: + webGLTemplate: APPLICATION:Default + webGLAnalyzeBuildSize: 0 + webGLUseEmbeddedResources: 0 + webGLUseWasm: 0 + webGLCompressionFormat: 1 + scriptingDefineSymbols: {} + platformArchitecture: {} + scriptingBackend: {} + incrementalIl2cppBuild: {} + additionalIl2CppArgs: + scriptingRuntimeVersion: 0 + apiCompatibilityLevelPerPlatform: {} + m_RenderingPath: 1 + m_MobileRenderingPath: 1 + metroPackageName: UnityLibrary + metroPackageVersion: + metroCertificatePath: + metroCertificatePassword: + metroCertificateSubject: + metroCertificateIssuer: + metroCertificateNotAfter: 0000000000000000 + metroApplicationDescription: UnityLibrary + wsaImages: {} + metroTileShortName: + metroCommandLineArgsFile: + metroTileShowName: 0 + metroMediumTileShowName: 0 + metroLargeTileShowName: 0 + metroWideTileShowName: 0 + metroDefaultTileSize: 1 + metroTileForegroundText: 2 + metroTileBackgroundColor: {r: 0.13333334, g: 0.17254902, b: 0.21568628, a: 0} + metroSplashScreenBackgroundColor: {r: 0.12941177, g: 0.17254902, b: 0.21568628, + a: 1} + metroSplashScreenUseBackgroundColor: 0 + platformCapabilities: {} + metroFTAName: + metroFTAFileTypes: [] + metroProtocolName: + metroCompilationOverrides: 1 + tizenProductDescription: + tizenProductURL: + tizenSigningProfileName: + tizenGPSPermissions: 0 + tizenMicrophonePermissions: 0 + tizenDeploymentTarget: + tizenDeploymentTargetType: -1 + tizenMinOSVersion: 1 + n3dsUseExtSaveData: 0 + n3dsCompressStaticMem: 1 + n3dsExtSaveDataNumber: 0x12345 + n3dsStackSize: 131072 + n3dsTargetPlatform: 2 + n3dsRegion: 7 + n3dsMediaSize: 0 + n3dsLogoStyle: 3 + n3dsTitle: GameName + n3dsProductCode: + n3dsApplicationId: 0xFF3FF + stvDeviceAddress: + stvProductDescription: + stvProductAuthor: + stvProductAuthorEmail: + stvProductLink: + stvProductCategory: 0 + XboxOneProductId: + XboxOneUpdateKey: + XboxOneSandboxId: + XboxOneContentId: + XboxOneTitleId: + XboxOneSCId: + XboxOneGameOsOverridePath: + XboxOnePackagingOverridePath: + XboxOneAppManifestOverridePath: + XboxOnePackageEncryption: 0 + XboxOnePackageUpdateGranularity: 2 + XboxOneDescription: + XboxOneLanguage: + - enus + XboxOneCapability: [] + XboxOneGameRating: {} + XboxOneIsContentPackage: 0 + XboxOneEnableGPUVariability: 0 + XboxOneSockets: {} + XboxOneSplashScreen: {fileID: 0} + XboxOneAllowedProductIds: [] + XboxOnePersistentLocalStorageSize: 0 + xboxOneScriptCompiler: 0 + vrEditorSettings: + daydream: + daydreamIconForeground: {fileID: 0} + daydreamIconBackground: {fileID: 0} + cloudServicesEnabled: {} + facebookSdkVersion: 7.9.4 + apiCompatibilityLevel: 2 + cloudProjectId: + projectName: + organizationId: + cloudEnabled: 0 + enableNativePlatformBackendsForNewInputSystem: 0 + disableOldInputManagerSupport: 0 diff --git a/ProjectSettings/ProjectVersion.txt b/ProjectSettings/ProjectVersion.txt new file mode 100644 index 0000000..ca1aa05 --- /dev/null +++ b/ProjectSettings/ProjectVersion.txt @@ -0,0 +1 @@ +m_EditorVersion: 2017.1.0f3 diff --git a/ProjectSettings/QualitySettings.asset b/ProjectSettings/QualitySettings.asset new file mode 100644 index 0000000..86c047f --- /dev/null +++ b/ProjectSettings/QualitySettings.asset @@ -0,0 +1,193 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!47 &1 +QualitySettings: + m_ObjectHideFlags: 0 + serializedVersion: 5 + m_CurrentQuality: 5 + m_QualitySettings: + - serializedVersion: 2 + name: Very Low + pixelLightCount: 0 + shadows: 0 + shadowResolution: 0 + shadowProjection: 1 + shadowCascades: 1 + shadowDistance: 15 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 0 + blendWeights: 1 + textureQuality: 1 + anisotropicTextures: 0 + antiAliasing: 0 + softParticles: 0 + softVegetation: 0 + realtimeReflectionProbes: 0 + billboardsFaceCameraPosition: 0 + vSyncCount: 0 + lodBias: 0.3 + maximumLODLevel: 0 + particleRaycastBudget: 4 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 4 + resolutionScalingFixedDPIFactor: 1 + excludedTargetPlatforms: [] + - serializedVersion: 2 + name: Low + pixelLightCount: 0 + shadows: 0 + shadowResolution: 0 + shadowProjection: 1 + shadowCascades: 1 + shadowDistance: 20 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 0 + blendWeights: 2 + textureQuality: 0 + anisotropicTextures: 0 + antiAliasing: 0 + softParticles: 0 + softVegetation: 0 + realtimeReflectionProbes: 0 + billboardsFaceCameraPosition: 0 + vSyncCount: 0 + lodBias: 0.4 + maximumLODLevel: 0 + particleRaycastBudget: 16 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 4 + resolutionScalingFixedDPIFactor: 1 + excludedTargetPlatforms: [] + - serializedVersion: 2 + name: Medium + pixelLightCount: 1 + shadows: 1 + shadowResolution: 0 + shadowProjection: 1 + shadowCascades: 1 + shadowDistance: 20 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 0 + blendWeights: 2 + textureQuality: 0 + anisotropicTextures: 1 + antiAliasing: 0 + softParticles: 0 + softVegetation: 0 + realtimeReflectionProbes: 0 + billboardsFaceCameraPosition: 0 + vSyncCount: 1 + lodBias: 0.7 + maximumLODLevel: 0 + particleRaycastBudget: 64 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 4 + resolutionScalingFixedDPIFactor: 1 + excludedTargetPlatforms: [] + - serializedVersion: 2 + name: High + pixelLightCount: 2 + shadows: 2 + shadowResolution: 1 + shadowProjection: 1 + shadowCascades: 2 + shadowDistance: 40 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 1 + blendWeights: 2 + textureQuality: 0 + anisotropicTextures: 1 + antiAliasing: 0 + softParticles: 0 + softVegetation: 1 + realtimeReflectionProbes: 1 + billboardsFaceCameraPosition: 1 + vSyncCount: 1 + lodBias: 1 + maximumLODLevel: 0 + particleRaycastBudget: 256 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 4 + resolutionScalingFixedDPIFactor: 1 + excludedTargetPlatforms: [] + - serializedVersion: 2 + name: Very High + pixelLightCount: 3 + shadows: 2 + shadowResolution: 2 + shadowProjection: 1 + shadowCascades: 2 + shadowDistance: 70 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 1 + blendWeights: 4 + textureQuality: 0 + anisotropicTextures: 2 + antiAliasing: 2 + softParticles: 1 + softVegetation: 1 + realtimeReflectionProbes: 1 + billboardsFaceCameraPosition: 1 + vSyncCount: 1 + lodBias: 1.5 + maximumLODLevel: 0 + particleRaycastBudget: 1024 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 4 + resolutionScalingFixedDPIFactor: 1 + excludedTargetPlatforms: [] + - serializedVersion: 2 + name: Ultra + pixelLightCount: 4 + shadows: 2 + shadowResolution: 2 + shadowProjection: 1 + shadowCascades: 4 + shadowDistance: 150 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 1 + blendWeights: 4 + textureQuality: 0 + anisotropicTextures: 2 + antiAliasing: 2 + softParticles: 1 + softVegetation: 1 + realtimeReflectionProbes: 1 + billboardsFaceCameraPosition: 1 + vSyncCount: 1 + lodBias: 2 + maximumLODLevel: 0 + particleRaycastBudget: 4096 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 4 + resolutionScalingFixedDPIFactor: 1 + excludedTargetPlatforms: [] + m_PerPlatformDefaultQuality: + Android: 2 + Nintendo 3DS: 5 + Nintendo Switch: 5 + PS4: 5 + PSM: 5 + PSP2: 2 + Samsung TV: 2 + Standalone: 5 + Tizen: 2 + Web: 5 + WebGL: 3 + WiiU: 5 + Windows Store Apps: 5 + XboxOne: 5 + iPhone: 2 + tvOS: 2 diff --git a/ProjectSettings/TagManager.asset b/ProjectSettings/TagManager.asset new file mode 100644 index 0000000..1c92a78 --- /dev/null +++ b/ProjectSettings/TagManager.asset @@ -0,0 +1,43 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!78 &1 +TagManager: + serializedVersion: 2 + tags: [] + layers: + - Default + - TransparentFX + - Ignore Raycast + - + - Water + - UI + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + m_SortingLayers: + - name: Default + uniqueID: 0 + locked: 0 diff --git a/ProjectSettings/TimeManager.asset b/ProjectSettings/TimeManager.asset new file mode 100644 index 0000000..558a017 --- /dev/null +++ b/ProjectSettings/TimeManager.asset @@ -0,0 +1,9 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!5 &1 +TimeManager: + m_ObjectHideFlags: 0 + Fixed Timestep: 0.02 + Maximum Allowed Timestep: 0.33333334 + m_TimeScale: 1 + Maximum Particle Timestep: 0.03 diff --git a/ProjectSettings/UnityConnectSettings.asset b/ProjectSettings/UnityConnectSettings.asset new file mode 100644 index 0000000..1cc5485 --- /dev/null +++ b/ProjectSettings/UnityConnectSettings.asset @@ -0,0 +1,34 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!310 &1 +UnityConnectSettings: + m_ObjectHideFlags: 0 + m_Enabled: 0 + m_TestMode: 0 + m_TestEventUrl: + m_TestConfigUrl: + m_TestInitMode: 0 + CrashReportingSettings: + m_EventUrl: https://perf-events.cloud.unity3d.com/api/events/crashes + m_Enabled: 0 + m_CaptureEditorExceptions: 1 + UnityPurchasingSettings: + m_Enabled: 0 + m_TestMode: 0 + UnityAnalyticsSettings: + m_Enabled: 0 + m_InitializeOnStartup: 1 + m_TestMode: 0 + m_TestEventUrl: + m_TestConfigUrl: + UnityAdsSettings: + m_Enabled: 0 + m_InitializeOnStartup: 1 + m_TestMode: 0 + m_EnabledPlatforms: 4294967295 + m_IosGameId: + m_AndroidGameId: + m_GameIds: {} + m_GameId: + PerformanceReportingSettings: + m_Enabled: 0 From 60ff47992f6e7edb5314c1a9e0dc65e7bde77bb4 Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Sun, 23 Jul 2017 11:32:35 +0430 Subject: [PATCH 068/231] Update Paths for Unity Project --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 01cfaa3..7bef969 100644 --- a/README.md +++ b/README.md @@ -33,9 +33,9 @@ or you can find useful stuff by [browsing awesome resources in the below](#resou ## Content - [Docs/](https://github.com/UnityCommunity/UnityLibrary/tree/master/Docs) : A small replacement for missing Unity documentations. -- [Scripts/](https://github.com/UnityCommunity/UnityLibrary/tree/master/Scripts) : Complete set of Unity scripts. -- [Scripts/Editor/](https://github.com/UnityCommunity/UnityLibrary/tree/master/Scripts/Editor) : Editor related scripts. -- [Shaders/](https://github.com/UnityCommunity/UnityLibrary/tree/master/Shaders) : Ready-to-use shaders. +- [Scripts/](https://github.com/UnityCommunity/UnityLibrary/tree/master/Assets/Scripts) : Complete set of Unity scripts. +- [Scripts/Editor/](https://github.com/UnityCommunity/UnityLibrary/tree/master/Assets/Scripts/Editor) : Editor related scripts. +- [Shaders/](https://github.com/UnityCommunity/UnityLibrary/tree/master/Assets/Shaders) : Ready-to-use shaders. - [ScriptTemplates/](https://github.com/UnityCommunity/UnityLibrary/tree/master/ScriptTemplates) : Contains ready-to-use script templates. - [External/](https://github.com/UnityCommunity/UnityLibrary/tree/master/External) : External libaries, scripts and utilities that are related to unity. From 59b5c4527698cada870c9e74206fe929bec5fe35 Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Sun, 23 Jul 2017 07:31:55 -0400 Subject: [PATCH 069/231] Update README.md Add credits links Update content links Update community links --- README.md | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 7bef969..f3ba660 100644 --- a/README.md +++ b/README.md @@ -33,9 +33,9 @@ or you can find useful stuff by [browsing awesome resources in the below](#resou ## Content - [Docs/](https://github.com/UnityCommunity/UnityLibrary/tree/master/Docs) : A small replacement for missing Unity documentations. -- [Scripts/](https://github.com/UnityCommunity/UnityLibrary/tree/master/Assets/Scripts) : Complete set of Unity scripts. -- [Scripts/Editor/](https://github.com/UnityCommunity/UnityLibrary/tree/master/Assets/Scripts/Editor) : Editor related scripts. -- [Shaders/](https://github.com/UnityCommunity/UnityLibrary/tree/master/Assets/Shaders) : Ready-to-use shaders. +- [Assets/Scripts/](https://github.com/UnityCommunity/UnityLibrary/tree/master/Assets/Scripts) : Complete set of Unity scripts. +- [Assets/Scripts/Editor/](https://github.com/UnityCommunity/UnityLibrary/tree/master/Assets/Scripts/Editor) : Editor related scripts. +- [Assets/Shaders/](https://github.com/UnityCommunity/UnityLibrary/tree/master/Assets/Shaders) : Ready-to-use shaders. - [ScriptTemplates/](https://github.com/UnityCommunity/UnityLibrary/tree/master/ScriptTemplates) : Contains ready-to-use script templates. - [External/](https://github.com/UnityCommunity/UnityLibrary/tree/master/External) : External libaries, scripts and utilities that are related to unity. @@ -55,7 +55,11 @@ Awesome and Useful Unity Resources: ## Contribution -[:closed_book: Read our Contribution Guidelines](https://github.com/UnityCommunity/UnityLibrary/blob/master/CONTRIBUTING.md) +Any contribution to this repository are welcome. + +Also you [join as a member](#join-the-community) to do more stuff such as creating new repositories for more awesome open source works. + +[:closed_book: Read our Contribution Guidelines](https://github.com/UnityCommunity/UnityLibrary/blob/master/CONTRIBUTING.md) to find a way to help. ## Join the Community @@ -67,10 +71,10 @@ Send your GitHub id to one of the below ways: Our communities: -- [Join our Slack Channel](https://join.slack.com/t/unitylibrary/shared_invite/MjE1MDA2NzExNDEwLTE1MDA0OTE5NzktOGJmYTI0ZDlkNA) -- [Join our Gitter Channel](https://gitter.im/UnityCommunity/Lobby?utm_source=share-link&utm_medium=link&utm_campaign=share-link) -- [Join our Discord Channel](https://discord.gg/cXT97hU) -- [Development Board](https://trello.com/b/1sOcvQzd/unity-library) +- [See](https://unitylibrary.slack.com/) | [Join](https://join.slack.com/t/unitylibrary/shared_invite/MjE1MDA2NzExNDEwLTE1MDA0OTE5NzktOGJmYTI0ZDlkNA) our Slack Channel +- [See](https://gitter.im/UnityCommunity/Lobby) | [Join](https://gitter.im/UnityCommunity/Lobby?utm_source=share-link&utm_medium=link&utm_campaign=share-link) our Gitter Channel +- [See](https://discordapp.com/channels/337579253866692608/337579253866692608) | [Join](https://discord.gg/cXT97hU) our Discord Channel +- [See](https://trello.com/b/1sOcvQzd/unity-library) | [Join](https://trello.com/invite/b/SIfiVLYi/2c640a78d533382340567e625708c9e0/unity-library) our Trello Development Board ## Improvements/Ideas/Feedback @@ -78,7 +82,15 @@ Feel free to [:postbox: Post your ideas/comments/improvements/recommendations](h ## Credits -[:mag: Find out Unity Community People](https://github.com/orgs/UnityCommunity/people) +- [UnityCoder (mika)](https://github.com/unitycoder) (Owner) +- [EmpireWorld (Hasan Bayat)](https://github.com/EmpireWorld) (Owner) +- [Lootheo (Manuel Otheo)](https://github.com/Lootheo) (Member) +- [igorrafael (Igor Rafael de Sousa)](https://github.com/igorrafael) (Member) +- [nrlnd](https://github.com/nrlnd) (Member) +- [Sacristan (Ģirts Ķesteris)](https://github.com/nrlnd) (Member) +- [:sparkles: Join the team](#join-the-community) + +[:mag: Check out Unity Community People](https://github.com/orgs/UnityCommunity/people) ## License From 85c7e8f5eba5505f236e0ab9f08e1dad0a6ed5d9 Mon Sep 17 00:00:00 2001 From: mika Date: Mon, 24 Jul 2017 19:27:43 +0300 Subject: [PATCH 070/231] Create SetInputFieldSelected.cs --- Assets/Scripts/UI/SetInputFieldSelected.cs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 Assets/Scripts/UI/SetInputFieldSelected.cs diff --git a/Assets/Scripts/UI/SetInputFieldSelected.cs b/Assets/Scripts/UI/SetInputFieldSelected.cs new file mode 100644 index 0000000..7d94c09 --- /dev/null +++ b/Assets/Scripts/UI/SetInputFieldSelected.cs @@ -0,0 +1,18 @@ +// sets input field selected (so that can start typing on it) +// usage: attach to UI InputField gameobject + +using UnityEngine; +using UnityEngine.UI; + +namespace UnityLibrary +{ + [RequireComponent(typeof(InputField))] + public class SetInputFieldSelected : MonoBehaviour + { + void Start() + { + var inputField = GetComponent(); + inputField.Select(); + } + } +} From 0829e14b8829423f33205c8876e42006c99cd093 Mon Sep 17 00:00:00 2001 From: mika Date: Tue, 25 Jul 2017 10:39:39 +0300 Subject: [PATCH 071/231] Delete SetInputFieldSelected.cs --- Assets/Scripts/UI/SetInputFieldSelected.cs | 18 ------------------ 1 file changed, 18 deletions(-) delete mode 100644 Assets/Scripts/UI/SetInputFieldSelected.cs diff --git a/Assets/Scripts/UI/SetInputFieldSelected.cs b/Assets/Scripts/UI/SetInputFieldSelected.cs deleted file mode 100644 index 7d94c09..0000000 --- a/Assets/Scripts/UI/SetInputFieldSelected.cs +++ /dev/null @@ -1,18 +0,0 @@ -// sets input field selected (so that can start typing on it) -// usage: attach to UI InputField gameobject - -using UnityEngine; -using UnityEngine.UI; - -namespace UnityLibrary -{ - [RequireComponent(typeof(InputField))] - public class SetInputFieldSelected : MonoBehaviour - { - void Start() - { - var inputField = GetComponent(); - inputField.Select(); - } - } -} From cab330e0df6b13be7cbe8b42d0cdf87779c054e9 Mon Sep 17 00:00:00 2001 From: mika Date: Tue, 25 Jul 2017 10:41:15 +0300 Subject: [PATCH 072/231] replace SetInputFieldSelected.cs with this generic one --- Assets/Scripts/UI/SetSelected.cs | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 Assets/Scripts/UI/SetSelected.cs diff --git a/Assets/Scripts/UI/SetSelected.cs b/Assets/Scripts/UI/SetSelected.cs new file mode 100644 index 0000000..398ee90 --- /dev/null +++ b/Assets/Scripts/UI/SetSelected.cs @@ -0,0 +1,24 @@ +// sets UI element selected +// usage: attach to gameobject with UI selectable component (inputfield, button, dropdown. toggle..) + +using UnityEngine; +using UnityEngine.UI; + +namespace UnityLibrary +{ + public class SetSelected : MonoBehaviour + { + void Start() + { + var element = GetComponent(); + + if (element != null && element.interactable == true) + { + element.Select(); + } else + { + Debug.LogWarning("Nothing to set selected..", gameObject); + } + } + } +} From 1eccfe06bc1cb6e301ae26186f5ad44359e4465c Mon Sep 17 00:00:00 2001 From: EmpireWorld Date: Fri, 28 Jul 2017 12:04:56 +0430 Subject: [PATCH 073/231] Add & Update Add Serializable Types #19 Update Old #15 Add Test Scene #20 Add Tests Folder (PlayMode & EditMode) #20 Enable PlayMode Testing #20 --- Assets/Editor.meta | 9 + Assets/Editor/Tests.meta | 9 + Assets/Editor/Tests/Edit Mode.meta | 9 + Assets/Editor/Tests/Play Mode.meta | 9 + Assets/Scenes.meta | 9 + Assets/Scenes/Test.unity | 278 ++++++++++++++++++ Assets/Scenes/Test.unity.meta | 8 + Assets/Scripts.meta | 9 + Assets/Scripts/2D.meta | 9 + Assets/Scripts/2D/Camera.meta | 9 + .../2D/Camera/PixelPerfectCamera.cs.meta | 12 + Assets/Scripts/2D/Camera/ScaleCamera.cs.meta | 12 + Assets/Scripts/2D/Colliders.meta | 9 + .../2D/Colliders/ScreenEdgeColliders.cs.meta | 12 + Assets/Scripts/2D/Follow2D.cs.meta | 12 + Assets/Scripts/2D/Tilemaps.meta | 9 + Assets/Scripts/2D/Tilemaps/Editor.meta | 9 + .../Editor/TilemapLayerHelper.cs.meta | 12 + Assets/Scripts/2D/Tilemaps/Icons.meta | 9 + .../Scripts/2D/Tilemaps/RandomTiles.cs.meta | 12 + .../Tilemaps/TileMapHierarchyHelper.cs.meta | 12 + Assets/Scripts/AssetBundles.meta | 9 + .../Scripts/AssetBundles/AssetBundleLoader.cs | 227 +++++++------- .../AssetBundles/AssetBundleLoader.cs.meta | 12 + Assets/Scripts/Camera.meta | 9 + Assets/Scripts/Camera/CameraShake.cs.meta | 12 + Assets/Scripts/Camera/CameraSwitcher.cs.meta | 12 + Assets/Scripts/Camera/SmoothMouseLook.cs.meta | 12 + .../Camera/SmoothMouseLookAveraged.cs.meta | 12 + Assets/Scripts/Camera/WowCamera.cs.meta | 12 + Assets/Scripts/Camera/ZoomWithMouse.cs.meta | 12 + Assets/Scripts/Editor.meta | 9 + Assets/Scripts/Editor/BuildProcess.meta | 9 + .../BuildProcess/PostProcessBuild.cs.meta | 12 + .../Scripts/Editor/EditorShortCutKeys.cs.meta | 12 + Assets/Scripts/Editor/Gizmos.meta | 9 + .../Gizmos/DrawCameraFrustumGizmos.cs.meta | 12 + Assets/Scripts/Editor/GridGenerator.meta | 9 + .../Scripts/Editor/GridGenerator/Editor.meta | 9 + .../Editor/GridGeneratorEditor.cs.meta | 12 + .../GridGenerator/GridGenerator.cs.meta | 12 + Assets/Scripts/Editor/ImageEffects.meta | 9 + .../ColorCorrectionCurvesEditorLayers.meta | 8 + Assets/Scripts/Editor/README.md.meta | 8 + Assets/Scripts/Editor/SetPivot.cs.meta | 12 + .../Editor/SpriteBackgroundRemover.cs.meta | 12 + Assets/Scripts/Editor/Tools.meta | 9 + .../Editor/Tools/CopyPasteHelper.cs.meta | 12 + Assets/Scripts/Editor/UI.meta | 9 + .../Scripts/Editor/UI/CanvasScalerUtil.meta | 9 + Assets/Scripts/Helpers.meta | 9 + Assets/Scripts/Helpers/Debug.meta | 9 + Assets/Scripts/Helpers/Debug/Timer.cs | 36 +-- Assets/Scripts/Helpers/Debug/Timer.cs.meta | 12 + Assets/Scripts/Helpers/DrawGLLine.cs.meta | 12 + .../Helpers/DrawRendererBounds.cs.meta | 12 + Assets/Scripts/Helpers/Drawing.meta | 9 + .../Helpers/Drawing/DrawCrossHair.cs.meta | 12 + Assets/Scripts/Helpers/FPSCounter.cs.meta | 12 + Assets/Scripts/Helpers/FileSystem.meta | 9 + .../FileSystem/FileSystemWatch.cs.meta | 12 + .../FileSystem/OpenExternalFile.cs.meta | 12 + Assets/Scripts/Helpers/Screenshot.meta | 9 + .../Helpers/Screenshot/GrabDesktop.cs.meta | 12 + Assets/Scripts/Helpers/String.meta | 9 + .../String/StringOperationUtil.cs.meta | 12 + Assets/Scripts/Helpers/Version.meta | 9 + .../Helpers/Version/GetVersion.cs.meta | 12 + Assets/Scripts/Misc.meta | 9 + Assets/Scripts/Misc/Messaging.meta | 9 + Assets/Scripts/Misc/Messaging/README.md.meta | 8 + Assets/Scripts/Misc/MeteorRing.cs.meta | 12 + .../Scripts/Misc/TexturePixels2Quads.cs.meta | 12 + Assets/Scripts/README.md.meta | 8 + Assets/Scripts/Serialization.meta | 9 + .../Serialization/Color32Serializable.cs | 91 ++++++ .../Serialization/Color32Serializable.cs.meta | 12 + .../Serialization/ColorSerializable.cs | 101 +++++++ .../Serialization/ColorSerializable.cs.meta | 12 + .../Scripts/Serialization/MeshSerializable.cs | 102 +++++++ .../Serialization/MeshSerializable.cs.meta | 12 + .../Serialization/QuaternionSerializable.cs | 91 ++++++ .../QuaternionSerializable.cs.meta | 12 + .../Serialization/Vector2Serializable.cs | 155 ++++++++++ .../Serialization/Vector2Serializable.cs.meta | 12 + .../Serialization/Vector3Serializable.cs | 172 +++++++++++ .../Serialization/Vector3Serializable.cs.meta | 12 + .../Serialization/Vector4Serializable.cs | 190 ++++++++++++ .../Serialization/Vector4Serializable.cs.meta | 12 + Assets/Scripts/StandardAssets.meta | 9 + Assets/Scripts/StandardAssets/Effects.meta | 9 + .../StandardAssets/Effects/ImageEffects.meta | 9 + .../Effects/ImageEffects/Scripts.meta | 9 + .../ColorCorrectionCurvesLayers.cs.meta | 12 + Assets/Scripts/Threading.meta | 9 + .../Scripts/Threading/ThreadPoolTest.cs.meta | 12 + Assets/Shaders.meta | 9 + Assets/Shaders/Debug.meta | 9 + .../Debug/DebugNormalsTangents.shader.meta | 9 + .../Debug/LerpColorNearToFarPlane.shader.meta | 9 + Assets/Shaders/Effects.meta | 9 + Assets/Shaders/Effects/2D.meta | 9 + .../Effects/2D/ExplosionCircle.shader.meta | 9 + .../Effects/AlphaBlendMasked.shader.meta | 9 + Assets/Shaders/Effects/Glow.shader.meta | 9 + Assets/Shaders/Effects/Highlight.shader.meta | 9 + Assets/Shaders/Effects/ToonIce.shader.meta | 9 + Assets/Shaders/Effects/WireFrame.shader.meta | 9 + Assets/Shaders/ImageEffects.meta | 9 + .../ImageEffects/GrayscaleLayers.cs.meta | 12 + Assets/Shaders/Mask.meta | 9 + Assets/Shaders/Mask/DepthMask.shader.meta | 9 + Assets/Shaders/README.md.meta | 8 + Assets/Shaders/Reflective.meta | 9 + .../BumpedSpecularFresnel.shader.meta | 9 + Assets/Shaders/ReliefMapping.meta | 9 + .../ReliefMapping/ReliefMapping.shader.meta | 9 + Assets/Shaders/SkyBox.meta | 9 + .../Shaders/SkyBox/Cubemap-Simple.shader.meta | 9 + Assets/Shaders/Sprites.meta | 9 + .../Sprites/SpriteDropShadow.shader.meta | 9 + .../Sprites/SpriteHDRBloom.shader.meta | 9 + Assets/Shaders/Terrain.meta | 9 + .../Terrain/Splatmask4Textures.shader.meta | 9 + Assets/Shaders/Terrain/Trees.meta | 9 + .../Trees/Unity-BillboardTree.shader.meta | 9 + Assets/Shaders/TextureMapping.meta | 9 + .../Equirectangular.shader.meta | 9 + Assets/Shaders/UI.meta | 9 + .../Shaders/UI/UI_Always_On_Top.shader.meta | 9 + Assets/Shaders/Unlit.meta | 9 + .../Unlit/UnlitTransparentColor.shader.meta | 9 + .../UnlitTransparentColorGradient.shader.meta | 9 + Assets/Shaders/Vertex.meta | 9 + .../Vertex/UnlitFakeCurved.shader.meta | 9 + .../UnlitTransparentColorGradient.shader.meta | 9 + .../Vertex/VertexColorMesh.shader.meta | 9 + ProjectSettings/ProjectSettings.asset | 2 +- 138 files changed, 2584 insertions(+), 130 deletions(-) create mode 100644 Assets/Editor.meta create mode 100644 Assets/Editor/Tests.meta create mode 100644 Assets/Editor/Tests/Edit Mode.meta create mode 100644 Assets/Editor/Tests/Play Mode.meta create mode 100644 Assets/Scenes.meta create mode 100644 Assets/Scenes/Test.unity create mode 100644 Assets/Scenes/Test.unity.meta create mode 100644 Assets/Scripts.meta create mode 100644 Assets/Scripts/2D.meta create mode 100644 Assets/Scripts/2D/Camera.meta create mode 100644 Assets/Scripts/2D/Camera/PixelPerfectCamera.cs.meta create mode 100644 Assets/Scripts/2D/Camera/ScaleCamera.cs.meta create mode 100644 Assets/Scripts/2D/Colliders.meta create mode 100644 Assets/Scripts/2D/Colliders/ScreenEdgeColliders.cs.meta create mode 100644 Assets/Scripts/2D/Follow2D.cs.meta create mode 100644 Assets/Scripts/2D/Tilemaps.meta create mode 100644 Assets/Scripts/2D/Tilemaps/Editor.meta create mode 100644 Assets/Scripts/2D/Tilemaps/Editor/TilemapLayerHelper.cs.meta create mode 100644 Assets/Scripts/2D/Tilemaps/Icons.meta create mode 100644 Assets/Scripts/2D/Tilemaps/RandomTiles.cs.meta create mode 100644 Assets/Scripts/2D/Tilemaps/TileMapHierarchyHelper.cs.meta create mode 100644 Assets/Scripts/AssetBundles.meta create mode 100644 Assets/Scripts/AssetBundles/AssetBundleLoader.cs.meta create mode 100644 Assets/Scripts/Camera.meta create mode 100644 Assets/Scripts/Camera/CameraShake.cs.meta create mode 100644 Assets/Scripts/Camera/CameraSwitcher.cs.meta create mode 100644 Assets/Scripts/Camera/SmoothMouseLook.cs.meta create mode 100644 Assets/Scripts/Camera/SmoothMouseLookAveraged.cs.meta create mode 100644 Assets/Scripts/Camera/WowCamera.cs.meta create mode 100644 Assets/Scripts/Camera/ZoomWithMouse.cs.meta create mode 100644 Assets/Scripts/Editor.meta create mode 100644 Assets/Scripts/Editor/BuildProcess.meta create mode 100644 Assets/Scripts/Editor/BuildProcess/PostProcessBuild.cs.meta create mode 100644 Assets/Scripts/Editor/EditorShortCutKeys.cs.meta create mode 100644 Assets/Scripts/Editor/Gizmos.meta create mode 100644 Assets/Scripts/Editor/Gizmos/DrawCameraFrustumGizmos.cs.meta create mode 100644 Assets/Scripts/Editor/GridGenerator.meta create mode 100644 Assets/Scripts/Editor/GridGenerator/Editor.meta create mode 100644 Assets/Scripts/Editor/GridGenerator/Editor/GridGeneratorEditor.cs.meta create mode 100644 Assets/Scripts/Editor/GridGenerator/GridGenerator.cs.meta create mode 100644 Assets/Scripts/Editor/ImageEffects.meta create mode 100644 Assets/Scripts/Editor/ImageEffects/ColorCorrectionCurvesEditorLayers.meta create mode 100644 Assets/Scripts/Editor/README.md.meta create mode 100644 Assets/Scripts/Editor/SetPivot.cs.meta create mode 100644 Assets/Scripts/Editor/SpriteBackgroundRemover.cs.meta create mode 100644 Assets/Scripts/Editor/Tools.meta create mode 100644 Assets/Scripts/Editor/Tools/CopyPasteHelper.cs.meta create mode 100644 Assets/Scripts/Editor/UI.meta create mode 100644 Assets/Scripts/Editor/UI/CanvasScalerUtil.meta create mode 100644 Assets/Scripts/Helpers.meta create mode 100644 Assets/Scripts/Helpers/Debug.meta create mode 100644 Assets/Scripts/Helpers/Debug/Timer.cs.meta create mode 100644 Assets/Scripts/Helpers/DrawGLLine.cs.meta create mode 100644 Assets/Scripts/Helpers/DrawRendererBounds.cs.meta create mode 100644 Assets/Scripts/Helpers/Drawing.meta create mode 100644 Assets/Scripts/Helpers/Drawing/DrawCrossHair.cs.meta create mode 100644 Assets/Scripts/Helpers/FPSCounter.cs.meta create mode 100644 Assets/Scripts/Helpers/FileSystem.meta create mode 100644 Assets/Scripts/Helpers/FileSystem/FileSystemWatch.cs.meta create mode 100644 Assets/Scripts/Helpers/FileSystem/OpenExternalFile.cs.meta create mode 100644 Assets/Scripts/Helpers/Screenshot.meta create mode 100644 Assets/Scripts/Helpers/Screenshot/GrabDesktop.cs.meta create mode 100644 Assets/Scripts/Helpers/String.meta create mode 100644 Assets/Scripts/Helpers/String/StringOperationUtil.cs.meta create mode 100644 Assets/Scripts/Helpers/Version.meta create mode 100644 Assets/Scripts/Helpers/Version/GetVersion.cs.meta create mode 100644 Assets/Scripts/Misc.meta create mode 100644 Assets/Scripts/Misc/Messaging.meta create mode 100644 Assets/Scripts/Misc/Messaging/README.md.meta create mode 100644 Assets/Scripts/Misc/MeteorRing.cs.meta create mode 100644 Assets/Scripts/Misc/TexturePixels2Quads.cs.meta create mode 100644 Assets/Scripts/README.md.meta create mode 100644 Assets/Scripts/Serialization.meta create mode 100644 Assets/Scripts/Serialization/Color32Serializable.cs create mode 100644 Assets/Scripts/Serialization/Color32Serializable.cs.meta create mode 100644 Assets/Scripts/Serialization/ColorSerializable.cs create mode 100644 Assets/Scripts/Serialization/ColorSerializable.cs.meta create mode 100644 Assets/Scripts/Serialization/MeshSerializable.cs create mode 100644 Assets/Scripts/Serialization/MeshSerializable.cs.meta create mode 100644 Assets/Scripts/Serialization/QuaternionSerializable.cs create mode 100644 Assets/Scripts/Serialization/QuaternionSerializable.cs.meta create mode 100644 Assets/Scripts/Serialization/Vector2Serializable.cs create mode 100644 Assets/Scripts/Serialization/Vector2Serializable.cs.meta create mode 100644 Assets/Scripts/Serialization/Vector3Serializable.cs create mode 100644 Assets/Scripts/Serialization/Vector3Serializable.cs.meta create mode 100644 Assets/Scripts/Serialization/Vector4Serializable.cs create mode 100644 Assets/Scripts/Serialization/Vector4Serializable.cs.meta create mode 100644 Assets/Scripts/StandardAssets.meta create mode 100644 Assets/Scripts/StandardAssets/Effects.meta create mode 100644 Assets/Scripts/StandardAssets/Effects/ImageEffects.meta create mode 100644 Assets/Scripts/StandardAssets/Effects/ImageEffects/Scripts.meta create mode 100644 Assets/Scripts/StandardAssets/Effects/ImageEffects/Scripts/ColorCorrectionCurvesLayers.cs.meta create mode 100644 Assets/Scripts/Threading.meta create mode 100644 Assets/Scripts/Threading/ThreadPoolTest.cs.meta create mode 100644 Assets/Shaders.meta create mode 100644 Assets/Shaders/Debug.meta create mode 100644 Assets/Shaders/Debug/DebugNormalsTangents.shader.meta create mode 100644 Assets/Shaders/Debug/LerpColorNearToFarPlane.shader.meta create mode 100644 Assets/Shaders/Effects.meta create mode 100644 Assets/Shaders/Effects/2D.meta create mode 100644 Assets/Shaders/Effects/2D/ExplosionCircle.shader.meta create mode 100644 Assets/Shaders/Effects/AlphaBlendMasked.shader.meta create mode 100644 Assets/Shaders/Effects/Glow.shader.meta create mode 100644 Assets/Shaders/Effects/Highlight.shader.meta create mode 100644 Assets/Shaders/Effects/ToonIce.shader.meta create mode 100644 Assets/Shaders/Effects/WireFrame.shader.meta create mode 100644 Assets/Shaders/ImageEffects.meta create mode 100644 Assets/Shaders/ImageEffects/GrayscaleLayers.cs.meta create mode 100644 Assets/Shaders/Mask.meta create mode 100644 Assets/Shaders/Mask/DepthMask.shader.meta create mode 100644 Assets/Shaders/README.md.meta create mode 100644 Assets/Shaders/Reflective.meta create mode 100644 Assets/Shaders/Reflective/BumpedSpecularFresnel.shader.meta create mode 100644 Assets/Shaders/ReliefMapping.meta create mode 100644 Assets/Shaders/ReliefMapping/ReliefMapping.shader.meta create mode 100644 Assets/Shaders/SkyBox.meta create mode 100644 Assets/Shaders/SkyBox/Cubemap-Simple.shader.meta create mode 100644 Assets/Shaders/Sprites.meta create mode 100644 Assets/Shaders/Sprites/SpriteDropShadow.shader.meta create mode 100644 Assets/Shaders/Sprites/SpriteHDRBloom.shader.meta create mode 100644 Assets/Shaders/Terrain.meta create mode 100644 Assets/Shaders/Terrain/Splatmask4Textures.shader.meta create mode 100644 Assets/Shaders/Terrain/Trees.meta create mode 100644 Assets/Shaders/Terrain/Trees/Unity-BillboardTree.shader.meta create mode 100644 Assets/Shaders/TextureMapping.meta create mode 100644 Assets/Shaders/TextureMapping/Equirectangular.shader.meta create mode 100644 Assets/Shaders/UI.meta create mode 100644 Assets/Shaders/UI/UI_Always_On_Top.shader.meta create mode 100644 Assets/Shaders/Unlit.meta create mode 100644 Assets/Shaders/Unlit/UnlitTransparentColor.shader.meta create mode 100644 Assets/Shaders/Unlit/UnlitTransparentColorGradient.shader.meta create mode 100644 Assets/Shaders/Vertex.meta create mode 100644 Assets/Shaders/Vertex/UnlitFakeCurved.shader.meta create mode 100644 Assets/Shaders/Vertex/UnlitTransparentColorGradient.shader.meta create mode 100644 Assets/Shaders/Vertex/VertexColorMesh.shader.meta diff --git a/Assets/Editor.meta b/Assets/Editor.meta new file mode 100644 index 0000000..9c21977 --- /dev/null +++ b/Assets/Editor.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 710e084e33216854daedf076c029ff31 +folderAsset: yes +timeCreated: 1501225949 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Editor/Tests.meta b/Assets/Editor/Tests.meta new file mode 100644 index 0000000..aea5a9b --- /dev/null +++ b/Assets/Editor/Tests.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 6018a0fd4c364f14bb8fe0e75a32e585 +folderAsset: yes +timeCreated: 1501225966 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Editor/Tests/Edit Mode.meta b/Assets/Editor/Tests/Edit Mode.meta new file mode 100644 index 0000000..5258e03 --- /dev/null +++ b/Assets/Editor/Tests/Edit Mode.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 3e6000cd87e342d4b98cd5ce263fa040 +folderAsset: yes +timeCreated: 1501226596 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Editor/Tests/Play Mode.meta b/Assets/Editor/Tests/Play Mode.meta new file mode 100644 index 0000000..f86357c --- /dev/null +++ b/Assets/Editor/Tests/Play Mode.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 5043c30411a47e046bc3acda5263c808 +folderAsset: yes +timeCreated: 1501226600 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scenes.meta b/Assets/Scenes.meta new file mode 100644 index 0000000..b845635 --- /dev/null +++ b/Assets/Scenes.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: e902c8c0b4e7a0d4d8453c55863a7532 +folderAsset: yes +timeCreated: 1501219179 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scenes/Test.unity b/Assets/Scenes/Test.unity new file mode 100644 index 0000000..e7cbed3 --- /dev/null +++ b/Assets/Scenes/Test.unity @@ -0,0 +1,278 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 8 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0.44657868, g: 0.49641263, b: 0.57481706, a: 1} +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 11 + m_GIWorkflowMode: 0 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_TemporalCoherenceThreshold: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 1 + m_LightmapEditorSettings: + serializedVersion: 9 + m_Resolution: 2 + m_BakeResolution: 40 + m_TextureWidth: 1024 + m_TextureHeight: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 0 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVRBounces: 2 + m_PVRFiltering: 0 + m_PVRFilteringMode: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousColorSigma: 1 + m_PVRFilteringAtrousNormalSigma: 1 + m_PVRFilteringAtrousPositionSigma: 1 + m_LightingDataAsset: {fileID: 0} + m_UseShadowmask: 1 +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &690944966 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 690944968} + - component: {fileID: 690944967} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &690944967 +Light: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 690944966} + m_Enabled: 1 + serializedVersion: 8 + m_Type: 1 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_Lightmapping: 4 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_FalloffTable: + m_Table[0]: 0 + m_Table[1]: 0 + m_Table[2]: 0 + m_Table[3]: 0 + m_Table[4]: 0 + m_Table[5]: 0 + m_Table[6]: 0 + m_Table[7]: 0 + m_Table[8]: 0 + m_Table[9]: 0 + m_Table[10]: 0 + m_Table[11]: 0 + m_Table[12]: 0 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &690944968 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 690944966} + m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1 &1759122305 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1759122310} + - component: {fileID: 1759122309} + - component: {fileID: 1759122308} + - component: {fileID: 1759122307} + - component: {fileID: 1759122306} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &1759122306 +AudioListener: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1759122305} + m_Enabled: 1 +--- !u!124 &1759122307 +Behaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1759122305} + m_Enabled: 1 +--- !u!92 &1759122308 +Behaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1759122305} + m_Enabled: 1 +--- !u!20 &1759122309 +Camera: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1759122305} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 + m_StereoMirrorMode: 0 +--- !u!4 &1759122310 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1759122305} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} diff --git a/Assets/Scenes/Test.unity.meta b/Assets/Scenes/Test.unity.meta new file mode 100644 index 0000000..adbeacb --- /dev/null +++ b/Assets/Scenes/Test.unity.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 448f40325f90d0840b15d33f2c2d8da5 +timeCreated: 1501219189 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts.meta b/Assets/Scripts.meta new file mode 100644 index 0000000..8cb9588 --- /dev/null +++ b/Assets/Scripts.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: e402e02f02482eb4a8a4a1c3ad2f3565 +folderAsset: yes +timeCreated: 1500793393 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/2D.meta b/Assets/Scripts/2D.meta new file mode 100644 index 0000000..ad07dfb --- /dev/null +++ b/Assets/Scripts/2D.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: a566d1d4c62efcb43b5fb1005352c895 +folderAsset: yes +timeCreated: 1500793395 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/2D/Camera.meta b/Assets/Scripts/2D/Camera.meta new file mode 100644 index 0000000..ee881f2 --- /dev/null +++ b/Assets/Scripts/2D/Camera.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: f5f321f774e078d4c8d3de6e73e8d3ea +folderAsset: yes +timeCreated: 1500793397 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/2D/Camera/PixelPerfectCamera.cs.meta b/Assets/Scripts/2D/Camera/PixelPerfectCamera.cs.meta new file mode 100644 index 0000000..11230f2 --- /dev/null +++ b/Assets/Scripts/2D/Camera/PixelPerfectCamera.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 230ad41a455ffc84982860a8ce356020 +timeCreated: 1500793401 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/2D/Camera/ScaleCamera.cs.meta b/Assets/Scripts/2D/Camera/ScaleCamera.cs.meta new file mode 100644 index 0000000..99882a2 --- /dev/null +++ b/Assets/Scripts/2D/Camera/ScaleCamera.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: eb79c0c2e7e8b814497e3fed8bad9dbd +timeCreated: 1500793404 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/2D/Colliders.meta b/Assets/Scripts/2D/Colliders.meta new file mode 100644 index 0000000..fedd8ba --- /dev/null +++ b/Assets/Scripts/2D/Colliders.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: aabfa300fc2aee04ab2c0f4e1d33d8f8 +folderAsset: yes +timeCreated: 1500793397 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/2D/Colliders/ScreenEdgeColliders.cs.meta b/Assets/Scripts/2D/Colliders/ScreenEdgeColliders.cs.meta new file mode 100644 index 0000000..4c59b67 --- /dev/null +++ b/Assets/Scripts/2D/Colliders/ScreenEdgeColliders.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 13a829f568060b1429e093c51a02d8d1 +timeCreated: 1500793400 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/2D/Follow2D.cs.meta b/Assets/Scripts/2D/Follow2D.cs.meta new file mode 100644 index 0000000..2d338b3 --- /dev/null +++ b/Assets/Scripts/2D/Follow2D.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 5c3e4ae285230a7448969a1b437a0b03 +timeCreated: 1500793402 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/2D/Tilemaps.meta b/Assets/Scripts/2D/Tilemaps.meta new file mode 100644 index 0000000..199d1ef --- /dev/null +++ b/Assets/Scripts/2D/Tilemaps.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 05fee6bf94c73074eba0af2df86b04c6 +folderAsset: yes +timeCreated: 1500793396 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/2D/Tilemaps/Editor.meta b/Assets/Scripts/2D/Tilemaps/Editor.meta new file mode 100644 index 0000000..cfdae7b --- /dev/null +++ b/Assets/Scripts/2D/Tilemaps/Editor.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 59362721e8fa09e40934df875ea5459a +folderAsset: yes +timeCreated: 1500793398 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/2D/Tilemaps/Editor/TilemapLayerHelper.cs.meta b/Assets/Scripts/2D/Tilemaps/Editor/TilemapLayerHelper.cs.meta new file mode 100644 index 0000000..1e5a676 --- /dev/null +++ b/Assets/Scripts/2D/Tilemaps/Editor/TilemapLayerHelper.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: b7620f39da11c9f44a1b32c056766a4c +timeCreated: 1500793403 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/2D/Tilemaps/Icons.meta b/Assets/Scripts/2D/Tilemaps/Icons.meta new file mode 100644 index 0000000..89bf689 --- /dev/null +++ b/Assets/Scripts/2D/Tilemaps/Icons.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: fe1a6407b41666346a76d2fc33ca904a +folderAsset: yes +timeCreated: 1500793398 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/2D/Tilemaps/RandomTiles.cs.meta b/Assets/Scripts/2D/Tilemaps/RandomTiles.cs.meta new file mode 100644 index 0000000..e7726c3 --- /dev/null +++ b/Assets/Scripts/2D/Tilemaps/RandomTiles.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 2aec585d61714a14cad8db4ae90ae900 +timeCreated: 1500793401 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/2D/Tilemaps/TileMapHierarchyHelper.cs.meta b/Assets/Scripts/2D/Tilemaps/TileMapHierarchyHelper.cs.meta new file mode 100644 index 0000000..14edfa1 --- /dev/null +++ b/Assets/Scripts/2D/Tilemaps/TileMapHierarchyHelper.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 992bbcd9a2e351040883f3ed6ffe7115 +timeCreated: 1500793403 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/AssetBundles.meta b/Assets/Scripts/AssetBundles.meta new file mode 100644 index 0000000..78de1f8 --- /dev/null +++ b/Assets/Scripts/AssetBundles.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 21d456c6e751b564e80f9cf743f1a72f +folderAsset: yes +timeCreated: 1500793394 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/AssetBundles/AssetBundleLoader.cs b/Assets/Scripts/AssetBundles/AssetBundleLoader.cs index 5b8aa32..eab1e01 100644 --- a/Assets/Scripts/AssetBundles/AssetBundleLoader.cs +++ b/Assets/Scripts/AssetBundles/AssetBundleLoader.cs @@ -7,113 +7,118 @@ namespace UnityLibrary { - public class AssetBundleLoader : MonoBehaviour - { - public string assetBundleURL = "http://localhost/bundle"; - - void Start() - { - StartCoroutine(DownloadAndCache(assetBundleURL, "")); - } - - - /// - /// asset bundle load and instantiate - /// - /// full url to the bundle file - /// optional asset name to instantiate from the bundle - IEnumerator DownloadAndCache(string bundleURL, string assetName) - { - // Wait for the Caching system to be ready - while (!Caching.ready) - { - yield return null; - } - - // if you want to always load from server, can clear cache first - // Caching.CleanCache(); - - // get current bundle hash from server, random value added to avoid caching - UnityWebRequest www = UnityWebRequest.Get(bundleURL + ".manifest?r=" + (Random.value * 9999999)); - Debug.Log("Loading manifest:" + bundleURL + ".manifest"); - - // wait for load to finish - yield return www.Send(); - - // if received error, exit - if (www.isError == true) - { - Debug.LogError("www error:" + www.error); - yield break; - } - - // create empty hash string - Hash128 hashString = (default(Hash128));// new Hash128(0, 0, 0, 0); - - // check if received data contains 'ManifestFileVersion' - if (www.downloadHandler.text.Contains("ManifestFileVersion")) - { - // extract hash string from the received data, should add some error checking here - var hashRow = www.downloadHandler.text.ToString().Split("\n".ToCharArray())[5]; - hashString = Hash128.Parse(hashRow.Split(':')[1].Trim()); - - if (hashString.isValid == true) - { - if (Caching.IsVersionCached(bundleURL, hashString) == true) - { - Debug.Log("Bundle with this hash is already cached!"); - } else - { - Debug.Log("No cached version founded for this hash.."); - } - } else - { - // invalid loaded hash, just try loading latest bundle - Debug.LogError("Invalid hash:" + hashString); - yield break; - } - - } else - { - Debug.LogError("Manifest doesn't contain string 'ManifestFileVersion': " + bundleURL + ".manifest"); - yield break; - } - - - - // now download the actual bundle, with hashString parameter it uses cached version if available - www = UnityWebRequest.GetAssetBundle(bundleURL + "?r=" + (Random.value * 9999999), hashString, 0); - - // wait for load to finish - yield return www.Send(); - - if (www.error != null) - { - Debug.LogError("www error:" + www.error); - yield break; - } - - // get bundle from downloadhandler - AssetBundle bundle = ((DownloadHandlerAssetBundle)www.downloadHandler).assetBundle; - - GameObject bundlePrefab = null; - - // if no asset name is given, take the first/main asset - if (assetName == "") - { - bundlePrefab = (GameObject)bundle.LoadAsset(bundle.GetAllAssetNames()[0]); - } else // use asset name - { - bundlePrefab = (GameObject)bundle.LoadAsset(assetName); - } - - // if we got something out - if (bundlePrefab != null) - { - // instantiate at 0,0,0 and without rotation - var go = Instantiate(bundlePrefab, Vector3.zero, Quaternion.identity) as GameObject; - - /* + public class AssetBundleLoader : MonoBehaviour + { + public string assetBundleURL = "http://localhost/bundle"; + + void Start () + { + StartCoroutine ( DownloadAndCache ( assetBundleURL, "" ) ); + } + + + /// + /// asset bundle load and instantiate + /// + /// full url to the bundle file + /// optional asset name to instantiate from the bundle + IEnumerator DownloadAndCache ( string bundleURL, string assetName ) + { + // Wait for the Caching system to be ready + while ( !Caching.ready ) + { + yield return null; + } + + // if you want to always load from server, can clear cache first + // Caching.CleanCache(); + + // get current bundle hash from server, random value added to avoid caching + UnityWebRequest www = UnityWebRequest.Get ( bundleURL + ".manifest?r=" + ( Random.value * 9999999 ) ); + Debug.Log ( "Loading manifest:" + bundleURL + ".manifest" ); + + // wait for load to finish + yield return www.Send (); + + // if received error, exit + if ( www.isNetworkError == true ) + { + Debug.LogError ( "www error:" + www.error ); + yield break; + } + + // create empty hash string + Hash128 hashString = ( default(Hash128) );// new Hash128(0, 0, 0, 0); + + // check if received data contains 'ManifestFileVersion' + if ( www.downloadHandler.text.Contains ( "ManifestFileVersion" ) ) + { + // extract hash string from the received data, should add some error checking here + var hashRow = www.downloadHandler.text.ToString ().Split ( "\n".ToCharArray () ) [ 5 ]; + hashString = Hash128.Parse ( hashRow.Split ( ':' ) [ 1 ].Trim () ); + + if ( hashString.isValid == true ) + { + if ( Caching.IsVersionCached ( bundleURL, hashString ) == true ) + { + Debug.Log ( "Bundle with this hash is already cached!" ); + } + else + { + Debug.Log ( "No cached version founded for this hash.." ); + } + } + else + { + // invalid loaded hash, just try loading latest bundle + Debug.LogError ( "Invalid hash:" + hashString ); + yield break; + } + + } + else + { + Debug.LogError ( "Manifest doesn't contain string 'ManifestFileVersion': " + bundleURL + ".manifest" ); + yield break; + } + + + + // now download the actual bundle, with hashString parameter it uses cached version if available + www = UnityWebRequest.GetAssetBundle ( bundleURL + "?r=" + ( Random.value * 9999999 ), hashString, 0 ); + + // wait for load to finish + yield return www.Send (); + + if ( www.error != null ) + { + Debug.LogError ( "www error:" + www.error ); + yield break; + } + + // get bundle from downloadhandler + AssetBundle bundle = ( ( DownloadHandlerAssetBundle )www.downloadHandler ).assetBundle; + + GameObject bundlePrefab = null; + + // if no asset name is given, take the first/main asset + if ( assetName == "" ) + { + bundlePrefab = ( GameObject )bundle.LoadAsset ( bundle.GetAllAssetNames () [ 0 ] ); + } + else + { // use asset name + bundlePrefab = ( GameObject )bundle.LoadAsset ( assetName ); + } + + // if we got something out + if ( bundlePrefab != null ) + { + + // instantiate at 0,0,0 and without rotation + Instantiate ( bundlePrefab, Vector3.zero, Quaternion.identity ); + + /* // fix pink shaders, NOTE: not always needed.. foreach (Renderer r in go.GetComponentsInChildren(includeInactive: true)) { @@ -122,10 +127,10 @@ IEnumerator DownloadAndCache(string bundleURL, string assetName) r.material.shader = null; r.material.shader = material; }*/ - } + } - bundle.Unload(false); - } - } + bundle.Unload ( false ); + } + } } diff --git a/Assets/Scripts/AssetBundles/AssetBundleLoader.cs.meta b/Assets/Scripts/AssetBundles/AssetBundleLoader.cs.meta new file mode 100644 index 0000000..bf527aa --- /dev/null +++ b/Assets/Scripts/AssetBundles/AssetBundleLoader.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 03cf67e7ff38596418c74e18a882150f +timeCreated: 1500793399 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Camera.meta b/Assets/Scripts/Camera.meta new file mode 100644 index 0000000..f237375 --- /dev/null +++ b/Assets/Scripts/Camera.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: f6741ca26024b1140a6866a3952649b0 +folderAsset: yes +timeCreated: 1500793396 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Camera/CameraShake.cs.meta b/Assets/Scripts/Camera/CameraShake.cs.meta new file mode 100644 index 0000000..57e8c96 --- /dev/null +++ b/Assets/Scripts/Camera/CameraShake.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: c03cc4ef2cf2cb54c82653f431e22d78 +timeCreated: 1500793403 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Camera/CameraSwitcher.cs.meta b/Assets/Scripts/Camera/CameraSwitcher.cs.meta new file mode 100644 index 0000000..dcf1948 --- /dev/null +++ b/Assets/Scripts/Camera/CameraSwitcher.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 06e035d5b04a4994285b8436101a9f82 +timeCreated: 1500793399 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Camera/SmoothMouseLook.cs.meta b/Assets/Scripts/Camera/SmoothMouseLook.cs.meta new file mode 100644 index 0000000..5931d49 --- /dev/null +++ b/Assets/Scripts/Camera/SmoothMouseLook.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 44c00afd5e9966b49a5ba1bfd4ce4ba5 +timeCreated: 1500793401 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Camera/SmoothMouseLookAveraged.cs.meta b/Assets/Scripts/Camera/SmoothMouseLookAveraged.cs.meta new file mode 100644 index 0000000..abc151e --- /dev/null +++ b/Assets/Scripts/Camera/SmoothMouseLookAveraged.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: be1c222ad88e6b04e945a890fd33e125 +timeCreated: 1500793403 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Camera/WowCamera.cs.meta b/Assets/Scripts/Camera/WowCamera.cs.meta new file mode 100644 index 0000000..eba07e5 --- /dev/null +++ b/Assets/Scripts/Camera/WowCamera.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 3d99a01c1a910df45bea4973b72ad60b +timeCreated: 1500793401 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Camera/ZoomWithMouse.cs.meta b/Assets/Scripts/Camera/ZoomWithMouse.cs.meta new file mode 100644 index 0000000..09ee286 --- /dev/null +++ b/Assets/Scripts/Camera/ZoomWithMouse.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: f63c7db2f4eaccb4a8c82158ed83fc72 +timeCreated: 1500793404 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Editor.meta b/Assets/Scripts/Editor.meta new file mode 100644 index 0000000..08253ed --- /dev/null +++ b/Assets/Scripts/Editor.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 13ed0fd2b41b56e4eae1ca4cda5ec8c7 +folderAsset: yes +timeCreated: 1500793394 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Editor/BuildProcess.meta b/Assets/Scripts/Editor/BuildProcess.meta new file mode 100644 index 0000000..4f602b9 --- /dev/null +++ b/Assets/Scripts/Editor/BuildProcess.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: d115dabccac4e7341a0f797c709e9ee7 +folderAsset: yes +timeCreated: 1500793397 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Editor/BuildProcess/PostProcessBuild.cs.meta b/Assets/Scripts/Editor/BuildProcess/PostProcessBuild.cs.meta new file mode 100644 index 0000000..4ae3cd6 --- /dev/null +++ b/Assets/Scripts/Editor/BuildProcess/PostProcessBuild.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 650b440cfd97b6c43af9eba650d33741 +timeCreated: 1500793402 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Editor/EditorShortCutKeys.cs.meta b/Assets/Scripts/Editor/EditorShortCutKeys.cs.meta new file mode 100644 index 0000000..ab840e1 --- /dev/null +++ b/Assets/Scripts/Editor/EditorShortCutKeys.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: f55ab5721c1f1714e8ff849ddb613432 +timeCreated: 1500793404 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Editor/Gizmos.meta b/Assets/Scripts/Editor/Gizmos.meta new file mode 100644 index 0000000..937bc2f --- /dev/null +++ b/Assets/Scripts/Editor/Gizmos.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 1a9b3e3cace9b2a45a7ef8a517017aa2 +folderAsset: yes +timeCreated: 1500793396 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Editor/Gizmos/DrawCameraFrustumGizmos.cs.meta b/Assets/Scripts/Editor/Gizmos/DrawCameraFrustumGizmos.cs.meta new file mode 100644 index 0000000..84a2501 --- /dev/null +++ b/Assets/Scripts/Editor/Gizmos/DrawCameraFrustumGizmos.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 45f18a6639b731f4caa6b5b1a01429b7 +timeCreated: 1500793401 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Editor/GridGenerator.meta b/Assets/Scripts/Editor/GridGenerator.meta new file mode 100644 index 0000000..cd9b640 --- /dev/null +++ b/Assets/Scripts/Editor/GridGenerator.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: a6d652b3b2e09c341916f676f9620af4 +folderAsset: yes +timeCreated: 1500793397 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Editor/GridGenerator/Editor.meta b/Assets/Scripts/Editor/GridGenerator/Editor.meta new file mode 100644 index 0000000..52d2f55 --- /dev/null +++ b/Assets/Scripts/Editor/GridGenerator/Editor.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: bfd74206b49d0814fba364735df6024b +folderAsset: yes +timeCreated: 1500793398 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Editor/GridGenerator/Editor/GridGeneratorEditor.cs.meta b/Assets/Scripts/Editor/GridGenerator/Editor/GridGeneratorEditor.cs.meta new file mode 100644 index 0000000..0c9ab35 --- /dev/null +++ b/Assets/Scripts/Editor/GridGenerator/Editor/GridGeneratorEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 62a17510090efae4591eaa951197003d +timeCreated: 1500793402 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Editor/GridGenerator/GridGenerator.cs.meta b/Assets/Scripts/Editor/GridGenerator/GridGenerator.cs.meta new file mode 100644 index 0000000..c23f309 --- /dev/null +++ b/Assets/Scripts/Editor/GridGenerator/GridGenerator.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 50d99d82db098f143b97912777f8c022 +timeCreated: 1500793401 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Editor/ImageEffects.meta b/Assets/Scripts/Editor/ImageEffects.meta new file mode 100644 index 0000000..4130726 --- /dev/null +++ b/Assets/Scripts/Editor/ImageEffects.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 8a3e1002f6a65554fb21b5baea37a33b +folderAsset: yes +timeCreated: 1500793397 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Editor/ImageEffects/ColorCorrectionCurvesEditorLayers.meta b/Assets/Scripts/Editor/ImageEffects/ColorCorrectionCurvesEditorLayers.meta new file mode 100644 index 0000000..07b343c --- /dev/null +++ b/Assets/Scripts/Editor/ImageEffects/ColorCorrectionCurvesEditorLayers.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 71cb5aca4636e344db9f91f7236a532e +timeCreated: 1500793398 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Editor/README.md.meta b/Assets/Scripts/Editor/README.md.meta new file mode 100644 index 0000000..1bd5cc5 --- /dev/null +++ b/Assets/Scripts/Editor/README.md.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d99cb649a69348c42b9a6e8d62766538 +timeCreated: 1500793397 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Editor/SetPivot.cs.meta b/Assets/Scripts/Editor/SetPivot.cs.meta new file mode 100644 index 0000000..f2c0f24 --- /dev/null +++ b/Assets/Scripts/Editor/SetPivot.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: a41d285eb1e4e5148a8eb9faf1d929ec +timeCreated: 1500793403 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Editor/SpriteBackgroundRemover.cs.meta b/Assets/Scripts/Editor/SpriteBackgroundRemover.cs.meta new file mode 100644 index 0000000..8945f25 --- /dev/null +++ b/Assets/Scripts/Editor/SpriteBackgroundRemover.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 2737bc699c1d92f4ca840a5dc0992efa +timeCreated: 1500793401 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Editor/Tools.meta b/Assets/Scripts/Editor/Tools.meta new file mode 100644 index 0000000..ff5a06e --- /dev/null +++ b/Assets/Scripts/Editor/Tools.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 2a517a11ecc7f514381fcf9318d8fbfa +folderAsset: yes +timeCreated: 1500793396 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Editor/Tools/CopyPasteHelper.cs.meta b/Assets/Scripts/Editor/Tools/CopyPasteHelper.cs.meta new file mode 100644 index 0000000..f4742ce --- /dev/null +++ b/Assets/Scripts/Editor/Tools/CopyPasteHelper.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: a02af6a99d72383438d6fdca2684b2cf +timeCreated: 1500793403 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Editor/UI.meta b/Assets/Scripts/Editor/UI.meta new file mode 100644 index 0000000..97b5f19 --- /dev/null +++ b/Assets/Scripts/Editor/UI.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: ae079ea44417ab84fa840a15feb4daca +folderAsset: yes +timeCreated: 1500793397 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Editor/UI/CanvasScalerUtil.meta b/Assets/Scripts/Editor/UI/CanvasScalerUtil.meta new file mode 100644 index 0000000..8cdd599 --- /dev/null +++ b/Assets/Scripts/Editor/UI/CanvasScalerUtil.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 4506db3ef67122146adf637a6b43e8eb +folderAsset: yes +timeCreated: 1500793397 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Helpers.meta b/Assets/Scripts/Helpers.meta new file mode 100644 index 0000000..d4b54c5 --- /dev/null +++ b/Assets/Scripts/Helpers.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: f420d7df62f441e43b80fb1fc389ff95 +folderAsset: yes +timeCreated: 1500793395 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Helpers/Debug.meta b/Assets/Scripts/Helpers/Debug.meta new file mode 100644 index 0000000..07aa051 --- /dev/null +++ b/Assets/Scripts/Helpers/Debug.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 163f9d000f608304ab9d958351b79726 +folderAsset: yes +timeCreated: 1500793396 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Helpers/Debug/Timer.cs b/Assets/Scripts/Helpers/Debug/Timer.cs index 042fa28..9fd0cb2 100644 --- a/Assets/Scripts/Helpers/Debug/Timer.cs +++ b/Assets/Scripts/Helpers/Debug/Timer.cs @@ -5,24 +5,24 @@ namespace UnityLibrary { - public class Timer : MonoBehaviour - { - void Start() - { - // init and start timer - var stopwatch = new Stopwatch(); - stopwatch.Start(); + public class Timer : MonoBehaviour + { + void Start () + { + // init and start timer + var stopwatch = new Stopwatch (); + stopwatch.Start (); - // put your function here.. - for (int i = 0; i < 1000000; i++) - { - var tmp = "asdf" + 1.ToString(); - } + // put your function here.. + for ( int i = 0; i < 1000000; i++ ) + { + // Example : var tmp = "asdf" + 1.ToString(); + } - // get results in ms - stopwatch.Stop(); - Debug.LogFormat("Timer: {0} ms", stopwatch.ElapsedMilliseconds); - stopwatch.Reset(); - } - } + // get results in ms + stopwatch.Stop (); + Debug.LogFormat ( "Timer: {0} ms", stopwatch.ElapsedMilliseconds ); + stopwatch.Reset (); + } + } } diff --git a/Assets/Scripts/Helpers/Debug/Timer.cs.meta b/Assets/Scripts/Helpers/Debug/Timer.cs.meta new file mode 100644 index 0000000..12b4f5d --- /dev/null +++ b/Assets/Scripts/Helpers/Debug/Timer.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 0a04997683d5b6b459caa6cdfb9df9cc +timeCreated: 1500793400 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Helpers/DrawGLLine.cs.meta b/Assets/Scripts/Helpers/DrawGLLine.cs.meta new file mode 100644 index 0000000..bf6db10 --- /dev/null +++ b/Assets/Scripts/Helpers/DrawGLLine.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 95e3fc76aa41bf24089dcc6d549d0945 +timeCreated: 1500793403 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Helpers/DrawRendererBounds.cs.meta b/Assets/Scripts/Helpers/DrawRendererBounds.cs.meta new file mode 100644 index 0000000..fcd11d4 --- /dev/null +++ b/Assets/Scripts/Helpers/DrawRendererBounds.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: c54e110ad2490d9418390c4fa6ff8c98 +timeCreated: 1500793403 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Helpers/Drawing.meta b/Assets/Scripts/Helpers/Drawing.meta new file mode 100644 index 0000000..aad493f --- /dev/null +++ b/Assets/Scripts/Helpers/Drawing.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: dc1b64f3b947fe84796b604938b6c54b +folderAsset: yes +timeCreated: 1500793397 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Helpers/Drawing/DrawCrossHair.cs.meta b/Assets/Scripts/Helpers/Drawing/DrawCrossHair.cs.meta new file mode 100644 index 0000000..3d6d802 --- /dev/null +++ b/Assets/Scripts/Helpers/Drawing/DrawCrossHair.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 54f5f83ac4d434d4483d8af67fa6507c +timeCreated: 1500793401 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Helpers/FPSCounter.cs.meta b/Assets/Scripts/Helpers/FPSCounter.cs.meta new file mode 100644 index 0000000..f58c237 --- /dev/null +++ b/Assets/Scripts/Helpers/FPSCounter.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 8992bbf361e600a419f30454b6113634 +timeCreated: 1500793402 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Helpers/FileSystem.meta b/Assets/Scripts/Helpers/FileSystem.meta new file mode 100644 index 0000000..53ec446 --- /dev/null +++ b/Assets/Scripts/Helpers/FileSystem.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 3f5edf9425760c84d8dab63f73e53638 +folderAsset: yes +timeCreated: 1500793396 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Helpers/FileSystem/FileSystemWatch.cs.meta b/Assets/Scripts/Helpers/FileSystem/FileSystemWatch.cs.meta new file mode 100644 index 0000000..216ef49 --- /dev/null +++ b/Assets/Scripts/Helpers/FileSystem/FileSystemWatch.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 2ef04d2ffb61ab14c8622e026828e447 +timeCreated: 1500793401 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Helpers/FileSystem/OpenExternalFile.cs.meta b/Assets/Scripts/Helpers/FileSystem/OpenExternalFile.cs.meta new file mode 100644 index 0000000..8149910 --- /dev/null +++ b/Assets/Scripts/Helpers/FileSystem/OpenExternalFile.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 81def09443d40044295eebf503e1398e +timeCreated: 1500793402 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Helpers/Screenshot.meta b/Assets/Scripts/Helpers/Screenshot.meta new file mode 100644 index 0000000..e9591da --- /dev/null +++ b/Assets/Scripts/Helpers/Screenshot.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 85fd4ff8eea2d1844aa2d78c3927ae08 +folderAsset: yes +timeCreated: 1500793397 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Helpers/Screenshot/GrabDesktop.cs.meta b/Assets/Scripts/Helpers/Screenshot/GrabDesktop.cs.meta new file mode 100644 index 0000000..05493cc --- /dev/null +++ b/Assets/Scripts/Helpers/Screenshot/GrabDesktop.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 0dd4e41efe19d45448977b6c170111d4 +timeCreated: 1500793400 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Helpers/String.meta b/Assets/Scripts/Helpers/String.meta new file mode 100644 index 0000000..18d2cfb --- /dev/null +++ b/Assets/Scripts/Helpers/String.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 7a597f7452455c84bbe8aae4cbf2c88b +folderAsset: yes +timeCreated: 1500793397 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Helpers/String/StringOperationUtil.cs.meta b/Assets/Scripts/Helpers/String/StringOperationUtil.cs.meta new file mode 100644 index 0000000..eb01be2 --- /dev/null +++ b/Assets/Scripts/Helpers/String/StringOperationUtil.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: f19d41dbf283f0a468253c77d8342784 +timeCreated: 1500793404 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Helpers/Version.meta b/Assets/Scripts/Helpers/Version.meta new file mode 100644 index 0000000..9092080 --- /dev/null +++ b/Assets/Scripts/Helpers/Version.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: c9f673795c933264c8ded10a0f788f3e +folderAsset: yes +timeCreated: 1500793397 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Helpers/Version/GetVersion.cs.meta b/Assets/Scripts/Helpers/Version/GetVersion.cs.meta new file mode 100644 index 0000000..c7fba55 --- /dev/null +++ b/Assets/Scripts/Helpers/Version/GetVersion.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 6af499f915b5766429800fedfe008b72 +timeCreated: 1500793402 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Misc.meta b/Assets/Scripts/Misc.meta new file mode 100644 index 0000000..4f29603 --- /dev/null +++ b/Assets/Scripts/Misc.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 265af611d5d54e943985362e12ef25f2 +folderAsset: yes +timeCreated: 1500793394 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Misc/Messaging.meta b/Assets/Scripts/Misc/Messaging.meta new file mode 100644 index 0000000..e7fdaf1 --- /dev/null +++ b/Assets/Scripts/Misc/Messaging.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 14a931c0152878540a9389097c2fcc9e +folderAsset: yes +timeCreated: 1500793396 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Misc/Messaging/README.md.meta b/Assets/Scripts/Misc/Messaging/README.md.meta new file mode 100644 index 0000000..e4c8693 --- /dev/null +++ b/Assets/Scripts/Misc/Messaging/README.md.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 20e4e9786c8ffd140982a4cc0be76dfb +timeCreated: 1500793397 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Misc/MeteorRing.cs.meta b/Assets/Scripts/Misc/MeteorRing.cs.meta new file mode 100644 index 0000000..bcfab7b --- /dev/null +++ b/Assets/Scripts/Misc/MeteorRing.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 3f41ba8b090d5494b9cd0abb0d73b17e +timeCreated: 1500793401 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Misc/TexturePixels2Quads.cs.meta b/Assets/Scripts/Misc/TexturePixels2Quads.cs.meta new file mode 100644 index 0000000..2c5efc0 --- /dev/null +++ b/Assets/Scripts/Misc/TexturePixels2Quads.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 08b5cc9c62b05af448a31c6d2d020701 +timeCreated: 1500793399 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/README.md.meta b/Assets/Scripts/README.md.meta new file mode 100644 index 0000000..1ba400c --- /dev/null +++ b/Assets/Scripts/README.md.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3769a76ec6f190546995c89726eaf150 +timeCreated: 1500793394 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Serialization.meta b/Assets/Scripts/Serialization.meta new file mode 100644 index 0000000..04399dd --- /dev/null +++ b/Assets/Scripts/Serialization.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 9f168be270e83ad41bcba642d638e64e +folderAsset: yes +timeCreated: 1501219232 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Serialization/Color32Serializable.cs b/Assets/Scripts/Serialization/Color32Serializable.cs new file mode 100644 index 0000000..659dc00 --- /dev/null +++ b/Assets/Scripts/Serialization/Color32Serializable.cs @@ -0,0 +1,91 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Runtime.Serialization; +using UnityEngine; + +/// +/// Representation of RGBA colors in 32 bit format. +/// +[Serializable] +public struct Color32Serializable : ISerializable +{ + + #region Parameters + + /// + /// Th Red. + /// + public byte r; + + /// + /// The Green. + /// + public byte g; + + /// + /// The Blue. + /// + public byte b; + + /// + /// The Alpha. + /// + public byte a; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the struct. + /// + /// Color. + public Color32Serializable ( Color32 color ) : this ( color.r, color.g, color.b, color.a ) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// The red component. + /// The green component. + /// The blue component. + /// The alpha component. + public Color32Serializable ( byte r, byte g, byte b, byte a ) + { + this.r = r; + this.g = g; + this.b = b; + this.a = a; + } + + #endregion + + #region Operators Overload + + public static implicit operator Color32Serializable ( Color32 color ) + { + return new Color32Serializable ( color ); + } + + public static implicit operator Color32 ( Color32Serializable color ) + { + return new Color32 ( color.r, color.g, color.b, color.a ); + } + + #endregion + + #region ISerializable implementation + + public void GetObjectData ( SerializationInfo info, StreamingContext context ) + { + info.AddValue ( "r", this.r, typeof ( byte ) ); + info.AddValue ( "g", this.g, typeof ( byte ) ); + info.AddValue ( "b", this.b, typeof ( byte ) ); + info.AddValue ( "a", this.a, typeof ( byte ) ); + } + + #endregion + +} diff --git a/Assets/Scripts/Serialization/Color32Serializable.cs.meta b/Assets/Scripts/Serialization/Color32Serializable.cs.meta new file mode 100644 index 0000000..a552449 --- /dev/null +++ b/Assets/Scripts/Serialization/Color32Serializable.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 061cb47411476a94d8f5231532065360 +timeCreated: 1501219363 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Serialization/ColorSerializable.cs b/Assets/Scripts/Serialization/ColorSerializable.cs new file mode 100644 index 0000000..41462a3 --- /dev/null +++ b/Assets/Scripts/Serialization/ColorSerializable.cs @@ -0,0 +1,101 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Runtime.Serialization; +using UnityEngine; + +/// +/// Representation of RGBA colors. +/// +[Serializable] +public struct ColorSerializable : ISerializable +{ + + #region Parameters + + /// + /// Th Red. + /// + public float r; + + /// + /// The Green. + /// + public float g; + + /// + /// The Blue. + /// + public float b; + + /// + /// The Alpha. + /// + public float a; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the struct. + /// + /// The red component. + /// The green component. + /// The blue component. + public ColorSerializable ( float r, float g, float b ) : this ( r, g, b, 1f ) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// Color. + public ColorSerializable ( Color color ) : this ( color.r, color.g, color.b, color.a ) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// The red component. + /// The green component. + /// The blue component. + /// The alpha component. + public ColorSerializable ( float r, float g, float b, float a ) + { + this.r = r; + this.g = g; + this.b = b; + this.a = a; + } + + #endregion + + #region Operators Overload + + public static implicit operator ColorSerializable ( Color color ) + { + return new ColorSerializable ( color ); + } + + public static implicit operator Color ( ColorSerializable color ) + { + return new Color ( color.r, color.g, color.b, color.a ); + } + + #endregion + + #region ISerializable implementation + + public void GetObjectData ( SerializationInfo info, StreamingContext context ) + { + info.AddValue ( "r", this.r, typeof ( float ) ); + info.AddValue ( "g", this.g, typeof ( float ) ); + info.AddValue ( "b", this.b, typeof ( float ) ); + info.AddValue ( "a", this.a, typeof ( float ) ); + } + + #endregion + +} diff --git a/Assets/Scripts/Serialization/ColorSerializable.cs.meta b/Assets/Scripts/Serialization/ColorSerializable.cs.meta new file mode 100644 index 0000000..523b387 --- /dev/null +++ b/Assets/Scripts/Serialization/ColorSerializable.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 3b3f6bf5ffa85a94a844cd82e24937d5 +timeCreated: 1501219355 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Serialization/MeshSerializable.cs b/Assets/Scripts/Serialization/MeshSerializable.cs new file mode 100644 index 0000000..48c76f1 --- /dev/null +++ b/Assets/Scripts/Serialization/MeshSerializable.cs @@ -0,0 +1,102 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Runtime.Serialization; +using UnityEngine; + +/// +/// A class that allows creating and modifying meshes from scripts. +/// +[Serializable] +public sealed class MeshSerializable : UnityEngine.Object, ISerializable +{ + + #region Parameters + + public Vector3[] vertices; + public int[] triangles; + public Vector3[] normals; + public Color[] colors; + public Vector4[] tangents; + public Color32[] colors32; + public Vector2[] uv; + public Vector2[] uv2; + public Vector2[] uv3; + public Vector2[] uv4; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + public MeshSerializable () : this ( new Mesh () ) + { + + } + + /// + /// Initializes a new instance of the class. + /// + /// Mesh. + public MeshSerializable ( Mesh mesh ) + { + this.vertices = mesh.vertices; + this.triangles = mesh.triangles; + this.normals = mesh.normals; + this.colors = mesh.colors; + this.tangents = mesh.tangents; + this.colors32 = mesh.colors32; + this.uv = mesh.uv; + this.uv2 = mesh.uv2; + this.uv3 = mesh.uv3; + this.uv4 = mesh.uv4; + } + + #endregion + + #region Operators Overload + + public static implicit operator MeshSerializable ( Mesh mesh ) + { + return new MeshSerializable ( mesh ); + } + + public static implicit operator Mesh ( MeshSerializable mesh ) + { + Mesh result = new Mesh (); + result.vertices = mesh.vertices; + result.triangles = mesh.triangles; + result.normals = mesh.normals; + result.colors = mesh.colors; + result.tangents = mesh.tangents; + result.colors32 = mesh.colors32; + result.uv = mesh.uv; + result.uv2 = mesh.uv2; + result.uv3 = mesh.uv3; + result.uv4 = mesh.uv4; + return result; + } + + #endregion + + #region ISerializable implementation + + public void GetObjectData ( SerializationInfo info, StreamingContext context ) + { + info.AddValue ( "vertices", this.vertices, typeof ( Vector3[] ) ); + info.AddValue ( "triangles", this.triangles, typeof ( int[] ) ); + info.AddValue ( "normals", this.normals, typeof ( Vector3[] ) ); + info.AddValue ( "colors", this.colors, typeof ( Color[] ) ); + info.AddValue ( "tangents", this.tangents, typeof ( Vector4[] ) ); + info.AddValue ( "colors32", this.colors32, typeof ( Color32[] ) ); + info.AddValue ( "uv", this.uv, typeof ( Vector3[] ) ); + info.AddValue ( "uv2", this.uv2, typeof ( Vector3[] ) ); + info.AddValue ( "uv3", this.uv3, typeof ( Vector3[] ) ); + info.AddValue ( "uv4", this.uv4, typeof ( Vector3[] ) ); + } + + #endregion + +} diff --git a/Assets/Scripts/Serialization/MeshSerializable.cs.meta b/Assets/Scripts/Serialization/MeshSerializable.cs.meta new file mode 100644 index 0000000..1b63ced --- /dev/null +++ b/Assets/Scripts/Serialization/MeshSerializable.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: cefc979bdf83eee4f9f3bc6cae4700a8 +timeCreated: 1501219306 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Serialization/QuaternionSerializable.cs b/Assets/Scripts/Serialization/QuaternionSerializable.cs new file mode 100644 index 0000000..00dfbe6 --- /dev/null +++ b/Assets/Scripts/Serialization/QuaternionSerializable.cs @@ -0,0 +1,91 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Runtime.Serialization; +using UnityEngine; + +/// +/// Quaternions are used to represent rotations. +/// +[Serializable] +public struct QuaternionSerializable : ISerializable +{ + + #region Parameters + + /// + /// The x component. + /// + public float x; + + /// + /// The y component. + /// + public float y; + + /// + /// The z component. + /// + public float z; + + /// + /// The w component. + /// + public float w; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the struct. + /// + /// Quaternion. + public QuaternionSerializable ( Quaternion quaternion ) : this ( quaternion.x, quaternion.y, quaternion.z, quaternion.w ) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// The x coordinate. + /// The y coordinate. + /// The z coordinate. + /// The width. + public QuaternionSerializable ( float x, float y, float z, float w ) + { + this.x = x; + this.y = y; + this.z = z; + this.w = w; + } + + #endregion + + #region Operators Overload + + public static implicit operator QuaternionSerializable ( Quaternion quaternion ) + { + return new QuaternionSerializable ( quaternion ); + } + + public static implicit operator Quaternion ( QuaternionSerializable quaternion ) + { + return new Quaternion ( quaternion.x, quaternion.y, quaternion.z, quaternion.w ); + } + + #endregion + + #region ISerializable implementation + + public void GetObjectData ( SerializationInfo info, StreamingContext context ) + { + info.AddValue ( "x", this.x, typeof ( float ) ); + info.AddValue ( "y", this.y, typeof ( float ) ); + info.AddValue ( "z", this.z, typeof ( float ) ); + info.AddValue ( "w", this.w, typeof ( float ) ); + } + + #endregion + +} diff --git a/Assets/Scripts/Serialization/QuaternionSerializable.cs.meta b/Assets/Scripts/Serialization/QuaternionSerializable.cs.meta new file mode 100644 index 0000000..fc9242a --- /dev/null +++ b/Assets/Scripts/Serialization/QuaternionSerializable.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 0478a8da07814774989772b1065d060b +timeCreated: 1501219344 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Serialization/Vector2Serializable.cs b/Assets/Scripts/Serialization/Vector2Serializable.cs new file mode 100644 index 0000000..8e4374d --- /dev/null +++ b/Assets/Scripts/Serialization/Vector2Serializable.cs @@ -0,0 +1,155 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Runtime.Serialization; +using UnityEngine; + +/// +/// Representation of 2D vectors and points. +/// +[Serializable] +public struct Vector2Serializable : ISerializable +{ + + #region Parametres + + /// + /// X component of the vector. + /// + public float x; + + /// + /// Y component of the vector. + /// + public float y; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the struct. + /// + /// Vector. + public Vector2Serializable ( Vector2 vector ) : this ( vector.x, vector.y ) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// Vector. + public Vector2Serializable ( Vector3 vector ) : this ( vector.x, vector.y ) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// Vector. + public Vector2Serializable ( Vector4 vector ) : this ( vector.x, vector.y ) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// The x coordinate. + /// The y coordinate. + public Vector2Serializable ( float x, float y ) + { + this.x = x; + this.y = y; + } + + #endregion + + #region Methods + + public override bool Equals ( object obj ) + { + if ( obj is Vector2Serializable || obj is Vector2 ) + { + Vector2Serializable vector = ( Vector2Serializable )obj; + return this.x == vector.x && this.y == vector.y; + } + return false; + } + + public override int GetHashCode () + { + return this.x.GetHashCode () ^ this.y.GetHashCode () << 2; + } + + public override string ToString () + { + return string.Format ( "({0}, {1})", this.x, this.y ); + } + + #endregion + + #region Operators Overload + + public static implicit operator Vector2Serializable ( Vector2 vector ) + { + return new Vector2Serializable ( vector ); + } + + public static implicit operator Vector2 ( Vector2Serializable vector ) + { + return new Vector2 ( vector.x, vector.y ); + } + + public static implicit operator Vector2Serializable ( Vector3 vector ) + { + return new Vector2Serializable ( vector ); + } + + public static implicit operator Vector3 ( Vector2Serializable vector ) + { + return new Vector3 ( vector.x, vector.y ); + } + + public static implicit operator Vector2Serializable ( Vector4 vector ) + { + return new Vector2Serializable ( vector ); + } + + public static implicit operator Vector4 ( Vector2Serializable vector ) + { + return new Vector4 ( vector.x, vector.y ); + } + + public static implicit operator Vector2Serializable ( Vector3Serializable vector ) + { + return new Vector2Serializable ( ( Vector2 )vector ); + } + + public static implicit operator Vector3Serializable ( Vector2Serializable vector ) + { + return new Vector3Serializable ( ( Vector2 )vector ); + } + + public static implicit operator Vector2Serializable ( Vector4Serializable vector ) + { + return new Vector2Serializable ( ( Vector2 )vector ); + } + + public static implicit operator Vector4Serializable ( Vector2Serializable vector ) + { + return new Vector4Serializable ( ( Vector2 )vector ); + } + + #endregion + + #region ISerializable implementation + + public void GetObjectData ( SerializationInfo info, StreamingContext context ) + { + info.AddValue ( "x", this.x, typeof ( float ) ); + info.AddValue ( "y", this.y, typeof ( float ) ); + } + + #endregion + +} diff --git a/Assets/Scripts/Serialization/Vector2Serializable.cs.meta b/Assets/Scripts/Serialization/Vector2Serializable.cs.meta new file mode 100644 index 0000000..a9fc810 --- /dev/null +++ b/Assets/Scripts/Serialization/Vector2Serializable.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: fba189e2785c0d044acb994360e29d47 +timeCreated: 1501219297 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Serialization/Vector3Serializable.cs b/Assets/Scripts/Serialization/Vector3Serializable.cs new file mode 100644 index 0000000..e3fb18f --- /dev/null +++ b/Assets/Scripts/Serialization/Vector3Serializable.cs @@ -0,0 +1,172 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Runtime.Serialization; +using UnityEngine; + +/// +/// Representation of 3D vectors and points. +/// +[Serializable] +public struct Vector3Serializable : ISerializable +{ + + #region Parametres + + /// + /// X component of the vector. + /// + public float x; + + /// + /// Y component of the vector. + /// + public float y; + + /// + /// Z component of the vector. + /// + public float z; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the struct. + /// + /// Vector. + public Vector3Serializable ( Vector2 vector ) : this ( vector.x, vector.y ) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// Vector. + public Vector3Serializable ( Vector3 vector ) : this ( vector.x, vector.y, vector.z ) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// Vector. + public Vector3Serializable ( Vector4 vector ) : this ( vector.x, vector.y, vector.z ) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// The x coordinate. + /// The y coordinate. + public Vector3Serializable ( float x, float y ) : this ( x, y, 0f ) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// The x coordinate. + /// The y coordinate. + /// The z coordinate. + public Vector3Serializable ( float x, float y, float z ) + { + this.x = x; + this.y = y; + this.z = z; + } + + #endregion + + #region Methods + + public override bool Equals ( object obj ) + { + if ( obj is Vector3Serializable || obj is Vector3 ) + { + Vector3Serializable vector = ( Vector3Serializable )obj; + return this.x == vector.x && this.y == vector.y && this.z == vector.z; + } + return false; + } + + public override int GetHashCode () + { + return this.x.GetHashCode () ^ this.y.GetHashCode () << 2 ^ this.z.GetHashCode () >> 2; + } + + public override string ToString () + { + return string.Format ( "({0}, {1}, {2})", this.x, this.y, this.z ); + } + + #endregion + + #region Operators Overload + + public static implicit operator Vector3Serializable ( Vector2 vector ) + { + return new Vector3Serializable ( vector ); + } + + public static implicit operator Vector2 ( Vector3Serializable vector ) + { + return new Vector2 ( vector.x, vector.y ); + } + + public static implicit operator Vector3Serializable ( Vector3 vector ) + { + return new Vector3Serializable ( vector ); + } + + public static implicit operator Vector3 ( Vector3Serializable vector ) + { + return new Vector3 ( vector.x, vector.y, vector.z ); + } + + public static implicit operator Vector3Serializable ( Vector4 vector ) + { + return new Vector3Serializable ( vector ); + } + + public static implicit operator Vector4 ( Vector3Serializable vector ) + { + return new Vector4 ( vector.x, vector.y, vector.z ); + } + + public static implicit operator Vector3Serializable ( Vector2Serializable vector ) + { + return new Vector3Serializable ( ( Vector3 )vector ); + } + + public static implicit operator Vector2Serializable ( Vector3Serializable vector ) + { + return new Vector2Serializable ( ( Vector3 )vector ); + } + + public static implicit operator Vector3Serializable ( Vector4Serializable vector ) + { + return new Vector3Serializable ( ( Vector3 )vector ); + } + + public static implicit operator Vector4Serializable ( Vector3Serializable vector ) + { + return new Vector4Serializable ( ( Vector3 )vector ); + } + + #endregion + + #region ISerializable implementation + + public void GetObjectData ( SerializationInfo info, StreamingContext context ) + { + info.AddValue ( "x", this.x, typeof ( float ) ); + info.AddValue ( "y", this.y, typeof ( float ) ); + info.AddValue ( "z", this.z, typeof ( float ) ); + } + + #endregion + +} diff --git a/Assets/Scripts/Serialization/Vector3Serializable.cs.meta b/Assets/Scripts/Serialization/Vector3Serializable.cs.meta new file mode 100644 index 0000000..c43c852 --- /dev/null +++ b/Assets/Scripts/Serialization/Vector3Serializable.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 6c5e14b336560c043bf6176b01621604 +timeCreated: 1501219289 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Serialization/Vector4Serializable.cs b/Assets/Scripts/Serialization/Vector4Serializable.cs new file mode 100644 index 0000000..7adb319 --- /dev/null +++ b/Assets/Scripts/Serialization/Vector4Serializable.cs @@ -0,0 +1,190 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Runtime.Serialization; +using UnityEngine; + +/// +/// Representation of four-dimensional vectors. +/// +[Serializable] +public struct Vector4Serializable : ISerializable +{ + + #region Parametres + + /// + /// X component of the vector. + /// + public float x; + + /// + /// Y component of the vector. + /// + public float y; + + /// + /// Z component of the vector. + /// + public float z; + + /// + /// W component of the vector. + /// + public float w; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the struct. + /// + /// Vector. + public Vector4Serializable ( Vector2 vector ) : this ( vector.x, vector.y ) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// Vector. + public Vector4Serializable ( Vector3 vector ) : this ( vector.x, vector.y, vector.z ) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// Vector. + public Vector4Serializable ( Vector4 vector ) : this ( vector.x, vector.y, vector.z, vector.w ) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// The x coordinate. + /// The y coordinate. + public Vector4Serializable ( float x, float y ) : this ( x, y, 0f ) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// The x coordinate. + /// The y coordinate. + /// The z coordinate. + public Vector4Serializable ( float x, float y, float z ) : this ( x, y, z, 0f ) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// The x coordinate. + /// The y coordinate. + /// The z coordinate. + /// The width. + public Vector4Serializable ( float x, float y, float z, float w ) + { + this.x = x; + this.y = y; + this.z = z; + this.w = w; + } + + #endregion + + #region Methods + + public override bool Equals ( object obj ) + { + if ( obj is Vector4Serializable || obj is Vector4 ) + { + Vector4Serializable vector = ( Vector4Serializable )obj; + return this.x == vector.x && this.y == vector.y && this.z == vector.z && this.w == vector.w; + } + return false; + } + + public override int GetHashCode () + { + return this.x.GetHashCode () ^ this.y.GetHashCode () << 2 ^ this.z.GetHashCode () >> 2 ^ this.w.GetHashCode () >> 1; + } + + public override string ToString () + { + return string.Format ( "({0}, {1}, {2}, {3})", this.x, this.y, this.z, this.w ); + } + + #endregion + + #region Operators Overload + + public static implicit operator Vector4Serializable ( Vector2 vector ) + { + return new Vector4Serializable ( vector ); + } + + public static implicit operator Vector2 ( Vector4Serializable vector ) + { + return new Vector2 ( vector.x, vector.y ); + } + + public static implicit operator Vector4Serializable ( Vector3 vector ) + { + return new Vector4Serializable ( vector ); + } + + public static implicit operator Vector3 ( Vector4Serializable vector ) + { + return new Vector3 ( vector.x, vector.y, vector.z ); + } + + public static implicit operator Vector4Serializable ( Vector4 vector ) + { + return new Vector4Serializable ( vector ); + } + + public static implicit operator Vector4 ( Vector4Serializable vector ) + { + return new Vector4 ( vector.x, vector.y, vector.z, vector.w ); + } + + public static implicit operator Vector4Serializable ( Vector2Serializable vector ) + { + return new Vector4Serializable ( ( Vector4 )vector ); + } + + public static implicit operator Vector2Serializable ( Vector4Serializable vector ) + { + return new Vector2Serializable ( ( Vector4 )vector ); + } + + public static implicit operator Vector4Serializable ( Vector3Serializable vector ) + { + return new Vector4Serializable ( ( Vector4 )vector ); + } + + public static implicit operator Vector3Serializable ( Vector4Serializable vector ) + { + return new Vector3Serializable ( ( Vector4 )vector ); + } + + #endregion + + #region ISerializable implementation + + public void GetObjectData ( SerializationInfo info, StreamingContext context ) + { + info.AddValue ( "x", this.x, typeof ( float ) ); + info.AddValue ( "y", this.y, typeof ( float ) ); + info.AddValue ( "z", this.w, typeof ( float ) ); + info.AddValue ( "w", this.w, typeof ( float ) ); + } + + #endregion + +} diff --git a/Assets/Scripts/Serialization/Vector4Serializable.cs.meta b/Assets/Scripts/Serialization/Vector4Serializable.cs.meta new file mode 100644 index 0000000..c887273 --- /dev/null +++ b/Assets/Scripts/Serialization/Vector4Serializable.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: fb0c350f61853c243946e31479fabb1e +timeCreated: 1501219243 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/StandardAssets.meta b/Assets/Scripts/StandardAssets.meta new file mode 100644 index 0000000..943a56a --- /dev/null +++ b/Assets/Scripts/StandardAssets.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 68d0fff757765464085386ad8f2ba1a3 +folderAsset: yes +timeCreated: 1500793395 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/StandardAssets/Effects.meta b/Assets/Scripts/StandardAssets/Effects.meta new file mode 100644 index 0000000..ddd6aed --- /dev/null +++ b/Assets/Scripts/StandardAssets/Effects.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: e4f90274a4ad23c45acb3f913c13ede9 +folderAsset: yes +timeCreated: 1500793397 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/StandardAssets/Effects/ImageEffects.meta b/Assets/Scripts/StandardAssets/Effects/ImageEffects.meta new file mode 100644 index 0000000..892ed59 --- /dev/null +++ b/Assets/Scripts/StandardAssets/Effects/ImageEffects.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 2260bfb777ab88a499b7f61f535056b9 +folderAsset: yes +timeCreated: 1500793397 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/StandardAssets/Effects/ImageEffects/Scripts.meta b/Assets/Scripts/StandardAssets/Effects/ImageEffects/Scripts.meta new file mode 100644 index 0000000..11d902b --- /dev/null +++ b/Assets/Scripts/StandardAssets/Effects/ImageEffects/Scripts.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 33b3dd2e4d992da4695f9520dbb410bc +folderAsset: yes +timeCreated: 1500793398 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/StandardAssets/Effects/ImageEffects/Scripts/ColorCorrectionCurvesLayers.cs.meta b/Assets/Scripts/StandardAssets/Effects/ImageEffects/Scripts/ColorCorrectionCurvesLayers.cs.meta new file mode 100644 index 0000000..66a3390 --- /dev/null +++ b/Assets/Scripts/StandardAssets/Effects/ImageEffects/Scripts/ColorCorrectionCurvesLayers.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 2e50bcdf16588814ca6defae8b5d7dd4 +timeCreated: 1500793401 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Threading.meta b/Assets/Scripts/Threading.meta new file mode 100644 index 0000000..97add67 --- /dev/null +++ b/Assets/Scripts/Threading.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 0b51762ded3cb9b4da62090d1c50dc40 +folderAsset: yes +timeCreated: 1500793393 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Threading/ThreadPoolTest.cs.meta b/Assets/Scripts/Threading/ThreadPoolTest.cs.meta new file mode 100644 index 0000000..6f5c1fa --- /dev/null +++ b/Assets/Scripts/Threading/ThreadPoolTest.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 2d665831a9a905f4ca438b12feeb15c4 +timeCreated: 1500793401 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders.meta b/Assets/Shaders.meta new file mode 100644 index 0000000..7ceb4a8 --- /dev/null +++ b/Assets/Shaders.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 0341514ed0c04a14eb37ae0d2aa774d4 +folderAsset: yes +timeCreated: 1500793393 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/Debug.meta b/Assets/Shaders/Debug.meta new file mode 100644 index 0000000..aefc2c2 --- /dev/null +++ b/Assets/Shaders/Debug.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 55b820388fd4d244398803fb14513b49 +folderAsset: yes +timeCreated: 1500793395 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/Debug/DebugNormalsTangents.shader.meta b/Assets/Shaders/Debug/DebugNormalsTangents.shader.meta new file mode 100644 index 0000000..5d7f422 --- /dev/null +++ b/Assets/Shaders/Debug/DebugNormalsTangents.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 4c021e765a244dd4cb0307376032fa0a +timeCreated: 1500793449 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/Debug/LerpColorNearToFarPlane.shader.meta b/Assets/Shaders/Debug/LerpColorNearToFarPlane.shader.meta new file mode 100644 index 0000000..3dfdd91 --- /dev/null +++ b/Assets/Shaders/Debug/LerpColorNearToFarPlane.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 91f2627c2dd513245bf7515fdb7796f2 +timeCreated: 1500793459 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/Effects.meta b/Assets/Shaders/Effects.meta new file mode 100644 index 0000000..c0a412b --- /dev/null +++ b/Assets/Shaders/Effects.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 4f49c823d2cc1c84eb8af77dcc706003 +folderAsset: yes +timeCreated: 1500793395 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/Effects/2D.meta b/Assets/Shaders/Effects/2D.meta new file mode 100644 index 0000000..ef890cf --- /dev/null +++ b/Assets/Shaders/Effects/2D.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: d1d731aef5970e3419edfcd06e282807 +folderAsset: yes +timeCreated: 1500793397 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/Effects/2D/ExplosionCircle.shader.meta b/Assets/Shaders/Effects/2D/ExplosionCircle.shader.meta new file mode 100644 index 0000000..ec05eee --- /dev/null +++ b/Assets/Shaders/Effects/2D/ExplosionCircle.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 70e65bf87fb65fb41986104ef8ab98b6 +timeCreated: 1500793458 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/Effects/AlphaBlendMasked.shader.meta b/Assets/Shaders/Effects/AlphaBlendMasked.shader.meta new file mode 100644 index 0000000..e282edb --- /dev/null +++ b/Assets/Shaders/Effects/AlphaBlendMasked.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: f61dad5edd22df54fb4587316f40f411 +timeCreated: 1500793477 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/Effects/Glow.shader.meta b/Assets/Shaders/Effects/Glow.shader.meta new file mode 100644 index 0000000..6f04600 --- /dev/null +++ b/Assets/Shaders/Effects/Glow.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: feb86f7525c215b4c803d7ce16a4aedc +timeCreated: 1500793480 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/Effects/Highlight.shader.meta b/Assets/Shaders/Effects/Highlight.shader.meta new file mode 100644 index 0000000..07b07e9 --- /dev/null +++ b/Assets/Shaders/Effects/Highlight.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 23fc256da1af2dd44bb8cf5fe363aed3 +timeCreated: 1500793448 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/Effects/ToonIce.shader.meta b/Assets/Shaders/Effects/ToonIce.shader.meta new file mode 100644 index 0000000..d4366bf --- /dev/null +++ b/Assets/Shaders/Effects/ToonIce.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: af52aa2c61ae85c47a09120b25d5f0eb +timeCreated: 1500793463 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/Effects/WireFrame.shader.meta b/Assets/Shaders/Effects/WireFrame.shader.meta new file mode 100644 index 0000000..91d5739 --- /dev/null +++ b/Assets/Shaders/Effects/WireFrame.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 31fc58e629e444741ba82377c6234196 +timeCreated: 1500793449 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/ImageEffects.meta b/Assets/Shaders/ImageEffects.meta new file mode 100644 index 0000000..7d96899 --- /dev/null +++ b/Assets/Shaders/ImageEffects.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 515803c91c2131040af4bfa75af4ad38 +folderAsset: yes +timeCreated: 1500793395 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/ImageEffects/GrayscaleLayers.cs.meta b/Assets/Shaders/ImageEffects/GrayscaleLayers.cs.meta new file mode 100644 index 0000000..30a3e03 --- /dev/null +++ b/Assets/Shaders/ImageEffects/GrayscaleLayers.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 5edc2eab7c433e047b19d869fe66b021 +timeCreated: 1500793402 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/Mask.meta b/Assets/Shaders/Mask.meta new file mode 100644 index 0000000..90a3db2 --- /dev/null +++ b/Assets/Shaders/Mask.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 131b9655ea502674c9577a35011aec1a +folderAsset: yes +timeCreated: 1500793394 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/Mask/DepthMask.shader.meta b/Assets/Shaders/Mask/DepthMask.shader.meta new file mode 100644 index 0000000..650a46b --- /dev/null +++ b/Assets/Shaders/Mask/DepthMask.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 674b907411eb5d74a8d85ca98816f7c6 +timeCreated: 1500793454 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/README.md.meta b/Assets/Shaders/README.md.meta new file mode 100644 index 0000000..e2703b1 --- /dev/null +++ b/Assets/Shaders/README.md.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3da44f7f0d7760d4e8b776ae1673fbe1 +timeCreated: 1500793395 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/Reflective.meta b/Assets/Shaders/Reflective.meta new file mode 100644 index 0000000..4f5aace --- /dev/null +++ b/Assets/Shaders/Reflective.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 0cc84c491ff495544be1e326393b1615 +folderAsset: yes +timeCreated: 1500793394 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/Reflective/BumpedSpecularFresnel.shader.meta b/Assets/Shaders/Reflective/BumpedSpecularFresnel.shader.meta new file mode 100644 index 0000000..c0fc01c --- /dev/null +++ b/Assets/Shaders/Reflective/BumpedSpecularFresnel.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 0079b74170cd5fc4aa82cfb9d7e1ff20 +timeCreated: 1500793447 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/ReliefMapping.meta b/Assets/Shaders/ReliefMapping.meta new file mode 100644 index 0000000..c81b796 --- /dev/null +++ b/Assets/Shaders/ReliefMapping.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: feb4f9880e6c6d54083cd1bcb109dc9f +folderAsset: yes +timeCreated: 1500793396 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/ReliefMapping/ReliefMapping.shader.meta b/Assets/Shaders/ReliefMapping/ReliefMapping.shader.meta new file mode 100644 index 0000000..b4e9620 --- /dev/null +++ b/Assets/Shaders/ReliefMapping/ReliefMapping.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 6323b67979f9b2f41b3a63b382daf156 +timeCreated: 1500793453 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/SkyBox.meta b/Assets/Shaders/SkyBox.meta new file mode 100644 index 0000000..6f472aa --- /dev/null +++ b/Assets/Shaders/SkyBox.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 733527ee659d25b4e9971e1b58935d11 +folderAsset: yes +timeCreated: 1500793395 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/SkyBox/Cubemap-Simple.shader.meta b/Assets/Shaders/SkyBox/Cubemap-Simple.shader.meta new file mode 100644 index 0000000..816b562 --- /dev/null +++ b/Assets/Shaders/SkyBox/Cubemap-Simple.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 2a8b2b13e1fbf4d4683fc8ab5cbefd08 +timeCreated: 1500793448 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/Sprites.meta b/Assets/Shaders/Sprites.meta new file mode 100644 index 0000000..a4ad01c --- /dev/null +++ b/Assets/Shaders/Sprites.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: d514920e40d9a2c4bb098b6dd37c765b +folderAsset: yes +timeCreated: 1500793395 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/Sprites/SpriteDropShadow.shader.meta b/Assets/Shaders/Sprites/SpriteDropShadow.shader.meta new file mode 100644 index 0000000..f956e11 --- /dev/null +++ b/Assets/Shaders/Sprites/SpriteDropShadow.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: f6b01e7d917479745ac109d566b805f4 +timeCreated: 1500793478 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/Sprites/SpriteHDRBloom.shader.meta b/Assets/Shaders/Sprites/SpriteHDRBloom.shader.meta new file mode 100644 index 0000000..da4a5c1 --- /dev/null +++ b/Assets/Shaders/Sprites/SpriteHDRBloom.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: b9e666d252d7f5d418f6af0311d5f20c +timeCreated: 1500793465 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/Terrain.meta b/Assets/Shaders/Terrain.meta new file mode 100644 index 0000000..84e8708 --- /dev/null +++ b/Assets/Shaders/Terrain.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: a19e0b2644eb95746a254fe12c1e1f20 +folderAsset: yes +timeCreated: 1500793395 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/Terrain/Splatmask4Textures.shader.meta b/Assets/Shaders/Terrain/Splatmask4Textures.shader.meta new file mode 100644 index 0000000..dd748c6 --- /dev/null +++ b/Assets/Shaders/Terrain/Splatmask4Textures.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: dc4198c03554ea242b092eac310315d8 +timeCreated: 1500793475 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/Terrain/Trees.meta b/Assets/Shaders/Terrain/Trees.meta new file mode 100644 index 0000000..5d7f38c --- /dev/null +++ b/Assets/Shaders/Terrain/Trees.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 3d8c59865c792554a9da41def0d54a26 +folderAsset: yes +timeCreated: 1500793396 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/Terrain/Trees/Unity-BillboardTree.shader.meta b/Assets/Shaders/Terrain/Trees/Unity-BillboardTree.shader.meta new file mode 100644 index 0000000..80d7db6 --- /dev/null +++ b/Assets/Shaders/Terrain/Trees/Unity-BillboardTree.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: e00c8f3696b8b4c4dbcbefe37a28cdfa +timeCreated: 1500793476 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/TextureMapping.meta b/Assets/Shaders/TextureMapping.meta new file mode 100644 index 0000000..e267916 --- /dev/null +++ b/Assets/Shaders/TextureMapping.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: ff1160a8c4b5696449c6df6e4a05909d +folderAsset: yes +timeCreated: 1500793396 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/TextureMapping/Equirectangular.shader.meta b/Assets/Shaders/TextureMapping/Equirectangular.shader.meta new file mode 100644 index 0000000..4fcb143 --- /dev/null +++ b/Assets/Shaders/TextureMapping/Equirectangular.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: c2a51d57daeec064195176107a64ec19 +timeCreated: 1500793468 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/UI.meta b/Assets/Shaders/UI.meta new file mode 100644 index 0000000..79c075b --- /dev/null +++ b/Assets/Shaders/UI.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 9f1773e3c18b8d44fa76cebdd910da0c +folderAsset: yes +timeCreated: 1500793395 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/UI/UI_Always_On_Top.shader.meta b/Assets/Shaders/UI/UI_Always_On_Top.shader.meta new file mode 100644 index 0000000..a98b00a --- /dev/null +++ b/Assets/Shaders/UI/UI_Always_On_Top.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: f93ce66ceeb7f8742bcf09caa64f1fb6 +timeCreated: 1500793478 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/Unlit.meta b/Assets/Shaders/Unlit.meta new file mode 100644 index 0000000..6731a47 --- /dev/null +++ b/Assets/Shaders/Unlit.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 1e441a495fdca78418458cb3dba06fd9 +folderAsset: yes +timeCreated: 1500793394 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/Unlit/UnlitTransparentColor.shader.meta b/Assets/Shaders/Unlit/UnlitTransparentColor.shader.meta new file mode 100644 index 0000000..9e7dc15 --- /dev/null +++ b/Assets/Shaders/Unlit/UnlitTransparentColor.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 067b62334bad98c499c8751f5755581c +timeCreated: 1500793447 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/Unlit/UnlitTransparentColorGradient.shader.meta b/Assets/Shaders/Unlit/UnlitTransparentColorGradient.shader.meta new file mode 100644 index 0000000..a7d1ad6 --- /dev/null +++ b/Assets/Shaders/Unlit/UnlitTransparentColorGradient.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 1e18fd258e063d84a83cb144e7708884 +timeCreated: 1500793448 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/Vertex.meta b/Assets/Shaders/Vertex.meta new file mode 100644 index 0000000..e9dc11b --- /dev/null +++ b/Assets/Shaders/Vertex.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 2a44a518ad7aa66468721a90103ab81e +folderAsset: yes +timeCreated: 1500793394 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/Vertex/UnlitFakeCurved.shader.meta b/Assets/Shaders/Vertex/UnlitFakeCurved.shader.meta new file mode 100644 index 0000000..677d7ae --- /dev/null +++ b/Assets/Shaders/Vertex/UnlitFakeCurved.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: cdcd1fe87f681e348ad1e6de834dccc7 +timeCreated: 1500793472 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/Vertex/UnlitTransparentColorGradient.shader.meta b/Assets/Shaders/Vertex/UnlitTransparentColorGradient.shader.meta new file mode 100644 index 0000000..107a4d4 --- /dev/null +++ b/Assets/Shaders/Vertex/UnlitTransparentColorGradient.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: fa97ff9cf8583334299162f06717640f +timeCreated: 1500793478 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/Vertex/VertexColorMesh.shader.meta b/Assets/Shaders/Vertex/VertexColorMesh.shader.meta new file mode 100644 index 0000000..a4b599e --- /dev/null +++ b/Assets/Shaders/Vertex/VertexColorMesh.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: e0d6ecfd2bff856419569d3aaca8fdc1 +timeCreated: 1500793477 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset index 2f7c187..023ccce 100644 --- a/ProjectSettings/ProjectSettings.asset +++ b/ProjectSettings/ProjectSettings.asset @@ -253,7 +253,7 @@ PlayerSettings: wiiUGamePadStartupScreen: {fileID: 0} wiiUDrcBufferDisabled: 0 wiiUProfilerLibPath: - playModeTestRunnerEnabled: 0 + playModeTestRunnerEnabled: 1 actionOnDotNetUnhandledException: 1 enableInternalProfiler: 0 logObjCUncaughtExceptions: 1 From d351c4be2696204d3911dd175abbc9e150bc7cac Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Sat, 29 Jul 2017 12:31:51 +0430 Subject: [PATCH 074/231] Create DrawLine.cs --- Assets/Scripts/Drawing/DrawLine.cs | 81 ++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 Assets/Scripts/Drawing/DrawLine.cs diff --git a/Assets/Scripts/Drawing/DrawLine.cs b/Assets/Scripts/Drawing/DrawLine.cs new file mode 100644 index 0000000..e485950 --- /dev/null +++ b/Assets/Scripts/Drawing/DrawLine.cs @@ -0,0 +1,81 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class DrawLine : MonoBehaviour +{ + + [SerializeField] + protected LineRenderer m_LineRenderer; + protected List m_Points; + + public virtual LineRenderer lineRenderer + { + get + { + return m_LineRenderer; + } + } + + public virtual List points + { + get + { + return m_Points; + } + } + + protected virtual void Awake () + { + if ( m_LineRenderer == null ) + { + Debug.LogWarning ( "DrawLine: Line Renderer not assigned, Adding and Using default Line Renderer." ); + CreateDefaultLineRenderer (); + } + m_Points = new List (); + } + + protected virtual void Update () + { + if ( Input.GetMouseButtonDown ( 0 ) ) + { + Reset (); + } + if ( Input.GetMouseButton ( 0 ) ) + { + Vector3 mousePosition = Camera.main.ScreenToWorldPoint ( Input.mousePosition ); + mousePosition.z = m_LineRenderer.transform.position.z; + if ( !m_Points.Contains ( mousePosition ) ) + { + m_Points.Add ( mousePosition ); + m_LineRenderer.positionCount = m_Points.Count; + m_LineRenderer.SetPosition ( m_LineRenderer.positionCount - 1, mousePosition ); + } + } + } + + protected virtual void Reset () + { + if ( m_LineRenderer != null ) + { + m_LineRenderer.positionCount = 0; + } + if ( m_Points != null ) + { + m_Points.Clear (); + } + } + + protected virtual void CreateDefaultLineRenderer () + { + m_LineRenderer = gameObject.AddComponent (); + m_LineRenderer.positionCount = 0; + m_LineRenderer.material = new Material ( Shader.Find ( "Particles/Additive" ) ); + m_LineRenderer.startColor = Color.white; + m_LineRenderer.endColor = Color.white; + m_LineRenderer.startWidth = 1f; + m_LineRenderer.endWidth = 1f; + m_LineRenderer.useWorldSpace = true; + } + +} From e19d9db6ff184a0208bf35267efd5ab9a5144af2 Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Sat, 29 Jul 2017 12:32:16 +0430 Subject: [PATCH 075/231] Create DrawLine2D.cs --- Assets/Scripts/2D/Drawing/DrawLine2D.cs | 118 ++++++++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 Assets/Scripts/2D/Drawing/DrawLine2D.cs diff --git a/Assets/Scripts/2D/Drawing/DrawLine2D.cs b/Assets/Scripts/2D/Drawing/DrawLine2D.cs new file mode 100644 index 0000000..45f5339 --- /dev/null +++ b/Assets/Scripts/2D/Drawing/DrawLine2D.cs @@ -0,0 +1,118 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class DrawLine2D : MonoBehaviour +{ + + [SerializeField] + protected LineRenderer m_LineRenderer; + [SerializeField] + protected bool m_AddCollider = false; + [SerializeField] + protected EdgeCollider2D m_EdgeCollider2D; + protected List m_Points; + + public virtual LineRenderer lineRenderer + { + get + { + return m_LineRenderer; + } + } + + public virtual bool addCollider + { + get + { + return m_AddCollider; + } + } + + public virtual EdgeCollider2D edgeCollider2D + { + get + { + return m_EdgeCollider2D; + } + } + + public virtual List points + { + get + { + return m_Points; + } + } + + protected virtual void Awake () + { + if ( m_LineRenderer == null ) + { + Debug.LogWarning ( "DrawLine: Line Renderer not assigned, Adding and Using default Line Renderer." ); + CreateDefaultLineRenderer (); + } + if ( m_EdgeCollider2D == null && m_AddCollider ) + { + Debug.LogWarning ( "DrawLine: Edge Collider 2D not assigned, Adding and Using default Edge Collider 2D." ); + CreateDefaultEdgeCollider2D (); + } + m_Points = new List (); + } + + protected virtual void Update () + { + if ( Input.GetMouseButtonDown ( 0 ) ) + { + Reset (); + } + if ( Input.GetMouseButton ( 0 ) ) + { + Vector2 mousePosition = Camera.main.ScreenToWorldPoint ( Input.mousePosition ); + if ( !m_Points.Contains ( mousePosition ) ) + { + m_Points.Add ( mousePosition ); + m_LineRenderer.positionCount = m_Points.Count; + m_LineRenderer.SetPosition ( m_LineRenderer.positionCount - 1, mousePosition ); + if ( m_EdgeCollider2D != null && m_AddCollider && m_Points.Count > 1 ) + { + m_EdgeCollider2D.points = m_Points.ToArray (); + } + } + } + } + + protected virtual void Reset () + { + if ( m_LineRenderer != null ) + { + m_LineRenderer.positionCount = 0; + } + if ( m_Points != null ) + { + m_Points.Clear (); + } + if ( m_EdgeCollider2D != null && m_AddCollider ) + { + m_EdgeCollider2D.Reset (); + } + } + + protected virtual void CreateDefaultLineRenderer () + { + m_LineRenderer = gameObject.AddComponent (); + m_LineRenderer.positionCount = 0; + m_LineRenderer.material = new Material ( Shader.Find ( "Particles/Additive" ) ); + m_LineRenderer.startColor = Color.white; + m_LineRenderer.endColor = Color.white; + m_LineRenderer.startWidth = 0.2f; + m_LineRenderer.endWidth = 0.2f; + m_LineRenderer.useWorldSpace = true; + } + + protected virtual void CreateDefaultEdgeCollider2D () + { + m_EdgeCollider2D = gameObject.AddComponent (); + } + +} From 4709129ee821e19309c7fe673b01021b90f71e72 Mon Sep 17 00:00:00 2001 From: mika Date: Sat, 29 Jul 2017 13:40:02 +0300 Subject: [PATCH 076/231] Update PixelPerfectCamera.cs --- .../Scripts/2D/Camera/PixelPerfectCamera.cs | 41 +++++++++++++++---- 1 file changed, 33 insertions(+), 8 deletions(-) diff --git a/Assets/Scripts/2D/Camera/PixelPerfectCamera.cs b/Assets/Scripts/2D/Camera/PixelPerfectCamera.cs index 3699d08..8736ef1 100644 --- a/Assets/Scripts/2D/Camera/PixelPerfectCamera.cs +++ b/Assets/Scripts/2D/Camera/PixelPerfectCamera.cs @@ -1,14 +1,39 @@ +// pixel perfect camera helpers, from old unity 2D tutorial videos +// source: https://www.youtube.com/watch?v=rMCLWt1DuqI + using UnityEngine; -// pixel perfect camera helpers, from old unity 2D tutorial videos +namespace UnityLibrary +{ + [ExecuteInEditMode] + public class PixelPerfectCamera : MonoBehaviour + { + public float pixelsToUnits = 100; + Camera cam; -[ExecuteInEditMode] -public class PixelPerfectCamera : MonoBehaviour { + void Start() + { + cam = GetComponent(); + if (cam == null) + { + Debug.LogError("Camera not found..", gameObject); + this.enabled = false; + return; + } + SetScale(); + } - public float pixelsToUnits = 100; + // in editor need to update in a loop, in case of game window resizes +#if UNITY_EDITOR + void Update() + { + SetScale(); + } +#endif - void Start () - { - GetComponent().orthographicSize = Screen.height / pixelsToUnits / 2; - } + void SetScale() + { + cam.orthographicSize = Screen.height / pixelsToUnits / 2; + } + } } From 34e87811520a7829568cf1b9657e5384f6df9b4a Mon Sep 17 00:00:00 2001 From: mika Date: Sat, 29 Jul 2017 13:40:17 +0300 Subject: [PATCH 077/231] Update ScaleCamera.cs --- Assets/Scripts/2D/Camera/ScaleCamera.cs | 49 +++++++++++++++++++------ 1 file changed, 38 insertions(+), 11 deletions(-) diff --git a/Assets/Scripts/2D/Camera/ScaleCamera.cs b/Assets/Scripts/2D/Camera/ScaleCamera.cs index b0195be..5330cea 100644 --- a/Assets/Scripts/2D/Camera/ScaleCamera.cs +++ b/Assets/Scripts/2D/Camera/ScaleCamera.cs @@ -1,16 +1,43 @@ -using UnityEngine; - // pixel perfect camera helpers, from old unity 2D tutorial videos +// source: https://www.youtube.com/watch?v=rMCLWt1DuqI -[ExecuteInEditMode] -public class ScaleCamera : MonoBehaviour -{ - public int targetWidth = 640; - public float pixelsToUnits = 100; +using UnityEngine; - void Start() +namespace UnityLibrary +{ + [ExecuteInEditMode] + public class ScaleCamera : MonoBehaviour { - int height = Mathf.RoundToInt(targetWidth / (float)Screen.width * Screen.height); - GetComponent().orthographicSize = height / pixelsToUnits / 2; - } + public int targetWidth = 640; + public float pixelsToUnits = 100; + + Camera cam; + + void Start() + { + cam = GetComponent(); + if (cam == null) + { + Debug.LogError("Camera not found..", gameObject); + this.enabled = false; + return; + } + + SetScale(); + } + + // in editor need to update in a loop, in case of game window resizes +#if UNITY_EDITOR + void Update() + { + SetScale(); + } +#endif + + void SetScale() + { + int height = Mathf.RoundToInt(targetWidth / (float)Screen.width * Screen.height); + cam.orthographicSize = height / pixelsToUnits / 2; + } + } } From f3a73be58621a37a3f80061899ad846f680dc0ed Mon Sep 17 00:00:00 2001 From: EmpireWorld Date: Sun, 30 Jul 2017 09:50:50 +0430 Subject: [PATCH 078/231] Update DrawLine --- Assets/Scenes/Test.unity | 2 +- Assets/Scripts/2D/Drawing.meta | 9 ++++++ Assets/Scripts/2D/Drawing/DrawLine2D.cs.meta | 12 ++++++++ Assets/Scripts/Drawing.meta | 9 ++++++ Assets/Scripts/Drawing/DrawLine.cs | 31 ++++++++++++++++++-- Assets/Scripts/Drawing/DrawLine.cs.meta | 12 ++++++++ Assets/Scripts/UI.meta | 9 ++++++ Assets/Scripts/UI/SetSelected.cs.meta | 12 ++++++++ 8 files changed, 92 insertions(+), 4 deletions(-) create mode 100644 Assets/Scripts/2D/Drawing.meta create mode 100644 Assets/Scripts/2D/Drawing/DrawLine2D.cs.meta create mode 100644 Assets/Scripts/Drawing.meta create mode 100644 Assets/Scripts/Drawing/DrawLine.cs.meta create mode 100644 Assets/Scripts/UI.meta create mode 100644 Assets/Scripts/UI/SetSelected.cs.meta diff --git a/Assets/Scenes/Test.unity b/Assets/Scenes/Test.unity index e7cbed3..4533bed 100644 --- a/Assets/Scenes/Test.unity +++ b/Assets/Scenes/Test.unity @@ -246,7 +246,7 @@ Camera: near clip plane: 0.3 far clip plane: 1000 field of view: 60 - orthographic: 0 + orthographic: 1 orthographic size: 5 m_Depth: -1 m_CullingMask: diff --git a/Assets/Scripts/2D/Drawing.meta b/Assets/Scripts/2D/Drawing.meta new file mode 100644 index 0000000..17ebebb --- /dev/null +++ b/Assets/Scripts/2D/Drawing.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 9acbf89372e16b448a5fbda547b9e83d +folderAsset: yes +timeCreated: 1501390147 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/2D/Drawing/DrawLine2D.cs.meta b/Assets/Scripts/2D/Drawing/DrawLine2D.cs.meta new file mode 100644 index 0000000..83b676e --- /dev/null +++ b/Assets/Scripts/2D/Drawing/DrawLine2D.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: ac0fbbea8fa72e74e9a6e8fcb8d1c6ae +timeCreated: 1501390147 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Drawing.meta b/Assets/Scripts/Drawing.meta new file mode 100644 index 0000000..d39dcb5 --- /dev/null +++ b/Assets/Scripts/Drawing.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: e1c3dce8b3aafb34786d2bb6fa8a24df +folderAsset: yes +timeCreated: 1501390147 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Drawing/DrawLine.cs b/Assets/Scripts/Drawing/DrawLine.cs index e485950..c95d7d0 100644 --- a/Assets/Scripts/Drawing/DrawLine.cs +++ b/Assets/Scripts/Drawing/DrawLine.cs @@ -7,6 +7,8 @@ public class DrawLine : MonoBehaviour [SerializeField] protected LineRenderer m_LineRenderer; + [SerializeField] + protected Camera m_Camera; protected List m_Points; public virtual LineRenderer lineRenderer @@ -17,6 +19,14 @@ public virtual LineRenderer lineRenderer } } + public virtual new Camera camera + { + get + { + return m_Camera; + } + } + public virtual List points { get @@ -32,6 +42,11 @@ protected virtual void Awake () Debug.LogWarning ( "DrawLine: Line Renderer not assigned, Adding and Using default Line Renderer." ); CreateDefaultLineRenderer (); } + if ( m_Camera == null ) + { + Debug.LogWarning ( "DrawLine: Camera not assigned, Using Main Camera or Creating Camera if main not exists." ); + CreateDefaultCamera (); + } m_Points = new List (); } @@ -43,7 +58,7 @@ protected virtual void Update () } if ( Input.GetMouseButton ( 0 ) ) { - Vector3 mousePosition = Camera.main.ScreenToWorldPoint ( Input.mousePosition ); + Vector3 mousePosition = m_Camera.ScreenToWorldPoint ( Input.mousePosition ); mousePosition.z = m_LineRenderer.transform.position.z; if ( !m_Points.Contains ( mousePosition ) ) { @@ -73,9 +88,19 @@ protected virtual void CreateDefaultLineRenderer () m_LineRenderer.material = new Material ( Shader.Find ( "Particles/Additive" ) ); m_LineRenderer.startColor = Color.white; m_LineRenderer.endColor = Color.white; - m_LineRenderer.startWidth = 1f; - m_LineRenderer.endWidth = 1f; + m_LineRenderer.startWidth = 0.3f; + m_LineRenderer.endWidth = 0.3f; m_LineRenderer.useWorldSpace = true; } + protected virtual void CreateDefaultCamera () + { + m_Camera = Camera.main; + if ( m_Camera == null ) + { + m_Camera = gameObject.AddComponent (); + } + m_Camera.orthographic = true; + } + } diff --git a/Assets/Scripts/Drawing/DrawLine.cs.meta b/Assets/Scripts/Drawing/DrawLine.cs.meta new file mode 100644 index 0000000..ea2e2b1 --- /dev/null +++ b/Assets/Scripts/Drawing/DrawLine.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: a98122fb61ecbdc42be2a513a469f129 +timeCreated: 1501390147 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/UI.meta b/Assets/Scripts/UI.meta new file mode 100644 index 0000000..068da7c --- /dev/null +++ b/Assets/Scripts/UI.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 57b254d4ae25bfb42a2a6d85c3e1b3b2 +folderAsset: yes +timeCreated: 1501227572 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/UI/SetSelected.cs.meta b/Assets/Scripts/UI/SetSelected.cs.meta new file mode 100644 index 0000000..a734ddc --- /dev/null +++ b/Assets/Scripts/UI/SetSelected.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: e262bedb4c989c241a0fe7a4764cabb1 +timeCreated: 1501227572 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From f131d8835b56c91d9fa97efcf5610c5287acb3db Mon Sep 17 00:00:00 2001 From: EmpireWorld Date: Mon, 31 Jul 2017 20:53:39 +0430 Subject: [PATCH 079/231] Add TransformExtensions.cs LookAt2D --- Assets/Scripts/Extensions.meta | 9 ++++ .../Scripts/Extensions/TransformExtensions.cs | 51 +++++++++++++++++++ .../Extensions/TransformExtensions.cs.meta | 12 +++++ 3 files changed, 72 insertions(+) create mode 100644 Assets/Scripts/Extensions.meta create mode 100644 Assets/Scripts/Extensions/TransformExtensions.cs create mode 100644 Assets/Scripts/Extensions/TransformExtensions.cs.meta diff --git a/Assets/Scripts/Extensions.meta b/Assets/Scripts/Extensions.meta new file mode 100644 index 0000000..1e3f99d --- /dev/null +++ b/Assets/Scripts/Extensions.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: f22051d526f0e5841b3027059c57a6cc +folderAsset: yes +timeCreated: 1501517477 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Extensions/TransformExtensions.cs b/Assets/Scripts/Extensions/TransformExtensions.cs new file mode 100644 index 0000000..ade95b8 --- /dev/null +++ b/Assets/Scripts/Extensions/TransformExtensions.cs @@ -0,0 +1,51 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace UnityLibrary +{ + + /// + /// Transform extensions. + /// Useful transform utilities and methods. + /// + public static class TransformExtensions + { + + /// + /// Rotates the transform so the forward vector points at target's current position. + /// + /// Transform. + /// Target. + public static void LookAt2D ( this Transform transform, Transform target ) + { + transform.LookAt2D ( ( Vector2 )target.position ); + } + + /// + /// Rotates the transform so the forward vector points at worldPosition. + /// + /// Transform. + /// World position. + public static void LookAt2D ( this Transform transform, Vector3 worldPosition ) + { + transform.LookAt2D ( ( Vector2 )worldPosition ); + } + + /// + /// Rotates the transform so the forward vector points at worldPosition. + /// + /// Transform. + /// World position. + public static void LookAt2D ( this Transform transform, Vector2 worldPosition ) + { + Vector2 distance = worldPosition - ( Vector2 )transform.position; + transform.eulerAngles = new Vector3 ( + transform.eulerAngles.x, + transform.eulerAngles.y, + Mathf.Atan2 ( distance.y, distance.x ) * Mathf.Rad2Deg ); + } + + } + +} \ No newline at end of file diff --git a/Assets/Scripts/Extensions/TransformExtensions.cs.meta b/Assets/Scripts/Extensions/TransformExtensions.cs.meta new file mode 100644 index 0000000..d9c11a2 --- /dev/null +++ b/Assets/Scripts/Extensions/TransformExtensions.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 2b0381052a6d9064b9dbd65600663886 +timeCreated: 1501517485 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From d77d01e13826723c7519cb54ae6b56491c64927d Mon Sep 17 00:00:00 2001 From: Carlos Cabral Date: Tue, 1 Aug 2017 13:42:09 -0300 Subject: [PATCH 080/231] Download new versions straight from the Editor Download new versions of Unity (alpha, beta, patches and releases) straight from the Editor. Shortcut in the editor for Statistics, Experimental Features and the Unity Roadmap. --- Assets/Scripts/Editor/HelpLastRelease.cs | 476 +++++++++++++++++++++++ 1 file changed, 476 insertions(+) create mode 100644 Assets/Scripts/Editor/HelpLastRelease.cs diff --git a/Assets/Scripts/Editor/HelpLastRelease.cs b/Assets/Scripts/Editor/HelpLastRelease.cs new file mode 100644 index 0000000..95f149d --- /dev/null +++ b/Assets/Scripts/Editor/HelpLastRelease.cs @@ -0,0 +1,476 @@ +/* + * Version: 2.3 + * Fork from the original script: https://pastebin.com/LzEHNB6U + * Purpose: Download new versions of Unity (alpha, beta, + * patches and releases) straight from the Editor. + * Shortcut in the editor for Statistics, Experimental + * Features and the Unity Roadmap. + * + * Usage: Menu, Links, Last Releases. + */ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Reflection; +using System.Text; +using UnityEditor; +using UnityEngine; +using Debug = UnityEngine.Debug; + +public class HelpLastRelease : EditorWindow { + const string statsUrl = @"http://hwstats.unity3d.com/index.html"; + const string experimenalUrl = @"http://unity3d.com/experimental"; + const string roadmapUrl = @"http://unity3d.com/unity/roadmap"; + const string archiveUrl = @"http://unity3d.com/get-unity/download/archive"; + const string betaArchiveUrl = @"http://unity3d.com/unity/beta/archive"; + const string releaseUrl = @"http://beta.unity3d.com/download/{0}/download.html"; + const string assistantUrl = @"http://beta.unity3d.com/download/{0}/UnityDownloadAssistant-{1}.{2}"; + const string serverUrl = @"http://symbolserver.unity3d.com/"; + const string historyUrl = serverUrl + @"000Admin/history.txt"; + const string finalRN = @"http://unity3d.com/unity/whats-new/unity-"; + const string betaRN = @"http://unity3d.com/unity/beta/unity"; + const string patchRN = @"http://unity3d.com/unity/qa/patch-releases"; + + const string baseName = "UnityYAMLMerge.ex"; + const string compressedName = baseName + "_"; + const string extractedName = baseName + "e"; + static string tempDir; + static WWW wwwHistory, wwwList, wwwMerger, wwwAssistant; + static readonly string zipName = Application.platform == RuntimePlatform.WindowsEditor ? "7z" : "7za"; + + static SortedList fullList; + static SortedList sortedList; + static SortedList currentList; + static int selected; + static bool assistant; + static HelpLastRelease window; + const string wndTitle = "Unity Builds"; + [SerializeField] + string search = ""; + static GUIStyle style; + const string prefsCount = "HelpLastRelease.count"; + const float minWidth = 162f; + [SerializeField] + private Vector2 scroll; + static Dictionary colors = new Dictionary() { + { "5.0.", new Color(0.925f, 0.937f, 0.945f ,1f) }, + { "5.1.", new Color(0.812f, 0.847f, 0.863f, 1f) }, + { "5.2.", new Color(0.690f, 0.745f, 0.773f, 1f) }, + { "5.3.", new Color(0.565f, 0.643f, 0.682f, 1f) }, + { "5.4.", new Color(0.471f, 0.565f, 0.612f, 1f) }, + { "5.5.", new Color(0.376f, 0.490f, 0.545f, 1f) }, + { "5.6.", new Color(0.329f, 0.431f, 0.478f, 1f) }, + { "2017.1.", new Color(0.271f, 0.353f, 0.392f, 1f) }, + { "2017.2.", new Color(0.216f, 0.278f, 0.31f, 1f) }, + { "2017.3.", new Color(0.149f, 0.196f, 0.22f, 1f) } + }; + + static Dictionary textColors = new Dictionary() { + { "5.0.", new Color(0f, 0f, 0f, 1f) }, + { "5.1.", new Color(0f, 0f, 0f, 1f) }, + { "5.2.", new Color(0f, 0f, 0f, 1f) }, + { "5.3.", new Color(0f, 0f, 0f, 1f) }, + { "5.4.", new Color(1f, 1f, 1f, 1f) }, + { "5.5.", new Color(1f, 1f, 1f, 1f) }, + { "5.6.", new Color(1f, 1f, 1f, 1f) }, + { "2017.1.", new Color(1f, 1f, 1f, 1f) }, + { "2017.2.", new Color(1f, 1f, 1f, 1f) }, + { "2017.3.", new Color(1f, 1f, 1f, 1f) } + }; + + [MenuItem("Help/Links/Statistics")] + static void OpenStatistics() { + Application.OpenURL(statsUrl); + } + + [MenuItem("Help/Links/Experimental")] + static void OpenExperimental() { + Application.OpenURL(experimenalUrl); + } + + [MenuItem("Help/Links/Roadmap")] + static void OpenRoadmap() { + Application.OpenURL(roadmapUrl); + } + + [MenuItem("Help/Links/Release Archive")] + static void OpenArchive() { + Application.OpenURL(archiveUrl); + } + + [MenuItem("Help/Links/Patch Archive")] + static void OpenPatchArchive() { + Application.OpenURL(patchRN); + } + + [MenuItem("Help/Links/Beta Archive")] + static void OpenBetaArchive() { + Application.OpenURL(betaArchiveUrl); + } + + [MenuItem("Help/Links/Last Releases")] + static void Init() { + window = GetWindow(wndTitle); + } + + void OnGUI() { + if(fullList != null) { + ListGUI(); + } + else + WaitGUI(); + } + + public void ListGUI() { + style = new GUIStyle(EditorStyles.miniButton); + style.alignment = TextAnchor.MiddleLeft; + //GUILayout.BeginVertical(); + DoToolbar(); + scroll = EditorGUILayout.BeginScrollView(scroll, false, false); + if(currentList == null) + currentList = fullList; + + for(int i = currentList.Count - 1; i >= 0; i--) + DoItemGUI(i, currentList.Keys[i], currentList.Values[i]); + + EditorGUILayout.EndScrollView(); + GUILayout.FlexibleSpace(); + DoDownloadProgressBar(wwwAssistant, "Downloading Assistant"); + DoDownloadProgressBar(wwwHistory, "Downloading History"); + DoDownloadProgressBar(wwwList, "Downloading List"); + DoDownloadProgressBar(wwwMerger, "Downloading Merger"); + //GUILayout.EndVertical(); + } + + private void Update() { + Repaint(); + } + + void DoDownloadProgressBar(WWW www, string text) { + if(www != null && !www.isDone && string.IsNullOrEmpty(www.error)) { + text = string.Format("{0} ({1})", text, EditorUtility.FormatBytes(www.bytesDownloaded)); + EditorGUI.ProgressBar(EditorGUILayout.GetControlRect(), www.progress, string.IsNullOrEmpty(www.error) ? text : www.error); + } + } + + void DoItemGUI(int index, string key, string value) { + var rect = EditorGUILayout.BeginHorizontal((index & 1) == 1 ? "ObjectPickerResultsOdd" : "ObjectPickerResultsEven"); + var color = GetGUIColor(index); + var colorText = GetGUITextColor(index); + var s = new GUIStyle(); + s.normal.textColor = colorText; + + EditorGUI.DrawRect(rect, color); + GUILayout.Label("Unity " + value, s); + GUILayout.FlexibleSpace(); + + var notesURL = GetReleaseNotesURL(index); + if(GUILayout.Button("Open", "minibuttonleft")) { + DownloadList(index); + } + GUI.enabled = !string.IsNullOrEmpty(notesURL); + if(GUILayout.Button("Release Notes", "minibuttonmid")) { + OpenReleaseNotes(index); + } + GUI.enabled = true; + if(GUILayout.Button("Download Assistant", "minibuttonright")) { + DownloadList(index, true); + } + EditorGUILayout.EndHorizontal(); + } + + static Color GetGUIColor(int i) { + foreach(var k in colors.Keys) { + if(currentList.Values[i].Contains(k)) { + return colors[k]; + } + } + return Color.white; + } + + static Color GetGUITextColor(int i) + { + foreach (var k in textColors.Keys) + { + if (currentList.Values[i].Contains(k)) + { + return textColors[k]; + } + } + return Color.black; + } + + void OnEnable() { + tempDir = Application.dataPath + "/../Temp/LastRelease"; + DownloadHistory(); + } + + static void CheckNewVersion() { + int count = EditorPrefs.GetInt(prefsCount, 0); + if(count > 0 && fullList.Count > count) { + EditorApplication.Beep(); + Debug.LogFormat("New version: {0}", fullList.Values[fullList.Count - 1]); + } + EditorPrefs.SetInt(prefsCount, fullList.Count); + } + + static string GetReleaseNotesURL(int num) { + string url = "", version = ""; + if(currentList.Values[num].Contains("a")) + return string.Empty; + if(currentList.Values[num].Contains("p")) { + version = currentList.Values[num].Split(' ')[0]; + url = patchRN + version; + } + if(currentList.Values[num].Contains("f")) { + version = currentList.Values[num].Split('f')[0]; + url = finalRN + version; + } + if(currentList.Values[num].Contains("b")) { + version = currentList.Values[num].Split(' ')[0]; + url = betaRN + version; + } + + return url; + } + + static void OpenReleaseNotes(int num) { + var url = GetReleaseNotesURL(num); + + if(!string.IsNullOrEmpty(url)) + Application.OpenURL(url); + } + + static void FillMenu(WWW history) { + fullList = new SortedList(); + string build; + string[] parts, releases = history.text.Split('\n'); + for(int i = 0; i < releases.Length; i++) { + parts = releases[i].Split(','); + DateTime dt; + if(DateTime.TryParse(string.Format("{0} {1}", parts[3], parts[4]), out dt)) { + build = string.Format("{0} ({1})", parts[6].Trim('\"'), dt.ToString("dd-MM-yyyy")); + fullList.Add(parts[0], build); + } + //Debug.LogWarningFormat("releases[{0}]={1}\nparts={2}", i, releases[i], parts.ToStringRecursive()); + } + if(window == null) { + HelpLastRelease[] w = Resources.FindObjectsOfTypeAll(); + if(w != null && w.Length > 0) + window = w[0]; + } + if(window != null) + window.Repaint(); + } + + static void SearchVersion() { + string path = Path.Combine(tempDir, extractedName); + if(File.Exists(path)) { + string[] lines; + lines = File.ReadAllLines(path, Encoding.Unicode); + FileUtil.DeleteFileOrDirectory(Path.GetDirectoryName(path)); + string version = currentList.Values[selected].Split(' ')[0] + "_"; + for(int i = 0; i < lines.Length; i++) { + if(lines[i].Contains(version)) { + int pos = lines[i].IndexOf(version); + string revision = lines[i].Substring(pos + version.Length, 12); + if(!assistant) { + Application.OpenURL(string.Format(releaseUrl, revision)); + } + else { + DownloadAssistant(revision); + } + break; + } + } + } + } + + static void DownloadAssistant(string revision) { + string version = currentList.Values[selected].Split(' ')[0]; + string ext = Application.platform == RuntimePlatform.WindowsEditor ? "exe" : "dmg"; + string url = string.Format(assistantUrl, revision, version, ext); + wwwAssistant = new WWW(url); + EditorApplication.update += WaitAssistant; + } + + static void DownloadHistory() { + wwwHistory = new WWW(historyUrl); + EditorApplication.update += WaitHistory; + } + + static void DownloadList(int historyNum, bool assist = false) { + selected = historyNum; + assistant = assist; + string listUrl = string.Format("{0}000Admin/{1}", serverUrl, currentList.Keys[historyNum]); + wwwList = new WWW(listUrl); + EditorApplication.update += WaitList; + } + + static void WaitList() { + Wait(wwwList, WaitList, ParseList); + } + + static void WaitHistory() { + Wait(wwwHistory, WaitHistory, FillMenu, CheckNewVersion); + } + + static void WaitAssistant() { + Wait(wwwAssistant, WaitAssistant, SaveAssistant); + } + + static void SaveAssistant(WWW assistant) { + if(!Directory.Exists(tempDir)) { + Directory.CreateDirectory(tempDir); + } + string name = Path.GetFileName(assistant.url); + string path = Path.Combine(tempDir, name); + File.WriteAllBytes(path, assistant.bytes); + if(Application.platform == RuntimePlatform.WindowsEditor) { + Application.OpenURL(path); + } + else { + StartAssistant(path); + } + } + + static void StartAssistant(string path) { + string cmd = "hdiutil"; + string arg = string.Format("mount '{0}'", path); + try { + using(Process assist = new Process()) { + assist.StartInfo.FileName = cmd; + assist.StartInfo.Arguments = arg; + assist.StartInfo.WorkingDirectory = Path.GetDirectoryName(path); + assist.StartInfo.CreateNoWindow = true; + assist.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; + assist.Start(); + } + } + catch(Exception e) { + Debug.LogErrorFormat("{0} {1}\n{2}", cmd, arg, e.Message); + } + } + + static void Wait(WWW www, EditorApplication.CallbackFunction caller, Action action, Action done = null) { + if(www != null && www.isDone) { + EditorApplication.update -= caller; + if(string.IsNullOrEmpty(www.error) && www.bytesDownloaded > 0) { + //Debug.LogFormat("{0} kB: {1}", www.size/1024, www.url); + if(action != null) + action(www); + if(done != null) + done(); + } + else + Debug.LogWarningFormat("{0} {1}", www.url, www.error); + www = null; + } + else { + if(www == null) + EditorApplication.update -= caller; + } + } + + static void ParseList(WWW list) { + string[] files = list.text.Split('\n'); + string[] parts; + for(int i = 0; i < files.Length; i++) { + parts = files[i].Split(','); + if(parts[0].Contains(extractedName)) { + string mergerUrl = string.Format("{0}{1}/{2}", serverUrl, parts[0].Trim('\"').Replace('\\', '/'), compressedName); + DownloadMerger(mergerUrl); + break; + } + } + } + + static void DownloadMerger(string mergerUrl) { + wwwMerger = new WWW(mergerUrl); + EditorApplication.update += WaitMerger; + } + + static void WaitMerger() { + Wait(wwwMerger, WaitMerger, SaveMerger); + } + + static void SaveMerger(WWW merger) { + if(!Directory.Exists(tempDir)) { + Directory.CreateDirectory(tempDir); + } + string path = Path.Combine(tempDir, compressedName); + //Debug.LogFormat("path: {0}", path); + File.WriteAllBytes(path, merger.bytes); + ExtractMerger(path); + } + + static void ExtractMerger(string path) { + string zipPath = string.Format("{0}/Tools/{1}", EditorApplication.applicationContentsPath, zipName); + string arg = string.Format("e -y \"{0}\"", path); + try { + using(Process unzip = new Process()) { + unzip.StartInfo.FileName = zipPath; + unzip.StartInfo.Arguments = arg; + unzip.StartInfo.WorkingDirectory = Path.GetDirectoryName(path); + unzip.StartInfo.CreateNoWindow = true; + unzip.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; + unzip.Start(); + unzip.WaitForExit(); + SearchVersion(); + } + } + catch(Exception e) { + Debug.LogErrorFormat("{0} {1}\n{2}", zipPath, arg, e.Message); + } + } + + void DoToolbar() { + EditorGUILayout.BeginHorizontal("toolbar"); + GUILayout.FlexibleSpace(); + SearchGUI(); + EditorGUILayout.EndHorizontal(); + } + + void SearchGUI() { + string s = string.Empty; + + try { + var methods = typeof(EditorGUILayout).GetMethods(BindingFlags.NonPublic | BindingFlags.Static); + + for(var i = 0; i < methods.Length; i++) + if(methods[i].Name == "ToolbarSearchField" && methods[i].GetParameters().Length <= 2) { + s = (string)methods[i].Invoke(null, new object[] { search, null }); + break; + } + } + catch(Exception e) { + Debug.LogException(e); + s = EditorGUILayout.TextField(search, GUILayout.MaxWidth(minWidth + 56f)); + } + + if(s != search) { + search = s; + if(!string.IsNullOrEmpty(search)) { + sortedList = new SortedList(); + for(int i = fullList.Count - 1; i >= 0; i--) { + if(fullList.Values[i].Contains(search)) { + sortedList.Add(fullList.Keys[i], fullList.Values[i]); + } + } + currentList = sortedList; + } + else + currentList = fullList; + } + } + + void WaitGUI() { + GUILayout.BeginHorizontal(); + GUILayout.FlexibleSpace(); + GUILayout.Label("Wait..."); + GUILayout.FlexibleSpace(); + GUILayout.EndHorizontal(); + } +} \ No newline at end of file From 26fabc024525039e21d7b37e69aec287f77e6d31 Mon Sep 17 00:00:00 2001 From: Carlos Cabral Date: Tue, 1 Aug 2017 14:33:17 -0300 Subject: [PATCH 081/231] Use Color32 instead of Color Color 32 it's much faster and uses 4X less memory. --- Assets/Scripts/Editor/HelpLastRelease.cs | 54 ++++++++++++------------ 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/Assets/Scripts/Editor/HelpLastRelease.cs b/Assets/Scripts/Editor/HelpLastRelease.cs index 95f149d..942b042 100644 --- a/Assets/Scripts/Editor/HelpLastRelease.cs +++ b/Assets/Scripts/Editor/HelpLastRelease.cs @@ -1,5 +1,5 @@ /* - * Version: 2.3 + * Version: 2.4 * Fork from the original script: https://pastebin.com/LzEHNB6U * Purpose: Download new versions of Unity (alpha, beta, * patches and releases) straight from the Editor. @@ -54,30 +54,30 @@ public class HelpLastRelease : EditorWindow { const float minWidth = 162f; [SerializeField] private Vector2 scroll; - static Dictionary colors = new Dictionary() { - { "5.0.", new Color(0.925f, 0.937f, 0.945f ,1f) }, - { "5.1.", new Color(0.812f, 0.847f, 0.863f, 1f) }, - { "5.2.", new Color(0.690f, 0.745f, 0.773f, 1f) }, - { "5.3.", new Color(0.565f, 0.643f, 0.682f, 1f) }, - { "5.4.", new Color(0.471f, 0.565f, 0.612f, 1f) }, - { "5.5.", new Color(0.376f, 0.490f, 0.545f, 1f) }, - { "5.6.", new Color(0.329f, 0.431f, 0.478f, 1f) }, - { "2017.1.", new Color(0.271f, 0.353f, 0.392f, 1f) }, - { "2017.2.", new Color(0.216f, 0.278f, 0.31f, 1f) }, - { "2017.3.", new Color(0.149f, 0.196f, 0.22f, 1f) } + static Dictionary colors = new Dictionary() { + { "5.0.", new Color32(236, 239, 241 ,255) }, + { "5.1.", new Color32(207, 216, 220, 255) }, + { "5.2.", new Color32(176, 190, 197, 255) }, + { "5.3.", new Color32(144, 164, 174, 255) }, + { "5.4.", new Color32(120, 144, 156, 255) }, + { "5.5.", new Color32(96, 125, 139, 255) }, + { "5.6.", new Color32(84, 110, 122, 255) }, + { "2017.1.", new Color32(69, 90, 100, 255) }, + { "2017.2.", new Color32(55, 71, 79, 255) }, + { "2017.3.", new Color32(38, 50, 56, 255) } }; - static Dictionary textColors = new Dictionary() { - { "5.0.", new Color(0f, 0f, 0f, 1f) }, - { "5.1.", new Color(0f, 0f, 0f, 1f) }, - { "5.2.", new Color(0f, 0f, 0f, 1f) }, - { "5.3.", new Color(0f, 0f, 0f, 1f) }, - { "5.4.", new Color(1f, 1f, 1f, 1f) }, - { "5.5.", new Color(1f, 1f, 1f, 1f) }, - { "5.6.", new Color(1f, 1f, 1f, 1f) }, - { "2017.1.", new Color(1f, 1f, 1f, 1f) }, - { "2017.2.", new Color(1f, 1f, 1f, 1f) }, - { "2017.3.", new Color(1f, 1f, 1f, 1f) } + static Dictionary textColors = new Dictionary() { + { "5.0.", new Color32(0, 0, 0, 255) }, + { "5.1.", new Color32(0, 0, 0, 255) }, + { "5.2.", new Color32(0, 0, 0, 255) }, + { "5.3.", new Color32(0, 0, 0, 255) }, + { "5.4.", new Color32(255, 255, 255, 255) }, + { "5.5.", new Color32(255, 255, 255, 255) }, + { "5.6.", new Color32(255, 255, 255, 255) }, + { "2017.1.", new Color32(255, 255, 255, 255) }, + { "2017.2.", new Color32(255, 255, 255, 255) }, + { "2017.3.", new Color32(255, 255, 255, 255) } }; [MenuItem("Help/Links/Statistics")] @@ -181,16 +181,16 @@ void DoItemGUI(int index, string key, string value) { EditorGUILayout.EndHorizontal(); } - static Color GetGUIColor(int i) { + static Color32 GetGUIColor(int i) { foreach(var k in colors.Keys) { if(currentList.Values[i].Contains(k)) { return colors[k]; } } - return Color.white; + return new Color32(255,255,255,255); } - static Color GetGUITextColor(int i) + static Color32 GetGUITextColor(int i) { foreach (var k in textColors.Keys) { @@ -199,7 +199,7 @@ static Color GetGUITextColor(int i) return textColors[k]; } } - return Color.black; + return new Color32(0, 0, 0, 255); } void OnEnable() { From 8478af4ecc0ab9b86db65dfe8cc1fb0c3aaa6016 Mon Sep 17 00:00:00 2001 From: lootheo Date: Wed, 2 Aug 2017 12:17:18 -0500 Subject: [PATCH 082/231] Added the acceleration mode in Follow2D #9 --- Assets/Scripts/2D/Follow2D.cs | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/Assets/Scripts/2D/Follow2D.cs b/Assets/Scripts/2D/Follow2D.cs index e89317e..cdbc379 100644 --- a/Assets/Scripts/2D/Follow2D.cs +++ b/Assets/Scripts/2D/Follow2D.cs @@ -7,7 +7,7 @@ /// Follows a GameObject in a Smooth way and with various settings /// Author: Manuel Otheo (@Lootheo) with guidance from Hasan Bayat (EmpireWorld) /// -/// +/// https://www.reddit.com/r/Unity3D/comments/6iskah/movetowards_vs_lerp_vs_slerp_vs_smoothdamp/ /// How to use: Attach it to a GameObject and then assign the target to follow and the variables like offset and speed /// If it's not moving check the speed /// @@ -33,17 +33,18 @@ public enum FollowType { public bool bounds; public Vector2 lowerBounds; public Vector2 higherBounds; - - #endregion - - #region Variables - + public Vector2 acceleration; + #endregion + + #region Variables + protected Vector2 velocity; protected Vector2 step; - - #endregion - - #region MonoBehaviour Messages + private Vector2 localSpeed; + + #endregion + + #region MonoBehaviour Messages protected virtual void FixedUpdate() { @@ -68,7 +69,7 @@ protected virtual void FixedUpdate() SmoothDamp(); break; case FollowType.Acceleration: - + Acceleration(); break; } @@ -111,6 +112,17 @@ protected virtual void SmoothDamp() transform.position = new Vector3(position.x, position.y, transform.position.z); } + protected virtual void Acceleration() + { + if (Vector2.Distance(transform.position, (Vector2)target.position + offset) == 0) + localSpeed = Vector2.zero; + else + { + localSpeed = localSpeed + acceleration * Time.deltaTime; + step = localSpeed * Time.deltaTime; + transform.position = new Vector2(Vector2.MoveTowards(transform.position, (Vector2)target.position + offset, step.x).x, Vector2.MoveTowards(transform.position, (Vector2)target.position + offset, step.x).y); + } + } protected virtual void CheckForBounds() { From 34119349ee73f81a6d2a4f5e85c107d93eac4f29 Mon Sep 17 00:00:00 2001 From: lootheo Date: Wed, 2 Aug 2017 12:35:56 -0500 Subject: [PATCH 083/231] Added the rigidbody2d follow from issue #13 --- Assets/Scripts/2D/Follow2D.cs | 6 +- Assets/Scripts/2D/Follow2DRigidbody.cs | 138 +++++++++++++++++++++++++ 2 files changed, 141 insertions(+), 3 deletions(-) create mode 100644 Assets/Scripts/2D/Follow2DRigidbody.cs diff --git a/Assets/Scripts/2D/Follow2D.cs b/Assets/Scripts/2D/Follow2D.cs index cdbc379..ae79324 100644 --- a/Assets/Scripts/2D/Follow2D.cs +++ b/Assets/Scripts/2D/Follow2D.cs @@ -11,7 +11,7 @@ /// How to use: Attach it to a GameObject and then assign the target to follow and the variables like offset and speed /// If it's not moving check the speed /// -/// TODO: Add Acceleration Follow +/// TODO: Make more efficient usage of the vector3 to vector2; /// public class Follow2D : MonoBehaviour { @@ -29,11 +29,11 @@ public enum FollowType { public FollowType followType = FollowType.MoveTowards; public Vector2 speed; public Vector2 time; + public Vector2 acceleration; public Vector2 offset; public bool bounds; public Vector2 lowerBounds; public Vector2 higherBounds; - public Vector2 acceleration; #endregion #region Variables @@ -46,7 +46,7 @@ public enum FollowType { #region MonoBehaviour Messages - protected virtual void FixedUpdate() + protected virtual void Update() { // Exit if the target object not specified diff --git a/Assets/Scripts/2D/Follow2DRigidbody.cs b/Assets/Scripts/2D/Follow2DRigidbody.cs new file mode 100644 index 0000000..db423ad --- /dev/null +++ b/Assets/Scripts/2D/Follow2DRigidbody.cs @@ -0,0 +1,138 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + + +/// +/// Follows a GameObject in a Smooth way and with various settings requiring the rigidbody +/// Author: Manuel Otheo (@Lootheo) with guidance from Hasan Bayat (EmpireWorld) +/// +/// https://www.reddit.com/r/Unity3D/comments/6iskah/movetowards_vs_lerp_vs_slerp_vs_smoothdamp/ +/// How to use: Attach it to a GameObject and then assign the target to follow and the variables like offset and speed +/// If it's not moving check the speed +/// +/// +[RequireComponent(typeof(Rigidbody2D))] +public class Follow2DRigidbody : MonoBehaviour { + + public enum FollowType { + MoveTowards, + Lerp, + Slerp, + SmoothDamp, + Acceleration + } + + #region Fields + + public Transform target; + public FollowType followType = FollowType.MoveTowards; + public Vector2 speed; + public Vector2 time; + public Vector2 offset; + public bool bounds; + public Vector2 lowerBounds; + public Vector2 higherBounds; + public Vector2 acceleration; + #endregion + + #region Variables + + protected Vector2 velocity; + protected Vector2 step; + private Vector2 localSpeed; + Rigidbody2D rb; + #endregion + + #region MonoBehaviour Messages + protected virtual void Start() + { + rb = GetComponent(); + } + + protected virtual void FixedUpdate() + { + + // Exit if the target object not specified + if (target == null) { + return; + } + + switch (followType) + { + case FollowType.MoveTowards: + MoveTowards(); + break; + case FollowType.Lerp: + Lerp(); + break; + case FollowType.Slerp: + Slerp(); + break; + case FollowType.SmoothDamp: + SmoothDamp(); + break; + case FollowType.Acceleration: + Acceleration(); + break; + } + + if (bounds) + { + CheckForBounds(); + } + } + + #endregion + + #region Methods + + protected virtual void MoveTowards() + { + step = speed * Time.deltaTime; + rb.MovePosition(new Vector2(Vector2.MoveTowards(transform.position, (Vector2)target.position+offset, step.x).x, Vector2.MoveTowards(transform.position, (Vector2)target.position+offset, step.x).y)); + } + + protected virtual void Lerp() + { + float posX = Mathf.Lerp(transform.position.x, target.position.x+offset.x, time.x* Time.fixedDeltaTime); + float posY = Mathf.Lerp(transform.position.y, target.position.y + offset.y, time.y * Time.fixedDeltaTime); + rb.MovePosition(new Vector3(posX, posY, transform.position.z)); + } + + protected virtual void Slerp() + { + float posX = Vector3.Slerp(transform.position, (Vector3)((Vector2)target.position + offset), time.x*Time.fixedDeltaTime).x; + float posY = Vector3.Slerp(transform.position, (Vector3)((Vector2)target.position + offset), time.y * Time.fixedDeltaTime).y; + rb.MovePosition(new Vector3(posX, posY, transform.position.z)); + } + + protected virtual void SmoothDamp() + { + Vector2 position; + + position.x = Mathf.SmoothDamp(transform.position.x, target.position.x+offset.x, ref velocity.x, time.x); + position.y = Mathf.SmoothDamp(transform.position.y, target.position.y+offset.y, ref velocity.y, time.y); + + rb.MovePosition(new Vector3(position.x, position.y, transform.position.z)); + } + protected virtual void Acceleration() + { + if (Vector2.Distance(transform.position, (Vector2)target.position + offset) == 0) + localSpeed = Vector2.zero; + else + { + localSpeed = localSpeed + acceleration * Time.deltaTime; + step = localSpeed * Time.deltaTime; + rb.MovePosition(new Vector2(Vector2.MoveTowards(transform.position, (Vector2)target.position + offset, step.x).x, Vector2.MoveTowards(transform.position, (Vector2)target.position + offset, step.x).y)); + } + } + + protected virtual void CheckForBounds() + { + rb.MovePosition(new Vector3(Mathf.Clamp(transform.position.x, lowerBounds.x, higherBounds.x), Mathf.Clamp(transform.position.y, lowerBounds.y, higherBounds.y), transform.position.z)); + } + + #endregion + +} From 88c6c267203602e964c3f46d5f0a1a6d2d1caeb8 Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Thu, 3 Aug 2017 09:15:36 +0430 Subject: [PATCH 084/231] Update Trello Link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f3ba660..6183d23 100644 --- a/README.md +++ b/README.md @@ -74,7 +74,7 @@ Our communities: - [See](https://unitylibrary.slack.com/) | [Join](https://join.slack.com/t/unitylibrary/shared_invite/MjE1MDA2NzExNDEwLTE1MDA0OTE5NzktOGJmYTI0ZDlkNA) our Slack Channel - [See](https://gitter.im/UnityCommunity/Lobby) | [Join](https://gitter.im/UnityCommunity/Lobby?utm_source=share-link&utm_medium=link&utm_campaign=share-link) our Gitter Channel - [See](https://discordapp.com/channels/337579253866692608/337579253866692608) | [Join](https://discord.gg/cXT97hU) our Discord Channel -- [See](https://trello.com/b/1sOcvQzd/unity-library) | [Join](https://trello.com/invite/b/SIfiVLYi/2c640a78d533382340567e625708c9e0/unity-library) our Trello Development Board +- [See](https://trello.com/b/1sOcvQzd) | [Join](https://trello.com/invite/unitycommunity/239a9f3cdaf3c54cf7efc2540c304279) our Trello Development Board ## Improvements/Ideas/Feedback From 29143ebb96a42ac534d86833745545ad3c5ad0fb Mon Sep 17 00:00:00 2001 From: lootheo Date: Thu, 3 Aug 2017 00:14:51 -0500 Subject: [PATCH 085/231] Added the namespace UnityLibrary to the scripts. #21 --- Assets/Scripts/2D/Drawing/DrawLine2D.cs | 200 +++-- Assets/Scripts/2D/Follow2D.cs | 215 ++--- Assets/Scripts/2D/Follow2DRigidbody.cs | 223 ++--- Assets/Scripts/Camera/CameraShake.cs | 78 +- Assets/Scripts/Camera/SmoothMouseLook.cs | 96 +-- Assets/Scripts/Camera/WowCamera.cs | 292 +++---- Assets/Scripts/Camera/ZoomWithMouse.cs | 18 +- Assets/Scripts/Drawing/DrawLine.cs | 178 ++-- Assets/Scripts/Editor/EditorShortCutKeys.cs | 16 +- .../Editor/Gizmos/DrawCameraFrustumGizmos.cs | 16 +- .../Editor/GridGeneratorEditor.cs | 80 +- .../Editor/GridGenerator/GridGenerator.cs | 32 +- Assets/Scripts/Editor/HelpLastRelease.cs | 792 ++++++++++-------- Assets/Scripts/Editor/SetPivot.cs | 231 ++--- .../Scripts/Editor/SpriteBackgroundRemover.cs | 210 ++--- .../UI/CanvasScalerUtil/CanvasScalerUtil.cs | 39 +- .../Editor/CanvasScalerUtilEditor.cs | 57 +- Assets/Scripts/Helpers/DrawGLLine.cs | 92 +- Assets/Scripts/Helpers/DrawRendererBounds.cs | 82 +- .../Scripts/Helpers/Drawing/DrawCrossHair.cs | 68 +- Assets/Scripts/Helpers/FPSCounter.cs | 62 +- .../Helpers/FileSystem/OpenExternalFile.cs | 36 +- .../Scripts/Helpers/Screenshot/GrabDesktop.cs | 2 + Assets/Scripts/Helpers/Version/GetVersion.cs | 16 +- Assets/Scripts/Misc/Messaging/Messenger.cs | 443 +++++----- .../Misc/Messaging/MessengerUnitTest.cs | 273 +++--- Assets/Scripts/Misc/MeteorRing.cs | 36 +- Assets/Scripts/Misc/TexturePixels2Quads.cs | 28 +- .../Serialization/Color32Serializable.cs | 165 ++-- .../Serialization/ColorSerializable.cs | 185 ++-- .../Scripts/Serialization/MeshSerializable.cs | 183 ++-- .../Serialization/Vector2Serializable.cs | 293 +++---- .../Serialization/Vector3Serializable.cs | 325 +++---- .../Serialization/Vector4Serializable.cs | 361 ++++---- Assets/Scripts/Threading/ThreadPoolTest.cs | 109 +-- 35 files changed, 2894 insertions(+), 2638 deletions(-) diff --git a/Assets/Scripts/2D/Drawing/DrawLine2D.cs b/Assets/Scripts/2D/Drawing/DrawLine2D.cs index 45f5339..b5fb834 100644 --- a/Assets/Scripts/2D/Drawing/DrawLine2D.cs +++ b/Assets/Scripts/2D/Drawing/DrawLine2D.cs @@ -1,118 +1,112 @@ using System.Collections; using System.Collections.Generic; using UnityEngine; - -public class DrawLine2D : MonoBehaviour +namespace UnityLibrary { + public class DrawLine2D : MonoBehaviour + { - [SerializeField] - protected LineRenderer m_LineRenderer; - [SerializeField] - protected bool m_AddCollider = false; - [SerializeField] - protected EdgeCollider2D m_EdgeCollider2D; - protected List m_Points; + [SerializeField] + protected LineRenderer m_LineRenderer; + [SerializeField] + protected bool m_AddCollider = false; + [SerializeField] + protected EdgeCollider2D m_EdgeCollider2D; + protected List m_Points; - public virtual LineRenderer lineRenderer - { - get - { - return m_LineRenderer; - } - } + public virtual LineRenderer lineRenderer { + get { + return m_LineRenderer; + } + } - public virtual bool addCollider - { - get - { - return m_AddCollider; - } - } + public virtual bool addCollider { + get { + return m_AddCollider; + } + } - public virtual EdgeCollider2D edgeCollider2D - { - get - { - return m_EdgeCollider2D; - } - } + public virtual EdgeCollider2D edgeCollider2D { + get { + return m_EdgeCollider2D; + } + } - public virtual List points - { - get - { - return m_Points; - } - } + public virtual List points { + get { + return m_Points; + } + } - protected virtual void Awake () - { - if ( m_LineRenderer == null ) - { - Debug.LogWarning ( "DrawLine: Line Renderer not assigned, Adding and Using default Line Renderer." ); - CreateDefaultLineRenderer (); - } - if ( m_EdgeCollider2D == null && m_AddCollider ) - { - Debug.LogWarning ( "DrawLine: Edge Collider 2D not assigned, Adding and Using default Edge Collider 2D." ); - CreateDefaultEdgeCollider2D (); - } - m_Points = new List (); - } + protected virtual void Awake() + { + if (m_LineRenderer == null) + { + Debug.LogWarning("DrawLine: Line Renderer not assigned, Adding and Using default Line Renderer."); + CreateDefaultLineRenderer(); + } + if (m_EdgeCollider2D == null && m_AddCollider) + { + Debug.LogWarning("DrawLine: Edge Collider 2D not assigned, Adding and Using default Edge Collider 2D."); + CreateDefaultEdgeCollider2D(); + } + m_Points = new List(); + } - protected virtual void Update () - { - if ( Input.GetMouseButtonDown ( 0 ) ) - { - Reset (); - } - if ( Input.GetMouseButton ( 0 ) ) - { - Vector2 mousePosition = Camera.main.ScreenToWorldPoint ( Input.mousePosition ); - if ( !m_Points.Contains ( mousePosition ) ) - { - m_Points.Add ( mousePosition ); - m_LineRenderer.positionCount = m_Points.Count; - m_LineRenderer.SetPosition ( m_LineRenderer.positionCount - 1, mousePosition ); - if ( m_EdgeCollider2D != null && m_AddCollider && m_Points.Count > 1 ) - { - m_EdgeCollider2D.points = m_Points.ToArray (); - } - } - } - } + protected virtual void Update() + { + if (Input.GetMouseButtonDown(0)) + { + Reset(); + } + if (Input.GetMouseButton(0)) + { + Vector2 mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition); + if (!m_Points.Contains(mousePosition)) + { + m_Points.Add(mousePosition); + m_LineRenderer.positionCount = m_Points.Count; + m_LineRenderer.SetPosition(m_LineRenderer.positionCount - 1, mousePosition); + if (m_EdgeCollider2D != null && m_AddCollider && m_Points.Count > 1) + { + m_EdgeCollider2D.points = m_Points.ToArray(); + } + } + } + } - protected virtual void Reset () - { - if ( m_LineRenderer != null ) - { - m_LineRenderer.positionCount = 0; - } - if ( m_Points != null ) - { - m_Points.Clear (); - } - if ( m_EdgeCollider2D != null && m_AddCollider ) - { - m_EdgeCollider2D.Reset (); - } - } + protected virtual void Reset() + { + if (m_LineRenderer != null) + { + m_LineRenderer.positionCount = 0; + } + if (m_Points != null) + { + m_Points.Clear(); + } + if (m_EdgeCollider2D != null && m_AddCollider) + { + m_EdgeCollider2D.Reset(); + } + } - protected virtual void CreateDefaultLineRenderer () - { - m_LineRenderer = gameObject.AddComponent (); - m_LineRenderer.positionCount = 0; - m_LineRenderer.material = new Material ( Shader.Find ( "Particles/Additive" ) ); - m_LineRenderer.startColor = Color.white; - m_LineRenderer.endColor = Color.white; - m_LineRenderer.startWidth = 0.2f; - m_LineRenderer.endWidth = 0.2f; - m_LineRenderer.useWorldSpace = true; - } + protected virtual void CreateDefaultLineRenderer() + { + m_LineRenderer = gameObject.AddComponent(); + m_LineRenderer.positionCount = 0; + m_LineRenderer.material = new Material(Shader.Find("Particles/Additive")); + m_LineRenderer.startColor = Color.white; + m_LineRenderer.endColor = Color.white; + m_LineRenderer.startWidth = 0.2f; + m_LineRenderer.endWidth = 0.2f; + m_LineRenderer.useWorldSpace = true; + } - protected virtual void CreateDefaultEdgeCollider2D () - { - m_EdgeCollider2D = gameObject.AddComponent (); - } + protected virtual void CreateDefaultEdgeCollider2D() + { + m_EdgeCollider2D = gameObject.AddComponent(); + } -} + } +} \ No newline at end of file diff --git a/Assets/Scripts/2D/Follow2D.cs b/Assets/Scripts/2D/Follow2D.cs index ae79324..7cc16dd 100644 --- a/Assets/Scripts/2D/Follow2D.cs +++ b/Assets/Scripts/2D/Follow2D.cs @@ -13,122 +13,129 @@ /// /// TODO: Make more efficient usage of the vector3 to vector2; /// -public class Follow2D : MonoBehaviour { - - public enum FollowType { - MoveTowards, - Lerp, - Slerp, - SmoothDamp, - Acceleration - } - - #region Fields - - public Transform target; - public FollowType followType = FollowType.MoveTowards; - public Vector2 speed; - public Vector2 time; - public Vector2 acceleration; - public Vector2 offset; - public bool bounds; - public Vector2 lowerBounds; - public Vector2 higherBounds; - #endregion - - #region Variables - - protected Vector2 velocity; - protected Vector2 step; - private Vector2 localSpeed; - - #endregion - - #region MonoBehaviour Messages - - protected virtual void Update() +/// +namespace UnityLibrary +{ + public class Follow2D : MonoBehaviour { - - // Exit if the target object not specified - if (target == null) { - return; - } - - switch (followType) + + public enum FollowType { - case FollowType.MoveTowards: - MoveTowards(); - break; - case FollowType.Lerp: - Lerp(); - break; - case FollowType.Slerp: - Slerp(); - break; - case FollowType.SmoothDamp: - SmoothDamp(); - break; - case FollowType.Acceleration: - Acceleration(); - break; + MoveTowards, + Lerp, + Slerp, + SmoothDamp, + Acceleration } - if (bounds) + #region Fields + + public Transform target; + public FollowType followType = FollowType.MoveTowards; + public Vector2 speed; + public Vector2 time; + public Vector2 acceleration; + public Vector2 offset; + public bool bounds; + public Vector2 lowerBounds; + public Vector2 higherBounds; + #endregion + + #region Variables + + protected Vector2 velocity; + protected Vector2 step; + private Vector2 localSpeed; + + #endregion + + #region MonoBehaviour Messages + + protected virtual void Update() { - CheckForBounds(); - } - } - - #endregion - - #region Methods - protected virtual void MoveTowards() - { - step = speed * Time.deltaTime; - transform.position = new Vector2(Vector2.MoveTowards(transform.position, (Vector2)target.position+offset, step.x).x, Vector2.MoveTowards(transform.position, (Vector2)target.position+offset, step.x).y); - } - - protected virtual void Lerp() - { - float posX = Mathf.Lerp(transform.position.x, target.position.x+offset.x, time.x* Time.fixedDeltaTime); - float posY = Mathf.Lerp(transform.position.y, target.position.y + offset.y, time.y * Time.fixedDeltaTime); - transform.position = new Vector3(posX, posY, transform.position.z); - } - - protected virtual void Slerp() - { - float posX = Vector3.Slerp(transform.position, (Vector3)((Vector2)target.position + offset), time.x*Time.fixedDeltaTime).x; - float posY = Vector3.Slerp(transform.position, (Vector3)((Vector2)target.position + offset), time.y * Time.fixedDeltaTime).y; - transform.position = new Vector3(posX, posY, transform.position.z); - } + // Exit if the target object not specified + if (target == null) + { + return; + } - protected virtual void SmoothDamp() - { - Vector2 position; + switch (followType) + { + case FollowType.MoveTowards: + MoveTowards(); + break; + case FollowType.Lerp: + Lerp(); + break; + case FollowType.Slerp: + Slerp(); + break; + case FollowType.SmoothDamp: + SmoothDamp(); + break; + case FollowType.Acceleration: + Acceleration(); + break; + } - position.x = Mathf.SmoothDamp(transform.position.x, target.position.x+offset.x, ref velocity.x, time.x); - position.y = Mathf.SmoothDamp(transform.position.y, target.position.y+offset.y, ref velocity.y, time.y); + if (bounds) + { + CheckForBounds(); + } + } - transform.position = new Vector3(position.x, position.y, transform.position.z); - } - protected virtual void Acceleration() - { - if (Vector2.Distance(transform.position, (Vector2)target.position + offset) == 0) - localSpeed = Vector2.zero; - else + #endregion + + #region Methods + + protected virtual void MoveTowards() { - localSpeed = localSpeed + acceleration * Time.deltaTime; - step = localSpeed * Time.deltaTime; + step = speed * Time.deltaTime; transform.position = new Vector2(Vector2.MoveTowards(transform.position, (Vector2)target.position + offset, step.x).x, Vector2.MoveTowards(transform.position, (Vector2)target.position + offset, step.x).y); } - } - protected virtual void CheckForBounds() - { - transform.position = new Vector3(Mathf.Clamp(transform.position.x, lowerBounds.x, higherBounds.x), Mathf.Clamp(transform.position.y, lowerBounds.y, higherBounds.y), transform.position.z); + protected virtual void Lerp() + { + float posX = Mathf.Lerp(transform.position.x, target.position.x + offset.x, time.x * Time.fixedDeltaTime); + float posY = Mathf.Lerp(transform.position.y, target.position.y + offset.y, time.y * Time.fixedDeltaTime); + transform.position = new Vector3(posX, posY, transform.position.z); + } + + protected virtual void Slerp() + { + float posX = Vector3.Slerp(transform.position, (Vector3)((Vector2)target.position + offset), time.x * Time.fixedDeltaTime).x; + float posY = Vector3.Slerp(transform.position, (Vector3)((Vector2)target.position + offset), time.y * Time.fixedDeltaTime).y; + transform.position = new Vector3(posX, posY, transform.position.z); + } + + protected virtual void SmoothDamp() + { + Vector2 position; + + position.x = Mathf.SmoothDamp(transform.position.x, target.position.x + offset.x, ref velocity.x, time.x); + position.y = Mathf.SmoothDamp(transform.position.y, target.position.y + offset.y, ref velocity.y, time.y); + + transform.position = new Vector3(position.x, position.y, transform.position.z); + } + protected virtual void Acceleration() + { + if (Vector2.Distance(transform.position, (Vector2)target.position + offset) == 0) + localSpeed = Vector2.zero; + else + { + localSpeed = localSpeed + acceleration * Time.deltaTime; + step = localSpeed * Time.deltaTime; + transform.position = new Vector2(Vector2.MoveTowards(transform.position, (Vector2)target.position + offset, step.x).x, Vector2.MoveTowards(transform.position, (Vector2)target.position + offset, step.x).y); + } + } + + protected virtual void CheckForBounds() + { + transform.position = new Vector3(Mathf.Clamp(transform.position.x, lowerBounds.x, higherBounds.x), Mathf.Clamp(transform.position.y, lowerBounds.y, higherBounds.y), transform.position.z); + } + + #endregion + } - - #endregion - } diff --git a/Assets/Scripts/2D/Follow2DRigidbody.cs b/Assets/Scripts/2D/Follow2DRigidbody.cs index db423ad..754da05 100644 --- a/Assets/Scripts/2D/Follow2DRigidbody.cs +++ b/Assets/Scripts/2D/Follow2DRigidbody.cs @@ -12,127 +12,130 @@ /// If it's not moving check the speed /// /// -[RequireComponent(typeof(Rigidbody2D))] -public class Follow2DRigidbody : MonoBehaviour { - - public enum FollowType { - MoveTowards, - Lerp, - Slerp, - SmoothDamp, - Acceleration - } - - #region Fields - - public Transform target; - public FollowType followType = FollowType.MoveTowards; - public Vector2 speed; - public Vector2 time; - public Vector2 offset; - public bool bounds; - public Vector2 lowerBounds; - public Vector2 higherBounds; - public Vector2 acceleration; - #endregion - - #region Variables - - protected Vector2 velocity; - protected Vector2 step; - private Vector2 localSpeed; - Rigidbody2D rb; - #endregion - - #region MonoBehaviour Messages - protected virtual void Start() - { - rb = GetComponent(); - } +namespace UnityLibrary +{ + [RequireComponent(typeof(Rigidbody2D))] + public class Follow2DRigidbody : MonoBehaviour { + + public enum FollowType { + MoveTowards, + Lerp, + Slerp, + SmoothDamp, + Acceleration + } + + #region Fields + + public Transform target; + public FollowType followType = FollowType.MoveTowards; + public Vector2 speed; + public Vector2 time; + public Vector2 offset; + public bool bounds; + public Vector2 lowerBounds; + public Vector2 higherBounds; + public Vector2 acceleration; + #endregion - protected virtual void FixedUpdate() - { - - // Exit if the target object not specified - if (target == null) { - return; - } - - switch (followType) + #region Variables + + protected Vector2 velocity; + protected Vector2 step; + private Vector2 localSpeed; + Rigidbody2D rb; + #endregion + + #region MonoBehaviour Messages + protected virtual void Start() { - case FollowType.MoveTowards: - MoveTowards(); - break; - case FollowType.Lerp: - Lerp(); - break; - case FollowType.Slerp: - Slerp(); - break; - case FollowType.SmoothDamp: - SmoothDamp(); - break; - case FollowType.Acceleration: - Acceleration(); - break; + rb = GetComponent(); } - if (bounds) + protected virtual void FixedUpdate() { - CheckForBounds(); + + // Exit if the target object not specified + if (target == null) { + return; + } + + switch (followType) + { + case FollowType.MoveTowards: + MoveTowards(); + break; + case FollowType.Lerp: + Lerp(); + break; + case FollowType.Slerp: + Slerp(); + break; + case FollowType.SmoothDamp: + SmoothDamp(); + break; + case FollowType.Acceleration: + Acceleration(); + break; + } + + if (bounds) + { + CheckForBounds(); + } } - } - - #endregion - - #region Methods - - protected virtual void MoveTowards() - { - step = speed * Time.deltaTime; - rb.MovePosition(new Vector2(Vector2.MoveTowards(transform.position, (Vector2)target.position+offset, step.x).x, Vector2.MoveTowards(transform.position, (Vector2)target.position+offset, step.x).y)); - } - - protected virtual void Lerp() - { - float posX = Mathf.Lerp(transform.position.x, target.position.x+offset.x, time.x* Time.fixedDeltaTime); - float posY = Mathf.Lerp(transform.position.y, target.position.y + offset.y, time.y * Time.fixedDeltaTime); - rb.MovePosition(new Vector3(posX, posY, transform.position.z)); - } - - protected virtual void Slerp() - { - float posX = Vector3.Slerp(transform.position, (Vector3)((Vector2)target.position + offset), time.x*Time.fixedDeltaTime).x; - float posY = Vector3.Slerp(transform.position, (Vector3)((Vector2)target.position + offset), time.y * Time.fixedDeltaTime).y; - rb.MovePosition(new Vector3(posX, posY, transform.position.z)); - } - protected virtual void SmoothDamp() - { - Vector2 position; + #endregion - position.x = Mathf.SmoothDamp(transform.position.x, target.position.x+offset.x, ref velocity.x, time.x); - position.y = Mathf.SmoothDamp(transform.position.y, target.position.y+offset.y, ref velocity.y, time.y); + #region Methods - rb.MovePosition(new Vector3(position.x, position.y, transform.position.z)); - } - protected virtual void Acceleration() - { - if (Vector2.Distance(transform.position, (Vector2)target.position + offset) == 0) - localSpeed = Vector2.zero; - else + protected virtual void MoveTowards() { - localSpeed = localSpeed + acceleration * Time.deltaTime; - step = localSpeed * Time.deltaTime; + step = speed * Time.deltaTime; rb.MovePosition(new Vector2(Vector2.MoveTowards(transform.position, (Vector2)target.position + offset, step.x).x, Vector2.MoveTowards(transform.position, (Vector2)target.position + offset, step.x).y)); } - } - protected virtual void CheckForBounds() - { - rb.MovePosition(new Vector3(Mathf.Clamp(transform.position.x, lowerBounds.x, higherBounds.x), Mathf.Clamp(transform.position.y, lowerBounds.y, higherBounds.y), transform.position.z)); + protected virtual void Lerp() + { + float posX = Mathf.Lerp(transform.position.x, target.position.x + offset.x, time.x * Time.fixedDeltaTime); + float posY = Mathf.Lerp(transform.position.y, target.position.y + offset.y, time.y * Time.fixedDeltaTime); + rb.MovePosition(new Vector3(posX, posY, transform.position.z)); + } + + protected virtual void Slerp() + { + float posX = Vector3.Slerp(transform.position, (Vector3)((Vector2)target.position + offset), time.x * Time.fixedDeltaTime).x; + float posY = Vector3.Slerp(transform.position, (Vector3)((Vector2)target.position + offset), time.y * Time.fixedDeltaTime).y; + rb.MovePosition(new Vector3(posX, posY, transform.position.z)); + } + + protected virtual void SmoothDamp() + { + Vector2 position; + + position.x = Mathf.SmoothDamp(transform.position.x, target.position.x + offset.x, ref velocity.x, time.x); + position.y = Mathf.SmoothDamp(transform.position.y, target.position.y + offset.y, ref velocity.y, time.y); + + rb.MovePosition(new Vector3(position.x, position.y, transform.position.z)); + } + protected virtual void Acceleration() + { + if (Vector2.Distance(transform.position, (Vector2)target.position + offset) == 0) + localSpeed = Vector2.zero; + else + { + localSpeed = localSpeed + acceleration * Time.deltaTime; + step = localSpeed * Time.deltaTime; + rb.MovePosition(new Vector2(Vector2.MoveTowards(transform.position, (Vector2)target.position + offset, step.x).x, Vector2.MoveTowards(transform.position, (Vector2)target.position + offset, step.x).y)); + } + } + + protected virtual void CheckForBounds() + { + rb.MovePosition(new Vector3(Mathf.Clamp(transform.position.x, lowerBounds.x, higherBounds.x), Mathf.Clamp(transform.position.y, lowerBounds.y, higherBounds.y), transform.position.z)); + } + + #endregion + } - - #endregion - -} +} \ No newline at end of file diff --git a/Assets/Scripts/Camera/CameraShake.cs b/Assets/Scripts/Camera/CameraShake.cs index 80382a1..d8814bb 100644 --- a/Assets/Scripts/Camera/CameraShake.cs +++ b/Assets/Scripts/Camera/CameraShake.cs @@ -3,54 +3,56 @@ // usage: attach this script into camera, call Shake() method to start // source: http://answers.unity3d.com/answers/992509/view.html - -public class CameraShake : MonoBehaviour +namespace UnityLibrary { - public bool shakePosition; - public bool shakeRotation; + public class CameraShake : MonoBehaviour + { + public bool shakePosition; + public bool shakeRotation; - public float shakeIntensityMin = 0.1f; - public float shakeIntensityMax = 0.5f; - public float shakeDecay = 0.02f; + public float shakeIntensityMin = 0.1f; + public float shakeIntensityMax = 0.5f; + public float shakeDecay = 0.02f; - private Vector3 OriginalPos; - private Quaternion OriginalRot; + private Vector3 OriginalPos; + private Quaternion OriginalRot; - private bool isShakeRunning = false; + private bool isShakeRunning = false; - // call this function to start shaking - public void Shake() - { - OriginalPos = transform.position; - OriginalRot = transform.rotation; - StartCoroutine("ProcessShake"); - } - - IEnumerator ProcessShake() - { - if (!isShakeRunning) + // call this function to start shaking + public void Shake() { - isShakeRunning = true; - float currentShakeIntensity = Random.Range(shakeIntensityMin, shakeIntensityMax); + OriginalPos = transform.position; + OriginalRot = transform.rotation; + StartCoroutine("ProcessShake"); + } - while (currentShakeIntensity > 0) + IEnumerator ProcessShake() + { + if (!isShakeRunning) { - if (shakePosition) - { - transform.position = OriginalPos + Random.insideUnitSphere * currentShakeIntensity; - } - if (shakeRotation) + isShakeRunning = true; + float currentShakeIntensity = Random.Range(shakeIntensityMin, shakeIntensityMax); + + while (currentShakeIntensity > 0) { - transform.rotation = new Quaternion(OriginalRot.x + Random.Range(-currentShakeIntensity, currentShakeIntensity) * .2f, - OriginalRot.y + Random.Range(-currentShakeIntensity, currentShakeIntensity) * .2f, - OriginalRot.z + Random.Range(-currentShakeIntensity, currentShakeIntensity) * .2f, - OriginalRot.w + Random.Range(-currentShakeIntensity, currentShakeIntensity) * .2f); + if (shakePosition) + { + transform.position = OriginalPos + Random.insideUnitSphere * currentShakeIntensity; + } + if (shakeRotation) + { + transform.rotation = new Quaternion(OriginalRot.x + Random.Range(-currentShakeIntensity, currentShakeIntensity) * .2f, + OriginalRot.y + Random.Range(-currentShakeIntensity, currentShakeIntensity) * .2f, + OriginalRot.z + Random.Range(-currentShakeIntensity, currentShakeIntensity) * .2f, + OriginalRot.w + Random.Range(-currentShakeIntensity, currentShakeIntensity) * .2f); + } + currentShakeIntensity -= shakeDecay; + yield return null; } - currentShakeIntensity -= shakeDecay; - yield return null; - } - isShakeRunning = false; + isShakeRunning = false; + } } } -} +} \ No newline at end of file diff --git a/Assets/Scripts/Camera/SmoothMouseLook.cs b/Assets/Scripts/Camera/SmoothMouseLook.cs index 0d403d8..a01d008 100644 --- a/Assets/Scripts/Camera/SmoothMouseLook.cs +++ b/Assets/Scripts/Camera/SmoothMouseLook.cs @@ -4,67 +4,69 @@ // Modified: Escape key for hide/show & lock/unlock mouse using UnityEngine; - -public class SmoothMouseLook : MonoBehaviour +namespace UnityLibrary { - Vector2 _mouseAbsolute; - Vector2 _smoothMouse; - - public Vector2 clampInDegrees = new Vector2(360, 180); - public bool lockCursor; - public Vector2 sensitivity = new Vector2(2, 2); - public Vector2 smoothing = new Vector2(3, 3); - public Vector2 targetDirection; - - void Start() + public class SmoothMouseLook : MonoBehaviour { - // Set target direction to the camera's initial orientation. - targetDirection = transform.rotation.eulerAngles; - Cursor.visible = !lockCursor; - } + Vector2 _mouseAbsolute; + Vector2 _smoothMouse; - void LateUpdate() - { + public Vector2 clampInDegrees = new Vector2(360, 180); + public bool lockCursor; + public Vector2 sensitivity = new Vector2(2, 2); + public Vector2 smoothing = new Vector2(3, 3); + public Vector2 targetDirection; - // pressing esc toggles between hide/show and lock/unlock cursor - if (Input.GetKeyDown(KeyCode.Escape)) + void Start() { - lockCursor = !lockCursor; + // Set target direction to the camera's initial orientation. + targetDirection = transform.rotation.eulerAngles; + Cursor.visible = !lockCursor; } - // Ensure the cursor is always locked when set - Cursor.lockState = lockCursor ? CursorLockMode.Locked : CursorLockMode.None; - Cursor.visible = !lockCursor; + void LateUpdate() + { + + // pressing esc toggles between hide/show and lock/unlock cursor + if (Input.GetKeyDown(KeyCode.Escape)) + { + lockCursor = !lockCursor; + } - // Allow the script to clamp based on a desired target value. - Quaternion targetOrientation = Quaternion.Euler(targetDirection); + // Ensure the cursor is always locked when set + Cursor.lockState = lockCursor ? CursorLockMode.Locked : CursorLockMode.None; + Cursor.visible = !lockCursor; - // Get raw mouse input for a cleaner reading on more sensitive mice. - var mouseDelta = new Vector2(Input.GetAxisRaw("Mouse X"), Input.GetAxisRaw("Mouse Y")); + // Allow the script to clamp based on a desired target value. + Quaternion targetOrientation = Quaternion.Euler(targetDirection); - // Scale input against the sensitivity setting and multiply that against the smoothing value. - mouseDelta = Vector2.Scale(mouseDelta, new Vector2(sensitivity.x * smoothing.x, sensitivity.y * smoothing.y)); + // Get raw mouse input for a cleaner reading on more sensitive mice. + var mouseDelta = new Vector2(Input.GetAxisRaw("Mouse X"), Input.GetAxisRaw("Mouse Y")); - // Interpolate mouse movement over time to apply smoothing delta. - _smoothMouse.x = Mathf.Lerp(_smoothMouse.x, mouseDelta.x, 1f / smoothing.x); - _smoothMouse.y = Mathf.Lerp(_smoothMouse.y, mouseDelta.y, 1f / smoothing.y); + // Scale input against the sensitivity setting and multiply that against the smoothing value. + mouseDelta = Vector2.Scale(mouseDelta, new Vector2(sensitivity.x * smoothing.x, sensitivity.y * smoothing.y)); - // Find the absolute mouse movement value from point zero. - _mouseAbsolute += _smoothMouse; + // Interpolate mouse movement over time to apply smoothing delta. + _smoothMouse.x = Mathf.Lerp(_smoothMouse.x, mouseDelta.x, 1f / smoothing.x); + _smoothMouse.y = Mathf.Lerp(_smoothMouse.y, mouseDelta.y, 1f / smoothing.y); - // Clamp and apply the local x value first, so as not to be affected by world transforms. - if (clampInDegrees.x < 360) - _mouseAbsolute.x = Mathf.Clamp(_mouseAbsolute.x, -clampInDegrees.x * 0.5f, clampInDegrees.x * 0.5f); + // Find the absolute mouse movement value from point zero. + _mouseAbsolute += _smoothMouse; - var xRotation = Quaternion.AngleAxis(-_mouseAbsolute.y, targetOrientation * Vector3.right); - transform.localRotation = xRotation; + // Clamp and apply the local x value first, so as not to be affected by world transforms. + if (clampInDegrees.x < 360) + _mouseAbsolute.x = Mathf.Clamp(_mouseAbsolute.x, -clampInDegrees.x * 0.5f, clampInDegrees.x * 0.5f); - // Then clamp and apply the global y value. - if (clampInDegrees.y < 360) - _mouseAbsolute.y = Mathf.Clamp(_mouseAbsolute.y, -clampInDegrees.y * 0.5f, clampInDegrees.y * 0.5f); + var xRotation = Quaternion.AngleAxis(-_mouseAbsolute.y, targetOrientation * Vector3.right); + transform.localRotation = xRotation; - var yRotation = Quaternion.AngleAxis(_mouseAbsolute.x, transform.InverseTransformDirection(Vector3.up)); - transform.localRotation *= yRotation; - transform.rotation *= targetOrientation; + // Then clamp and apply the global y value. + if (clampInDegrees.y < 360) + _mouseAbsolute.y = Mathf.Clamp(_mouseAbsolute.y, -clampInDegrees.y * 0.5f, clampInDegrees.y * 0.5f); + + var yRotation = Quaternion.AngleAxis(_mouseAbsolute.x, transform.InverseTransformDirection(Vector3.up)); + transform.localRotation *= yRotation; + transform.rotation *= targetOrientation; + } } -} +} \ No newline at end of file diff --git a/Assets/Scripts/Camera/WowCamera.cs b/Assets/Scripts/Camera/WowCamera.cs index adcb48c..7a6fa93 100644 --- a/Assets/Scripts/Camera/WowCamera.cs +++ b/Assets/Scripts/Camera/WowCamera.cs @@ -1,157 +1,159 @@ using UnityEngine; using System.Collections; - - - -public class WowCamera : MonoBehaviour + + +namespace UnityLibrary { - public Transform target; - - public float targetHeight = 1.7f; - public float distance = 5.0f; - public float offsetFromWall = 0.1f; - - public float maxDistance = 20; - public float minDistance = .6f; - - public float xSpeed = 200.0f; - public float ySpeed = 200.0f; - public float targetSpeed = 5.0f; - - - public int yMinLimit = -80; - public int yMaxLimit = 80; - - public int zoomRate = 40; - - public float rotationDampening = 3.0f; - public float zoomDampening = 5.0f; - - public LayerMask collisionLayers = -1; - - private float xDeg = 0.0f; - private float yDeg = 0.0f; - private float currentDistance; - private float desiredDistance; - private float correctedDistance; - - void Start () + public class WowCamera : MonoBehaviour { - Vector3 angles = transform.eulerAngles; - xDeg = angles.x; - yDeg = angles.y; - - currentDistance = distance; - desiredDistance = distance; - correctedDistance = distance; - - // Make the rigid body not change rotation - if (GetComponent()) - GetComponent().freezeRotation = true; - } - - - void Update() - { - - //Move the Player with left & right button press together - if(Input.GetMouseButton(1)&&Input.GetMouseButton(0)) - { - float targetRotationAngle = target.eulerAngles.y; - float currentRotationAngle = transform.eulerAngles.y; - xDeg = Mathf.LerpAngle (currentRotationAngle, targetRotationAngle, rotationDampening * Time.deltaTime); - target.transform.Rotate(0,Input.GetAxis ("Mouse X") * xSpeed * 0.02f,0); - xDeg += Input.GetAxis ("Mouse X") * targetSpeed * 0.02f; - target.transform.Translate(Vector3.forward * targetSpeed * Time.deltaTime); - } - } - - /** - * Camera logic on LateUpdate to only update after all character movement logic has been handled. - */ - void LateUpdate () - { - Vector3 vTargetOffset; - - // Don't do anything if target is not defined - if (!target) - return; - - // If either mouse buttons are down, let the mouse govern camera position - if (Input.GetMouseButton(0)) + public Transform target; + + public float targetHeight = 1.7f; + public float distance = 5.0f; + public float offsetFromWall = 0.1f; + + public float maxDistance = 20; + public float minDistance = .6f; + + public float xSpeed = 200.0f; + public float ySpeed = 200.0f; + public float targetSpeed = 5.0f; + + + public int yMinLimit = -80; + public int yMaxLimit = 80; + + public int zoomRate = 40; + + public float rotationDampening = 3.0f; + public float zoomDampening = 5.0f; + + public LayerMask collisionLayers = -1; + + private float xDeg = 0.0f; + private float yDeg = 0.0f; + private float currentDistance; + private float desiredDistance; + private float correctedDistance; + + void Start() { - xDeg += Input.GetAxis ("Mouse X") * xSpeed * 0.02f; - yDeg -= Input.GetAxis ("Mouse Y") * ySpeed * 0.02f; + Vector3 angles = transform.eulerAngles; + xDeg = angles.x; + yDeg = angles.y; + + currentDistance = distance; + desiredDistance = distance; + correctedDistance = distance; + + // Make the rigid body not change rotation + if (GetComponent()) + GetComponent().freezeRotation = true; } - //Reset the camera angle and Rotate the Target Around the World! - else if (Input.GetMouseButton(1)) - { - float targetRotationAngle = target.eulerAngles.y; - float currentRotationAngle = transform.eulerAngles.y; - xDeg = Mathf.LerpAngle (currentRotationAngle, targetRotationAngle, rotationDampening * Time.deltaTime); - target.transform.Rotate(0,Input.GetAxis ("Mouse X") * xSpeed * 0.02f,0); - xDeg += Input.GetAxis ("Mouse X") * xSpeed * 0.02f; - } - - - // otherwise, ease behind the target if any of the directional keys are pressed - else if (Input.GetAxis("Vertical") != 0 || Input.GetAxis("Horizontal") != 0) + + + void Update() { - float targetRotationAngle = target.eulerAngles.y; - float currentRotationAngle = transform.eulerAngles.y; - xDeg = Mathf.LerpAngle (currentRotationAngle, targetRotationAngle, rotationDampening * Time.deltaTime); + + //Move the Player with left & right button press together + if (Input.GetMouseButton(1) && Input.GetMouseButton(0)) + { + float targetRotationAngle = target.eulerAngles.y; + float currentRotationAngle = transform.eulerAngles.y; + xDeg = Mathf.LerpAngle(currentRotationAngle, targetRotationAngle, rotationDampening * Time.deltaTime); + target.transform.Rotate(0, Input.GetAxis("Mouse X") * xSpeed * 0.02f, 0); + xDeg += Input.GetAxis("Mouse X") * targetSpeed * 0.02f; + target.transform.Translate(Vector3.forward * targetSpeed * Time.deltaTime); + } } - - yDeg = ClampAngle (yDeg, yMinLimit, yMaxLimit); - - - // set camera rotation - Quaternion rotation = Quaternion.Euler (yDeg, xDeg, 0); - - // calculate the desired distance - desiredDistance -= Input.GetAxis ("Mouse ScrollWheel") * Time.deltaTime * zoomRate * Mathf.Abs (desiredDistance); - desiredDistance = Mathf.Clamp (desiredDistance, minDistance, maxDistance); - correctedDistance = desiredDistance; - - // calculate desired camera position - vTargetOffset = new Vector3 (0, -targetHeight, 0); - Vector3 position = target.position - (rotation * Vector3.forward * desiredDistance + vTargetOffset); - - // check for collision using the true target's desired registration point as set by user using height - RaycastHit collisionHit; - Vector3 trueTargetPosition = new Vector3 (target.position.x, target.position.y + targetHeight, target.position.z); - - // if there was a collision, correct the camera position and calculate the corrected distance - bool isCorrected = false; - if (Physics.Linecast (trueTargetPosition, position, out collisionHit, collisionLayers.value)) + + /** + * Camera logic on LateUpdate to only update after all character movement logic has been handled. + */ + void LateUpdate() { - // calculate the distance from the original estimated position to the collision location, - // subtracting out a safety "offset" distance from the object we hit. The offset will help - // keep the camera from being right on top of the surface we hit, which usually shows up as - // the surface geometry getting partially clipped by the camera's front clipping plane. - correctedDistance = Vector3.Distance (trueTargetPosition, collisionHit.point) - offsetFromWall; - isCorrected = true; + Vector3 vTargetOffset; + + // Don't do anything if target is not defined + if (!target) + return; + + // If either mouse buttons are down, let the mouse govern camera position + if (Input.GetMouseButton(0)) + { + xDeg += Input.GetAxis("Mouse X") * xSpeed * 0.02f; + yDeg -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f; + } + //Reset the camera angle and Rotate the Target Around the World! + else if (Input.GetMouseButton(1)) + { + float targetRotationAngle = target.eulerAngles.y; + float currentRotationAngle = transform.eulerAngles.y; + xDeg = Mathf.LerpAngle(currentRotationAngle, targetRotationAngle, rotationDampening * Time.deltaTime); + target.transform.Rotate(0, Input.GetAxis("Mouse X") * xSpeed * 0.02f, 0); + xDeg += Input.GetAxis("Mouse X") * xSpeed * 0.02f; + } + + + // otherwise, ease behind the target if any of the directional keys are pressed + else if (Input.GetAxis("Vertical") != 0 || Input.GetAxis("Horizontal") != 0) + { + float targetRotationAngle = target.eulerAngles.y; + float currentRotationAngle = transform.eulerAngles.y; + xDeg = Mathf.LerpAngle(currentRotationAngle, targetRotationAngle, rotationDampening * Time.deltaTime); + } + + yDeg = ClampAngle(yDeg, yMinLimit, yMaxLimit); + + + // set camera rotation + Quaternion rotation = Quaternion.Euler(yDeg, xDeg, 0); + + // calculate the desired distance + desiredDistance -= Input.GetAxis("Mouse ScrollWheel") * Time.deltaTime * zoomRate * Mathf.Abs(desiredDistance); + desiredDistance = Mathf.Clamp(desiredDistance, minDistance, maxDistance); + correctedDistance = desiredDistance; + + // calculate desired camera position + vTargetOffset = new Vector3(0, -targetHeight, 0); + Vector3 position = target.position - (rotation * Vector3.forward * desiredDistance + vTargetOffset); + + // check for collision using the true target's desired registration point as set by user using height + RaycastHit collisionHit; + Vector3 trueTargetPosition = new Vector3(target.position.x, target.position.y + targetHeight, target.position.z); + + // if there was a collision, correct the camera position and calculate the corrected distance + bool isCorrected = false; + if (Physics.Linecast(trueTargetPosition, position, out collisionHit, collisionLayers.value)) + { + // calculate the distance from the original estimated position to the collision location, + // subtracting out a safety "offset" distance from the object we hit. The offset will help + // keep the camera from being right on top of the surface we hit, which usually shows up as + // the surface geometry getting partially clipped by the camera's front clipping plane. + correctedDistance = Vector3.Distance(trueTargetPosition, collisionHit.point) - offsetFromWall; + isCorrected = true; + } + + // For smoothing, lerp distance only if either distance wasn't corrected, or correctedDistance is more than currentDistance + currentDistance = !isCorrected || correctedDistance > currentDistance ? Mathf.Lerp(currentDistance, correctedDistance, Time.deltaTime * zoomDampening) : correctedDistance; + + // keep within legal limits + currentDistance = Mathf.Clamp(currentDistance, minDistance, maxDistance); + + // recalculate position based on the new currentDistance + position = target.position - (rotation * Vector3.forward * currentDistance + vTargetOffset); + + transform.rotation = rotation; + transform.position = position; + } + + private static float ClampAngle(float angle, float min, float max) + { + if (angle < -360) + angle += 360; + if (angle > 360) + angle -= 360; + return Mathf.Clamp(angle, min, max); } - - // For smoothing, lerp distance only if either distance wasn't corrected, or correctedDistance is more than currentDistance - currentDistance = !isCorrected || correctedDistance > currentDistance ? Mathf.Lerp (currentDistance, correctedDistance, Time.deltaTime * zoomDampening) : correctedDistance; - - // keep within legal limits - currentDistance = Mathf.Clamp (currentDistance, minDistance, maxDistance); - - // recalculate position based on the new currentDistance - position = target.position - (rotation * Vector3.forward * currentDistance + vTargetOffset); - - transform.rotation = rotation; - transform.position = position; - } - - private static float ClampAngle (float angle, float min, float max) - { - if (angle < -360) - angle += 360; - if (angle > 360) - angle -= 360; - return Mathf.Clamp (angle, min, max); } } \ No newline at end of file diff --git a/Assets/Scripts/Camera/ZoomWithMouse.cs b/Assets/Scripts/Camera/ZoomWithMouse.cs index 102d6db..45b0b1f 100644 --- a/Assets/Scripts/Camera/ZoomWithMouse.cs +++ b/Assets/Scripts/Camera/ZoomWithMouse.cs @@ -2,18 +2,20 @@ // Zoom forward and backward with mousewheel, Attach this script to camera - -public class ZoomWithMouse : MonoBehaviour +namespace UnityLibrary { - public float zoomSpeed = 20; - - void Update() + public class ZoomWithMouse : MonoBehaviour { - var mouseScroll = Input.GetAxis("Mouse ScrollWheel"); + public float zoomSpeed = 20; - if (mouseScroll!=0) + void Update() { - transform.Translate(transform.forward * mouseScroll * zoomSpeed * Time.deltaTime, Space.Self); + var mouseScroll = Input.GetAxis("Mouse ScrollWheel"); + + if (mouseScroll != 0) + { + transform.Translate(transform.forward * mouseScroll * zoomSpeed * Time.deltaTime, Space.Self); + } } } } diff --git a/Assets/Scripts/Drawing/DrawLine.cs b/Assets/Scripts/Drawing/DrawLine.cs index c95d7d0..44d6c53 100644 --- a/Assets/Scripts/Drawing/DrawLine.cs +++ b/Assets/Scripts/Drawing/DrawLine.cs @@ -1,106 +1,102 @@ using System.Collections; using System.Collections.Generic; using UnityEngine; - -public class DrawLine : MonoBehaviour +namespace UnityLibrary { + public class DrawLine : MonoBehaviour + { - [SerializeField] - protected LineRenderer m_LineRenderer; - [SerializeField] - protected Camera m_Camera; - protected List m_Points; + [SerializeField] + protected LineRenderer m_LineRenderer; + [SerializeField] + protected Camera m_Camera; + protected List m_Points; - public virtual LineRenderer lineRenderer - { - get - { - return m_LineRenderer; - } - } + public virtual LineRenderer lineRenderer { + get { + return m_LineRenderer; + } + } - public virtual new Camera camera - { - get - { - return m_Camera; - } - } + public virtual new Camera camera { + get { + return m_Camera; + } + } - public virtual List points - { - get - { - return m_Points; - } - } + public virtual List points { + get { + return m_Points; + } + } - protected virtual void Awake () - { - if ( m_LineRenderer == null ) - { - Debug.LogWarning ( "DrawLine: Line Renderer not assigned, Adding and Using default Line Renderer." ); - CreateDefaultLineRenderer (); - } - if ( m_Camera == null ) - { - Debug.LogWarning ( "DrawLine: Camera not assigned, Using Main Camera or Creating Camera if main not exists." ); - CreateDefaultCamera (); - } - m_Points = new List (); - } + protected virtual void Awake() + { + if (m_LineRenderer == null) + { + Debug.LogWarning("DrawLine: Line Renderer not assigned, Adding and Using default Line Renderer."); + CreateDefaultLineRenderer(); + } + if (m_Camera == null) + { + Debug.LogWarning("DrawLine: Camera not assigned, Using Main Camera or Creating Camera if main not exists."); + CreateDefaultCamera(); + } + m_Points = new List(); + } - protected virtual void Update () - { - if ( Input.GetMouseButtonDown ( 0 ) ) - { - Reset (); - } - if ( Input.GetMouseButton ( 0 ) ) - { - Vector3 mousePosition = m_Camera.ScreenToWorldPoint ( Input.mousePosition ); - mousePosition.z = m_LineRenderer.transform.position.z; - if ( !m_Points.Contains ( mousePosition ) ) - { - m_Points.Add ( mousePosition ); - m_LineRenderer.positionCount = m_Points.Count; - m_LineRenderer.SetPosition ( m_LineRenderer.positionCount - 1, mousePosition ); - } - } - } + protected virtual void Update() + { + if (Input.GetMouseButtonDown(0)) + { + Reset(); + } + if (Input.GetMouseButton(0)) + { + Vector3 mousePosition = m_Camera.ScreenToWorldPoint(Input.mousePosition); + mousePosition.z = m_LineRenderer.transform.position.z; + if (!m_Points.Contains(mousePosition)) + { + m_Points.Add(mousePosition); + m_LineRenderer.positionCount = m_Points.Count; + m_LineRenderer.SetPosition(m_LineRenderer.positionCount - 1, mousePosition); + } + } + } - protected virtual void Reset () - { - if ( m_LineRenderer != null ) - { - m_LineRenderer.positionCount = 0; - } - if ( m_Points != null ) - { - m_Points.Clear (); - } - } + protected virtual void Reset() + { + if (m_LineRenderer != null) + { + m_LineRenderer.positionCount = 0; + } + if (m_Points != null) + { + m_Points.Clear(); + } + } - protected virtual void CreateDefaultLineRenderer () - { - m_LineRenderer = gameObject.AddComponent (); - m_LineRenderer.positionCount = 0; - m_LineRenderer.material = new Material ( Shader.Find ( "Particles/Additive" ) ); - m_LineRenderer.startColor = Color.white; - m_LineRenderer.endColor = Color.white; - m_LineRenderer.startWidth = 0.3f; - m_LineRenderer.endWidth = 0.3f; - m_LineRenderer.useWorldSpace = true; - } + protected virtual void CreateDefaultLineRenderer() + { + m_LineRenderer = gameObject.AddComponent(); + m_LineRenderer.positionCount = 0; + m_LineRenderer.material = new Material(Shader.Find("Particles/Additive")); + m_LineRenderer.startColor = Color.white; + m_LineRenderer.endColor = Color.white; + m_LineRenderer.startWidth = 0.3f; + m_LineRenderer.endWidth = 0.3f; + m_LineRenderer.useWorldSpace = true; + } - protected virtual void CreateDefaultCamera () - { - m_Camera = Camera.main; - if ( m_Camera == null ) - { - m_Camera = gameObject.AddComponent (); - } - m_Camera.orthographic = true; - } + protected virtual void CreateDefaultCamera() + { + m_Camera = Camera.main; + if (m_Camera == null) + { + m_Camera = gameObject.AddComponent(); + } + m_Camera.orthographic = true; + } + } } diff --git a/Assets/Scripts/Editor/EditorShortCutKeys.cs b/Assets/Scripts/Editor/EditorShortCutKeys.cs index 728bf74..d6f50fe 100644 --- a/Assets/Scripts/Editor/EditorShortCutKeys.cs +++ b/Assets/Scripts/Editor/EditorShortCutKeys.cs @@ -5,16 +5,18 @@ // original source by "Mavina" http://answers.unity3d.com/answers/1204307/view.html // usage: Place this script into Editor/ folder, then you can press F5 to enter/exit Play Mode - -public class EditorShortCutKeys : ScriptableObject +namespace UnityLibrary { - [MenuItem("Edit/Run _F5")] // shortcut key F5 to Play (and exit playmode also) - static void PlayGame() + public class EditorShortCutKeys : ScriptableObject { - if (!Application.isPlaying) + [MenuItem("Edit/Run _F5")] // shortcut key F5 to Play (and exit playmode also) + static void PlayGame() { - EditorSceneManager.SaveScene(SceneManager.GetActiveScene(), "", false); // optional: save before run + if (!Application.isPlaying) + { + EditorSceneManager.SaveScene(SceneManager.GetActiveScene(), "", false); // optional: save before run + } + EditorApplication.ExecuteMenuItem("Edit/Play"); } - EditorApplication.ExecuteMenuItem("Edit/Play"); } } diff --git a/Assets/Scripts/Editor/Gizmos/DrawCameraFrustumGizmos.cs b/Assets/Scripts/Editor/Gizmos/DrawCameraFrustumGizmos.cs index 3568687..b0f87f9 100644 --- a/Assets/Scripts/Editor/Gizmos/DrawCameraFrustumGizmos.cs +++ b/Assets/Scripts/Editor/Gizmos/DrawCameraFrustumGizmos.cs @@ -4,13 +4,15 @@ // draws camera frustum lines with Gizmo lines (when camera is not selected) // Usage: add this script into Editor/ folder on your project // WARNING: cam.transform.position does not work, DrawFrustum ignores the value, unity bug? - -static class DrawCameraFrustumGizmos +namespace UnityLibrary { - [DrawGizmo(GizmoType.NotInSelectionHierarchy)]// | GizmoType.Active)] - static void DrawGizmoForMyScript(Camera cam,GizmoType gizmoType) + static class DrawCameraFrustumGizmos { - Gizmos.color = Color.red; - Gizmos.DrawFrustum(cam.transform.position, cam.fieldOfView,cam.farClipPlane, cam.nearClipPlane,cam.aspect); + [DrawGizmo(GizmoType.NotInSelectionHierarchy)]// | GizmoType.Active)] + static void DrawGizmoForMyScript(Camera cam, GizmoType gizmoType) + { + Gizmos.color = Color.red; + Gizmos.DrawFrustum(cam.transform.position, cam.fieldOfView, cam.farClipPlane, cam.nearClipPlane, cam.aspect); + } } -} +} \ No newline at end of file diff --git a/Assets/Scripts/Editor/GridGenerator/Editor/GridGeneratorEditor.cs b/Assets/Scripts/Editor/GridGenerator/Editor/GridGeneratorEditor.cs index cbe23e7..33a608c 100644 --- a/Assets/Scripts/Editor/GridGenerator/Editor/GridGeneratorEditor.cs +++ b/Assets/Scripts/Editor/GridGenerator/Editor/GridGeneratorEditor.cs @@ -4,61 +4,63 @@ using UnityEngine; using UnityEditor.SceneManagement; using System.Linq; - -[CustomEditor(typeof(GridGenerator))] -public class GridGeneratorEditor : Editor +namespace UnityLibrary { - GridGenerator t; - - private void OnEnable() - { - t = (GridGenerator) target; - } - - public override void OnInspectorGUI() + [CustomEditor(typeof(GridGenerator))] + public class GridGeneratorEditor : Editor { - base.OnInspectorGUI(); + GridGenerator t; - if (GUILayout.Button("Cleanup")) + private void OnEnable() { - CleanUp(); + t = (GridGenerator)target; } - if (GUILayout.Button("Generate Grid")) + public override void OnInspectorGUI() { - CleanUp(); - GenerateGrid(); + base.OnInspectorGUI(); + + if (GUILayout.Button("Cleanup")) + { + CleanUp(); + } + + if (GUILayout.Button("Generate Grid")) + { + CleanUp(); + GenerateGrid(); + } } - } - private void CleanUp() - { - List tempList = t.transform.Cast().ToList(); - tempList.ForEach(x => DestroyImmediate(x.gameObject)); - } + private void CleanUp() + { + List tempList = t.transform.Cast().ToList(); + tempList.ForEach(x => DestroyImmediate(x.gameObject)); + } - private void GenerateGrid() - { - for (int x = 0; x < t.SizeX; x++) + private void GenerateGrid() { - for (int y = 0; y < t.SizeY; y++) + for (int x = 0; x < t.SizeX; x++) { - Vector3 localOffset = new Vector3( - t.Offset.x * x, - 0, - t.Offset.y * y - ); + for (int y = 0; y < t.SizeY; y++) + { + Vector3 localOffset = new Vector3( + t.Offset.x * x, + 0, + t.Offset.y * y + ); - GameObject spawnedObject = Instantiate(t.PrefabToPlace); + GameObject spawnedObject = Instantiate(t.PrefabToPlace); - spawnedObject.transform.SetParent(t.transform); - spawnedObject.transform.localPosition = localOffset; + spawnedObject.transform.SetParent(t.transform); + spawnedObject.transform.localPosition = localOffset; - spawnedObject.name = string.Format("{0} ({1},{2})", t.PrefabToPlace.name, x, y); + spawnedObject.name = string.Format("{0} ({1},{2})", t.PrefabToPlace.name, x, y); + } } + + EditorSceneManager.MarkSceneDirty(EditorSceneManager.GetActiveScene()); } - EditorSceneManager.MarkSceneDirty(EditorSceneManager.GetActiveScene()); } - -} +} \ No newline at end of file diff --git a/Assets/Scripts/Editor/GridGenerator/GridGenerator.cs b/Assets/Scripts/Editor/GridGenerator/GridGenerator.cs index 9dd3697..9d0d15d 100644 --- a/Assets/Scripts/Editor/GridGenerator/GridGenerator.cs +++ b/Assets/Scripts/Editor/GridGenerator/GridGenerator.cs @@ -1,22 +1,24 @@ using UnityEngine; - -public class GridGenerator : MonoBehaviour +namespace UnityLibrary { - [SerializeField] - private GameObject prefabToPlace; + public class GridGenerator : MonoBehaviour + { + [SerializeField] + private GameObject prefabToPlace; - [SerializeField] - private uint sizeX = 2; + [SerializeField] + private uint sizeX = 2; - [SerializeField] - private uint sizeY = 2; + [SerializeField] + private uint sizeY = 2; - [SerializeField] - private Vector2 offset = Vector2.one; + [SerializeField] + private Vector2 offset = Vector2.one; - public GameObject PrefabToPlace { get { return prefabToPlace; } } - public Vector2 Offset { get { return offset; } } + public GameObject PrefabToPlace { get { return prefabToPlace; } } + public Vector2 Offset { get { return offset; } } - public uint SizeX { get { return sizeX; } } - public uint SizeY { get { return sizeY; } } -} + public uint SizeX { get { return sizeX; } } + public uint SizeY { get { return sizeY; } } + } +} \ No newline at end of file diff --git a/Assets/Scripts/Editor/HelpLastRelease.cs b/Assets/Scripts/Editor/HelpLastRelease.cs index 942b042..076fdce 100644 --- a/Assets/Scripts/Editor/HelpLastRelease.cs +++ b/Assets/Scripts/Editor/HelpLastRelease.cs @@ -18,43 +18,45 @@ using UnityEditor; using UnityEngine; using Debug = UnityEngine.Debug; - -public class HelpLastRelease : EditorWindow { - const string statsUrl = @"http://hwstats.unity3d.com/index.html"; - const string experimenalUrl = @"http://unity3d.com/experimental"; - const string roadmapUrl = @"http://unity3d.com/unity/roadmap"; - const string archiveUrl = @"http://unity3d.com/get-unity/download/archive"; - const string betaArchiveUrl = @"http://unity3d.com/unity/beta/archive"; - const string releaseUrl = @"http://beta.unity3d.com/download/{0}/download.html"; - const string assistantUrl = @"http://beta.unity3d.com/download/{0}/UnityDownloadAssistant-{1}.{2}"; - const string serverUrl = @"http://symbolserver.unity3d.com/"; - const string historyUrl = serverUrl + @"000Admin/history.txt"; - const string finalRN = @"http://unity3d.com/unity/whats-new/unity-"; - const string betaRN = @"http://unity3d.com/unity/beta/unity"; - const string patchRN = @"http://unity3d.com/unity/qa/patch-releases"; - - const string baseName = "UnityYAMLMerge.ex"; - const string compressedName = baseName + "_"; - const string extractedName = baseName + "e"; - static string tempDir; - static WWW wwwHistory, wwwList, wwwMerger, wwwAssistant; - static readonly string zipName = Application.platform == RuntimePlatform.WindowsEditor ? "7z" : "7za"; - - static SortedList fullList; - static SortedList sortedList; - static SortedList currentList; - static int selected; - static bool assistant; - static HelpLastRelease window; - const string wndTitle = "Unity Builds"; - [SerializeField] - string search = ""; - static GUIStyle style; - const string prefsCount = "HelpLastRelease.count"; - const float minWidth = 162f; - [SerializeField] - private Vector2 scroll; - static Dictionary colors = new Dictionary() { +namespace UnityLibrary +{ + public class HelpLastRelease : EditorWindow + { + const string statsUrl = @"http://hwstats.unity3d.com/index.html"; + const string experimenalUrl = @"http://unity3d.com/experimental"; + const string roadmapUrl = @"http://unity3d.com/unity/roadmap"; + const string archiveUrl = @"http://unity3d.com/get-unity/download/archive"; + const string betaArchiveUrl = @"http://unity3d.com/unity/beta/archive"; + const string releaseUrl = @"http://beta.unity3d.com/download/{0}/download.html"; + const string assistantUrl = @"http://beta.unity3d.com/download/{0}/UnityDownloadAssistant-{1}.{2}"; + const string serverUrl = @"http://symbolserver.unity3d.com/"; + const string historyUrl = serverUrl + @"000Admin/history.txt"; + const string finalRN = @"http://unity3d.com/unity/whats-new/unity-"; + const string betaRN = @"http://unity3d.com/unity/beta/unity"; + const string patchRN = @"http://unity3d.com/unity/qa/patch-releases"; + + const string baseName = "UnityYAMLMerge.ex"; + const string compressedName = baseName + "_"; + const string extractedName = baseName + "e"; + static string tempDir; + static WWW wwwHistory, wwwList, wwwMerger, wwwAssistant; + static readonly string zipName = Application.platform == RuntimePlatform.WindowsEditor ? "7z" : "7za"; + + static SortedList fullList; + static SortedList sortedList; + static SortedList currentList; + static int selected; + static bool assistant; + static HelpLastRelease window; + const string wndTitle = "Unity Builds"; + [SerializeField] + string search = ""; + static GUIStyle style; + const string prefsCount = "HelpLastRelease.count"; + const float minWidth = 162f; + [SerializeField] + private Vector2 scroll; + static Dictionary colors = new Dictionary() { { "5.0.", new Color32(236, 239, 241 ,255) }, { "5.1.", new Color32(207, 216, 220, 255) }, { "5.2.", new Color32(176, 190, 197, 255) }, @@ -67,7 +69,7 @@ public class HelpLastRelease : EditorWindow { { "2017.3.", new Color32(38, 50, 56, 255) } }; - static Dictionary textColors = new Dictionary() { + static Dictionary textColors = new Dictionary() { { "5.0.", new Color32(0, 0, 0, 255) }, { "5.1.", new Color32(0, 0, 0, 255) }, { "5.2.", new Color32(0, 0, 0, 255) }, @@ -80,397 +82,475 @@ public class HelpLastRelease : EditorWindow { { "2017.3.", new Color32(255, 255, 255, 255) } }; - [MenuItem("Help/Links/Statistics")] - static void OpenStatistics() { - Application.OpenURL(statsUrl); - } - - [MenuItem("Help/Links/Experimental")] - static void OpenExperimental() { - Application.OpenURL(experimenalUrl); - } - - [MenuItem("Help/Links/Roadmap")] - static void OpenRoadmap() { - Application.OpenURL(roadmapUrl); - } - - [MenuItem("Help/Links/Release Archive")] - static void OpenArchive() { - Application.OpenURL(archiveUrl); - } + [MenuItem("Help/Links/Statistics")] + static void OpenStatistics() + { + Application.OpenURL(statsUrl); + } - [MenuItem("Help/Links/Patch Archive")] - static void OpenPatchArchive() { - Application.OpenURL(patchRN); - } + [MenuItem("Help/Links/Experimental")] + static void OpenExperimental() + { + Application.OpenURL(experimenalUrl); + } - [MenuItem("Help/Links/Beta Archive")] - static void OpenBetaArchive() { - Application.OpenURL(betaArchiveUrl); - } + [MenuItem("Help/Links/Roadmap")] + static void OpenRoadmap() + { + Application.OpenURL(roadmapUrl); + } - [MenuItem("Help/Links/Last Releases")] - static void Init() { - window = GetWindow(wndTitle); - } + [MenuItem("Help/Links/Release Archive")] + static void OpenArchive() + { + Application.OpenURL(archiveUrl); + } - void OnGUI() { - if(fullList != null) { - ListGUI(); + [MenuItem("Help/Links/Patch Archive")] + static void OpenPatchArchive() + { + Application.OpenURL(patchRN); } - else - WaitGUI(); - } - public void ListGUI() { - style = new GUIStyle(EditorStyles.miniButton); - style.alignment = TextAnchor.MiddleLeft; - //GUILayout.BeginVertical(); - DoToolbar(); - scroll = EditorGUILayout.BeginScrollView(scroll, false, false); - if(currentList == null) - currentList = fullList; - - for(int i = currentList.Count - 1; i >= 0; i--) - DoItemGUI(i, currentList.Keys[i], currentList.Values[i]); - - EditorGUILayout.EndScrollView(); - GUILayout.FlexibleSpace(); - DoDownloadProgressBar(wwwAssistant, "Downloading Assistant"); - DoDownloadProgressBar(wwwHistory, "Downloading History"); - DoDownloadProgressBar(wwwList, "Downloading List"); - DoDownloadProgressBar(wwwMerger, "Downloading Merger"); - //GUILayout.EndVertical(); - } + [MenuItem("Help/Links/Beta Archive")] + static void OpenBetaArchive() + { + Application.OpenURL(betaArchiveUrl); + } - private void Update() { - Repaint(); - } + [MenuItem("Help/Links/Last Releases")] + static void Init() + { + window = GetWindow(wndTitle); + } - void DoDownloadProgressBar(WWW www, string text) { - if(www != null && !www.isDone && string.IsNullOrEmpty(www.error)) { - text = string.Format("{0} ({1})", text, EditorUtility.FormatBytes(www.bytesDownloaded)); - EditorGUI.ProgressBar(EditorGUILayout.GetControlRect(), www.progress, string.IsNullOrEmpty(www.error) ? text : www.error); + void OnGUI() + { + if (fullList != null) + { + ListGUI(); + } + else + WaitGUI(); } - } - void DoItemGUI(int index, string key, string value) { - var rect = EditorGUILayout.BeginHorizontal((index & 1) == 1 ? "ObjectPickerResultsOdd" : "ObjectPickerResultsEven"); - var color = GetGUIColor(index); - var colorText = GetGUITextColor(index); - var s = new GUIStyle(); - s.normal.textColor = colorText; + public void ListGUI() + { + style = new GUIStyle(EditorStyles.miniButton); + style.alignment = TextAnchor.MiddleLeft; + //GUILayout.BeginVertical(); + DoToolbar(); + scroll = EditorGUILayout.BeginScrollView(scroll, false, false); + if (currentList == null) + currentList = fullList; - EditorGUI.DrawRect(rect, color); - GUILayout.Label("Unity " + value, s); - GUILayout.FlexibleSpace(); + for (int i = currentList.Count - 1; i >= 0; i--) + DoItemGUI(i, currentList.Keys[i], currentList.Values[i]); - var notesURL = GetReleaseNotesURL(index); - if(GUILayout.Button("Open", "minibuttonleft")) { - DownloadList(index); - } - GUI.enabled = !string.IsNullOrEmpty(notesURL); - if(GUILayout.Button("Release Notes", "minibuttonmid")) { - OpenReleaseNotes(index); + EditorGUILayout.EndScrollView(); + GUILayout.FlexibleSpace(); + DoDownloadProgressBar(wwwAssistant, "Downloading Assistant"); + DoDownloadProgressBar(wwwHistory, "Downloading History"); + DoDownloadProgressBar(wwwList, "Downloading List"); + DoDownloadProgressBar(wwwMerger, "Downloading Merger"); + //GUILayout.EndVertical(); } - GUI.enabled = true; - if(GUILayout.Button("Download Assistant", "minibuttonright")) { - DownloadList(index, true); + + private void Update() + { + Repaint(); } - EditorGUILayout.EndHorizontal(); - } - static Color32 GetGUIColor(int i) { - foreach(var k in colors.Keys) { - if(currentList.Values[i].Contains(k)) { - return colors[k]; + void DoDownloadProgressBar(WWW www, string text) + { + if (www != null && !www.isDone && string.IsNullOrEmpty(www.error)) + { + text = string.Format("{0} ({1})", text, EditorUtility.FormatBytes(www.bytesDownloaded)); + EditorGUI.ProgressBar(EditorGUILayout.GetControlRect(), www.progress, string.IsNullOrEmpty(www.error) ? text : www.error); } } - return new Color32(255,255,255,255); - } - static Color32 GetGUITextColor(int i) - { - foreach (var k in textColors.Keys) + void DoItemGUI(int index, string key, string value) { - if (currentList.Values[i].Contains(k)) + var rect = EditorGUILayout.BeginHorizontal((index & 1) == 1 ? "ObjectPickerResultsOdd" : "ObjectPickerResultsEven"); + var color = GetGUIColor(index); + var colorText = GetGUITextColor(index); + var s = new GUIStyle(); + s.normal.textColor = colorText; + + EditorGUI.DrawRect(rect, color); + GUILayout.Label("Unity " + value, s); + GUILayout.FlexibleSpace(); + + var notesURL = GetReleaseNotesURL(index); + if (GUILayout.Button("Open", "minibuttonleft")) + { + DownloadList(index); + } + GUI.enabled = !string.IsNullOrEmpty(notesURL); + if (GUILayout.Button("Release Notes", "minibuttonmid")) + { + OpenReleaseNotes(index); + } + GUI.enabled = true; + if (GUILayout.Button("Download Assistant", "minibuttonright")) { - return textColors[k]; + DownloadList(index, true); } + EditorGUILayout.EndHorizontal(); } - return new Color32(0, 0, 0, 255); - } - - void OnEnable() { - tempDir = Application.dataPath + "/../Temp/LastRelease"; - DownloadHistory(); - } - static void CheckNewVersion() { - int count = EditorPrefs.GetInt(prefsCount, 0); - if(count > 0 && fullList.Count > count) { - EditorApplication.Beep(); - Debug.LogFormat("New version: {0}", fullList.Values[fullList.Count - 1]); + static Color32 GetGUIColor(int i) + { + foreach (var k in colors.Keys) + { + if (currentList.Values[i].Contains(k)) + { + return colors[k]; + } + } + return new Color32(255, 255, 255, 255); } - EditorPrefs.SetInt(prefsCount, fullList.Count); - } - static string GetReleaseNotesURL(int num) { - string url = "", version = ""; - if(currentList.Values[num].Contains("a")) - return string.Empty; - if(currentList.Values[num].Contains("p")) { - version = currentList.Values[num].Split(' ')[0]; - url = patchRN + version; + static Color32 GetGUITextColor(int i) + { + foreach (var k in textColors.Keys) + { + if (currentList.Values[i].Contains(k)) + { + return textColors[k]; + } + } + return new Color32(0, 0, 0, 255); } - if(currentList.Values[num].Contains("f")) { - version = currentList.Values[num].Split('f')[0]; - url = finalRN + version; + + void OnEnable() + { + tempDir = Application.dataPath + "/../Temp/LastRelease"; + DownloadHistory(); } - if(currentList.Values[num].Contains("b")) { - version = currentList.Values[num].Split(' ')[0]; - url = betaRN + version; + + static void CheckNewVersion() + { + int count = EditorPrefs.GetInt(prefsCount, 0); + if (count > 0 && fullList.Count > count) + { + EditorApplication.Beep(); + Debug.LogFormat("New version: {0}", fullList.Values[fullList.Count - 1]); + } + EditorPrefs.SetInt(prefsCount, fullList.Count); } - return url; - } + static string GetReleaseNotesURL(int num) + { + string url = "", version = ""; + if (currentList.Values[num].Contains("a")) + return string.Empty; + if (currentList.Values[num].Contains("p")) + { + version = currentList.Values[num].Split(' ')[0]; + url = patchRN + version; + } + if (currentList.Values[num].Contains("f")) + { + version = currentList.Values[num].Split('f')[0]; + url = finalRN + version; + } + if (currentList.Values[num].Contains("b")) + { + version = currentList.Values[num].Split(' ')[0]; + url = betaRN + version; + } - static void OpenReleaseNotes(int num) { - var url = GetReleaseNotesURL(num); + return url; + } - if(!string.IsNullOrEmpty(url)) - Application.OpenURL(url); - } + static void OpenReleaseNotes(int num) + { + var url = GetReleaseNotesURL(num); - static void FillMenu(WWW history) { - fullList = new SortedList(); - string build; - string[] parts, releases = history.text.Split('\n'); - for(int i = 0; i < releases.Length; i++) { - parts = releases[i].Split(','); - DateTime dt; - if(DateTime.TryParse(string.Format("{0} {1}", parts[3], parts[4]), out dt)) { - build = string.Format("{0} ({1})", parts[6].Trim('\"'), dt.ToString("dd-MM-yyyy")); - fullList.Add(parts[0], build); - } - //Debug.LogWarningFormat("releases[{0}]={1}\nparts={2}", i, releases[i], parts.ToStringRecursive()); + if (!string.IsNullOrEmpty(url)) + Application.OpenURL(url); } - if(window == null) { - HelpLastRelease[] w = Resources.FindObjectsOfTypeAll(); - if(w != null && w.Length > 0) - window = w[0]; + + static void FillMenu(WWW history) + { + fullList = new SortedList(); + string build; + string[] parts, releases = history.text.Split('\n'); + for (int i = 0; i < releases.Length; i++) + { + parts = releases[i].Split(','); + DateTime dt; + if (DateTime.TryParse(string.Format("{0} {1}", parts[3], parts[4]), out dt)) + { + build = string.Format("{0} ({1})", parts[6].Trim('\"'), dt.ToString("dd-MM-yyyy")); + fullList.Add(parts[0], build); + } + //Debug.LogWarningFormat("releases[{0}]={1}\nparts={2}", i, releases[i], parts.ToStringRecursive()); + } + if (window == null) + { + HelpLastRelease[] w = Resources.FindObjectsOfTypeAll(); + if (w != null && w.Length > 0) + window = w[0]; + } + if (window != null) + window.Repaint(); } - if(window != null) - window.Repaint(); - } - static void SearchVersion() { - string path = Path.Combine(tempDir, extractedName); - if(File.Exists(path)) { - string[] lines; - lines = File.ReadAllLines(path, Encoding.Unicode); - FileUtil.DeleteFileOrDirectory(Path.GetDirectoryName(path)); - string version = currentList.Values[selected].Split(' ')[0] + "_"; - for(int i = 0; i < lines.Length; i++) { - if(lines[i].Contains(version)) { - int pos = lines[i].IndexOf(version); - string revision = lines[i].Substring(pos + version.Length, 12); - if(!assistant) { - Application.OpenURL(string.Format(releaseUrl, revision)); - } - else { - DownloadAssistant(revision); + static void SearchVersion() + { + string path = Path.Combine(tempDir, extractedName); + if (File.Exists(path)) + { + string[] lines; + lines = File.ReadAllLines(path, Encoding.Unicode); + FileUtil.DeleteFileOrDirectory(Path.GetDirectoryName(path)); + string version = currentList.Values[selected].Split(' ')[0] + "_"; + for (int i = 0; i < lines.Length; i++) + { + if (lines[i].Contains(version)) + { + int pos = lines[i].IndexOf(version); + string revision = lines[i].Substring(pos + version.Length, 12); + if (!assistant) + { + Application.OpenURL(string.Format(releaseUrl, revision)); + } + else + { + DownloadAssistant(revision); + } + break; } - break; } } } - } - - static void DownloadAssistant(string revision) { - string version = currentList.Values[selected].Split(' ')[0]; - string ext = Application.platform == RuntimePlatform.WindowsEditor ? "exe" : "dmg"; - string url = string.Format(assistantUrl, revision, version, ext); - wwwAssistant = new WWW(url); - EditorApplication.update += WaitAssistant; - } - - static void DownloadHistory() { - wwwHistory = new WWW(historyUrl); - EditorApplication.update += WaitHistory; - } - static void DownloadList(int historyNum, bool assist = false) { - selected = historyNum; - assistant = assist; - string listUrl = string.Format("{0}000Admin/{1}", serverUrl, currentList.Keys[historyNum]); - wwwList = new WWW(listUrl); - EditorApplication.update += WaitList; - } - - static void WaitList() { - Wait(wwwList, WaitList, ParseList); - } + static void DownloadAssistant(string revision) + { + string version = currentList.Values[selected].Split(' ')[0]; + string ext = Application.platform == RuntimePlatform.WindowsEditor ? "exe" : "dmg"; + string url = string.Format(assistantUrl, revision, version, ext); + wwwAssistant = new WWW(url); + EditorApplication.update += WaitAssistant; + } - static void WaitHistory() { - Wait(wwwHistory, WaitHistory, FillMenu, CheckNewVersion); - } + static void DownloadHistory() + { + wwwHistory = new WWW(historyUrl); + EditorApplication.update += WaitHistory; + } - static void WaitAssistant() { - Wait(wwwAssistant, WaitAssistant, SaveAssistant); - } + static void DownloadList(int historyNum, bool assist = false) + { + selected = historyNum; + assistant = assist; + string listUrl = string.Format("{0}000Admin/{1}", serverUrl, currentList.Keys[historyNum]); + wwwList = new WWW(listUrl); + EditorApplication.update += WaitList; + } - static void SaveAssistant(WWW assistant) { - if(!Directory.Exists(tempDir)) { - Directory.CreateDirectory(tempDir); + static void WaitList() + { + Wait(wwwList, WaitList, ParseList); } - string name = Path.GetFileName(assistant.url); - string path = Path.Combine(tempDir, name); - File.WriteAllBytes(path, assistant.bytes); - if(Application.platform == RuntimePlatform.WindowsEditor) { - Application.OpenURL(path); + + static void WaitHistory() + { + Wait(wwwHistory, WaitHistory, FillMenu, CheckNewVersion); } - else { - StartAssistant(path); + + static void WaitAssistant() + { + Wait(wwwAssistant, WaitAssistant, SaveAssistant); } - } - static void StartAssistant(string path) { - string cmd = "hdiutil"; - string arg = string.Format("mount '{0}'", path); - try { - using(Process assist = new Process()) { - assist.StartInfo.FileName = cmd; - assist.StartInfo.Arguments = arg; - assist.StartInfo.WorkingDirectory = Path.GetDirectoryName(path); - assist.StartInfo.CreateNoWindow = true; - assist.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; - assist.Start(); + static void SaveAssistant(WWW assistant) + { + if (!Directory.Exists(tempDir)) + { + Directory.CreateDirectory(tempDir); + } + string name = Path.GetFileName(assistant.url); + string path = Path.Combine(tempDir, name); + File.WriteAllBytes(path, assistant.bytes); + if (Application.platform == RuntimePlatform.WindowsEditor) + { + Application.OpenURL(path); + } + else + { + StartAssistant(path); } } - catch(Exception e) { - Debug.LogErrorFormat("{0} {1}\n{2}", cmd, arg, e.Message); - } - } - static void Wait(WWW www, EditorApplication.CallbackFunction caller, Action action, Action done = null) { - if(www != null && www.isDone) { - EditorApplication.update -= caller; - if(string.IsNullOrEmpty(www.error) && www.bytesDownloaded > 0) { - //Debug.LogFormat("{0} kB: {1}", www.size/1024, www.url); - if(action != null) - action(www); - if(done != null) - done(); + static void StartAssistant(string path) + { + string cmd = "hdiutil"; + string arg = string.Format("mount '{0}'", path); + try + { + using (Process assist = new Process()) + { + assist.StartInfo.FileName = cmd; + assist.StartInfo.Arguments = arg; + assist.StartInfo.WorkingDirectory = Path.GetDirectoryName(path); + assist.StartInfo.CreateNoWindow = true; + assist.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; + assist.Start(); + } + } + catch (Exception e) + { + Debug.LogErrorFormat("{0} {1}\n{2}", cmd, arg, e.Message); } - else - Debug.LogWarningFormat("{0} {1}", www.url, www.error); - www = null; } - else { - if(www == null) + + static void Wait(WWW www, EditorApplication.CallbackFunction caller, Action action, Action done = null) + { + if (www != null && www.isDone) + { EditorApplication.update -= caller; + if (string.IsNullOrEmpty(www.error) && www.bytesDownloaded > 0) + { + //Debug.LogFormat("{0} kB: {1}", www.size/1024, www.url); + if (action != null) + action(www); + if (done != null) + done(); + } + else + Debug.LogWarningFormat("{0} {1}", www.url, www.error); + www = null; + } + else + { + if (www == null) + EditorApplication.update -= caller; + } } - } - static void ParseList(WWW list) { - string[] files = list.text.Split('\n'); - string[] parts; - for(int i = 0; i < files.Length; i++) { - parts = files[i].Split(','); - if(parts[0].Contains(extractedName)) { - string mergerUrl = string.Format("{0}{1}/{2}", serverUrl, parts[0].Trim('\"').Replace('\\', '/'), compressedName); - DownloadMerger(mergerUrl); - break; + static void ParseList(WWW list) + { + string[] files = list.text.Split('\n'); + string[] parts; + for (int i = 0; i < files.Length; i++) + { + parts = files[i].Split(','); + if (parts[0].Contains(extractedName)) + { + string mergerUrl = string.Format("{0}{1}/{2}", serverUrl, parts[0].Trim('\"').Replace('\\', '/'), compressedName); + DownloadMerger(mergerUrl); + break; + } } } - } - static void DownloadMerger(string mergerUrl) { - wwwMerger = new WWW(mergerUrl); - EditorApplication.update += WaitMerger; - } - - static void WaitMerger() { - Wait(wwwMerger, WaitMerger, SaveMerger); - } + static void DownloadMerger(string mergerUrl) + { + wwwMerger = new WWW(mergerUrl); + EditorApplication.update += WaitMerger; + } - static void SaveMerger(WWW merger) { - if(!Directory.Exists(tempDir)) { - Directory.CreateDirectory(tempDir); + static void WaitMerger() + { + Wait(wwwMerger, WaitMerger, SaveMerger); } - string path = Path.Combine(tempDir, compressedName); - //Debug.LogFormat("path: {0}", path); - File.WriteAllBytes(path, merger.bytes); - ExtractMerger(path); - } - static void ExtractMerger(string path) { - string zipPath = string.Format("{0}/Tools/{1}", EditorApplication.applicationContentsPath, zipName); - string arg = string.Format("e -y \"{0}\"", path); - try { - using(Process unzip = new Process()) { - unzip.StartInfo.FileName = zipPath; - unzip.StartInfo.Arguments = arg; - unzip.StartInfo.WorkingDirectory = Path.GetDirectoryName(path); - unzip.StartInfo.CreateNoWindow = true; - unzip.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; - unzip.Start(); - unzip.WaitForExit(); - SearchVersion(); + static void SaveMerger(WWW merger) + { + if (!Directory.Exists(tempDir)) + { + Directory.CreateDirectory(tempDir); } + string path = Path.Combine(tempDir, compressedName); + //Debug.LogFormat("path: {0}", path); + File.WriteAllBytes(path, merger.bytes); + ExtractMerger(path); } - catch(Exception e) { - Debug.LogErrorFormat("{0} {1}\n{2}", zipPath, arg, e.Message); + + static void ExtractMerger(string path) + { + string zipPath = string.Format("{0}/Tools/{1}", EditorApplication.applicationContentsPath, zipName); + string arg = string.Format("e -y \"{0}\"", path); + try + { + using (Process unzip = new Process()) + { + unzip.StartInfo.FileName = zipPath; + unzip.StartInfo.Arguments = arg; + unzip.StartInfo.WorkingDirectory = Path.GetDirectoryName(path); + unzip.StartInfo.CreateNoWindow = true; + unzip.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; + unzip.Start(); + unzip.WaitForExit(); + SearchVersion(); + } + } + catch (Exception e) + { + Debug.LogErrorFormat("{0} {1}\n{2}", zipPath, arg, e.Message); + } } - } - void DoToolbar() { - EditorGUILayout.BeginHorizontal("toolbar"); - GUILayout.FlexibleSpace(); - SearchGUI(); - EditorGUILayout.EndHorizontal(); - } + void DoToolbar() + { + EditorGUILayout.BeginHorizontal("toolbar"); + GUILayout.FlexibleSpace(); + SearchGUI(); + EditorGUILayout.EndHorizontal(); + } - void SearchGUI() { - string s = string.Empty; + void SearchGUI() + { + string s = string.Empty; - try { - var methods = typeof(EditorGUILayout).GetMethods(BindingFlags.NonPublic | BindingFlags.Static); + try + { + var methods = typeof(EditorGUILayout).GetMethods(BindingFlags.NonPublic | BindingFlags.Static); - for(var i = 0; i < methods.Length; i++) - if(methods[i].Name == "ToolbarSearchField" && methods[i].GetParameters().Length <= 2) { - s = (string)methods[i].Invoke(null, new object[] { search, null }); - break; - } - } - catch(Exception e) { - Debug.LogException(e); - s = EditorGUILayout.TextField(search, GUILayout.MaxWidth(minWidth + 56f)); - } + for (var i = 0; i < methods.Length; i++) + if (methods[i].Name == "ToolbarSearchField" && methods[i].GetParameters().Length <= 2) + { + s = (string)methods[i].Invoke(null, new object[] { search, null }); + break; + } + } + catch (Exception e) + { + Debug.LogException(e); + s = EditorGUILayout.TextField(search, GUILayout.MaxWidth(minWidth + 56f)); + } - if(s != search) { - search = s; - if(!string.IsNullOrEmpty(search)) { - sortedList = new SortedList(); - for(int i = fullList.Count - 1; i >= 0; i--) { - if(fullList.Values[i].Contains(search)) { - sortedList.Add(fullList.Keys[i], fullList.Values[i]); + if (s != search) + { + search = s; + if (!string.IsNullOrEmpty(search)) + { + sortedList = new SortedList(); + for (int i = fullList.Count - 1; i >= 0; i--) + { + if (fullList.Values[i].Contains(search)) + { + sortedList.Add(fullList.Keys[i], fullList.Values[i]); + } } + currentList = sortedList; } - currentList = sortedList; + else + currentList = fullList; } - else - currentList = fullList; } - } - void WaitGUI() { - GUILayout.BeginHorizontal(); - GUILayout.FlexibleSpace(); - GUILayout.Label("Wait..."); - GUILayout.FlexibleSpace(); - GUILayout.EndHorizontal(); + void WaitGUI() + { + GUILayout.BeginHorizontal(); + GUILayout.FlexibleSpace(); + GUILayout.Label("Wait..."); + GUILayout.FlexibleSpace(); + GUILayout.EndHorizontal(); + } } } \ No newline at end of file diff --git a/Assets/Scripts/Editor/SetPivot.cs b/Assets/Scripts/Editor/SetPivot.cs index 560c44e..33663ed 100644 --- a/Assets/Scripts/Editor/SetPivot.cs +++ b/Assets/Scripts/Editor/SetPivot.cs @@ -19,107 +19,134 @@ using UnityEngine; using UnityEditor; +namespace UnityLibrary +{ + public class SetPivot : EditorWindow + { -public class SetPivot : EditorWindow { - - Vector3 p; //Pivot value -1..1, calculated from Mesh bounds - Vector3 last_p; //Last used pivot - - GameObject obj; //Selected object in the Hierarchy - MeshFilter meshFilter; //Mesh Filter of the selected object - Mesh mesh; //Mesh of the selected object - Collider col; //Collider of the selected object - - bool pivotUnchanged; //Flag to decide when to instantiate a copy of the mesh - - [MenuItem ("GameObject/Set Pivot")] //Place the Set Pivot menu item in the GameObject menu - static void Init () { - SetPivot window = (SetPivot)EditorWindow.GetWindow (typeof (SetPivot)); - window.RecognizeSelectedObject(); //Initialize the variables by calling RecognizeSelectedObject on the class instance - window.Show (); + Vector3 p; //Pivot value -1..1, calculated from Mesh bounds + Vector3 last_p; //Last used pivot + + GameObject obj; //Selected object in the Hierarchy + MeshFilter meshFilter; //Mesh Filter of the selected object + Mesh mesh; //Mesh of the selected object + Collider col; //Collider of the selected object + + bool pivotUnchanged; //Flag to decide when to instantiate a copy of the mesh + + [MenuItem("GameObject/Set Pivot")] //Place the Set Pivot menu item in the GameObject menu + static void Init() + { + SetPivot window = (SetPivot)EditorWindow.GetWindow(typeof(SetPivot)); + window.RecognizeSelectedObject(); //Initialize the variables by calling RecognizeSelectedObject on the class instance + window.Show(); + } + + void OnGUI() + { + if (obj) + { + if (mesh) + { + p.x = EditorGUILayout.Slider("X", p.x, -1.0f, 1.0f); + p.y = EditorGUILayout.Slider("Y", p.y, -1.0f, 1.0f); + p.z = EditorGUILayout.Slider("Z", p.z, -1.0f, 1.0f); + if (p != last_p) + { //Detects user input on any of the three sliders + //Only create instance of mesh when user changes pivot + if (pivotUnchanged) mesh = meshFilter.mesh; pivotUnchanged = false; + UpdatePivot(); + last_p = p; + } + if (GUILayout.Button("Center")) + { //Set pivot to the center of the mesh bounds + //Only create instance of mesh when user changes pivot + if (pivotUnchanged) mesh = meshFilter.mesh; pivotUnchanged = false; + p = Vector3.zero; + UpdatePivot(); + last_p = p; + } + GUILayout.Label("Bounds " + mesh.bounds.ToString()); + } + else + { + GUILayout.Label("Selected object does not have a Mesh specified."); + } + } + else + { + GUILayout.Label("No object selected in Hierarchy."); + } + } + + //Achieve the movement of the pivot by moving the transform position in the specified direction + //and then moving all vertices of the mesh in the opposite direction back to where they were in world-space + void UpdatePivot() + { + Vector3 diff = Vector3.Scale(mesh.bounds.extents, last_p - p); //Calculate difference in 3d position + obj.transform.position -= Vector3.Scale(diff, obj.transform.localScale); //Move object position by taking localScale into account + //Iterate over all vertices and move them in the opposite direction of the object position movement + Vector3[] verts = mesh.vertices; + for (int i = 0; i < verts.Length; i++) + { + verts[i] += diff; + } + mesh.vertices = verts; //Assign the vertex array back to the mesh + mesh.RecalculateBounds(); //Recalculate bounds of the mesh, for the renderer's sake + //The 'center' parameter of certain colliders needs to be adjusted + //when the transform position is modified + if (col) + { + if (col is BoxCollider) + { + ((BoxCollider)col).center += diff; + } + else if (col is CapsuleCollider) + { + ((CapsuleCollider)col).center += diff; + } + else if (col is SphereCollider) + { + ((SphereCollider)col).center += diff; + } + } + } + + //Look at the object's transform position in comparison to the center of its mesh bounds + //and calculate the pivot values for xyz + void UpdatePivotVector() + { + Bounds b = mesh.bounds; + Vector3 offset = -1 * b.center; + p = last_p = new Vector3(offset.x / b.extents.x, offset.y / b.extents.y, offset.z / b.extents.z); + } + + //When a selection change notification is received + //recalculate the variables and references for the new object + void OnSelectionChange() + { + RecognizeSelectedObject(); + } + + //Gather references for the selected object and its components + //and update the pivot vector if the object has a Mesh specified + void RecognizeSelectedObject() + { + Transform t = Selection.activeTransform; + obj = t ? t.gameObject : null; + if (obj) + { + meshFilter = obj.GetComponent(typeof(MeshFilter)) as MeshFilter; + mesh = meshFilter ? meshFilter.sharedMesh : null; + if (mesh) + UpdatePivotVector(); + col = obj.GetComponent(typeof(Collider)) as Collider; + pivotUnchanged = true; + } + else + { + mesh = null; + } + } } - - void OnGUI() { - if(obj) { - if(mesh) { - p.x = EditorGUILayout.Slider("X", p.x, -1.0f, 1.0f); - p.y = EditorGUILayout.Slider("Y", p.y, -1.0f, 1.0f); - p.z = EditorGUILayout.Slider("Z", p.z, -1.0f, 1.0f); - if(p != last_p) { //Detects user input on any of the three sliders - //Only create instance of mesh when user changes pivot - if(pivotUnchanged) mesh = meshFilter.mesh; pivotUnchanged = false; - UpdatePivot(); - last_p = p; - } - if(GUILayout.Button("Center")) { //Set pivot to the center of the mesh bounds - //Only create instance of mesh when user changes pivot - if(pivotUnchanged) mesh = meshFilter.mesh; pivotUnchanged = false; - p = Vector3.zero; - UpdatePivot(); - last_p = p; - } - GUILayout.Label("Bounds " + mesh.bounds.ToString()); - } else { - GUILayout.Label("Selected object does not have a Mesh specified."); - } - } else { - GUILayout.Label("No object selected in Hierarchy."); - } - } - - //Achieve the movement of the pivot by moving the transform position in the specified direction - //and then moving all vertices of the mesh in the opposite direction back to where they were in world-space - void UpdatePivot() { - Vector3 diff = Vector3.Scale(mesh.bounds.extents, last_p - p); //Calculate difference in 3d position - obj.transform.position -= Vector3.Scale(diff, obj.transform.localScale); //Move object position by taking localScale into account - //Iterate over all vertices and move them in the opposite direction of the object position movement - Vector3[] verts = mesh.vertices; - for(int i=0; i -[RequireComponent(typeof(Canvas))] -public class CanvasScalerUtil : MonoBehaviour +namespace UnityLibrary { - [SerializeField] - private uint canvasWidth = 800; + [RequireComponent(typeof(Canvas))] + public class CanvasScalerUtil : MonoBehaviour + { + [SerializeField] + private uint canvasWidth = 800; - [SerializeField] - private uint canvasHeight = 600; + [SerializeField] + private uint canvasHeight = 600; - [SerializeField] - private float canvasWorldSizeInMeters = 1; + [SerializeField] + private float canvasWorldSizeInMeters = 1; - public uint CanvasWidth { get { return canvasWidth; } } - public uint CanvasHeight { get { return canvasHeight; } } - public float CanvasWorldSizeInMeters { get { return canvasWorldSizeInMeters; } } + public uint CanvasWidth { get { return canvasWidth; } } + public uint CanvasHeight { get { return canvasHeight; } } + public float CanvasWorldSizeInMeters { get { return canvasWorldSizeInMeters; } } - #region MonoBehaviour - private void Awake() - { - Debug.Log("CanvasScalerUtil has nothing to do with realtime logic"); - Destroy(this); + #region MonoBehaviour + private void Awake() + { + Debug.Log("CanvasScalerUtil has nothing to do with realtime logic"); + Destroy(this); + } + #endregion } - #endregion -} +} \ No newline at end of file diff --git a/Assets/Scripts/Editor/UI/CanvasScalerUtil/Editor/CanvasScalerUtilEditor.cs b/Assets/Scripts/Editor/UI/CanvasScalerUtil/Editor/CanvasScalerUtilEditor.cs index ff6f8e1..2ee9e8a 100644 --- a/Assets/Scripts/Editor/UI/CanvasScalerUtil/Editor/CanvasScalerUtilEditor.cs +++ b/Assets/Scripts/Editor/UI/CanvasScalerUtil/Editor/CanvasScalerUtilEditor.cs @@ -5,39 +5,42 @@ /// Author: Girts Kesteris 2017 /// Script to hastily create correct canvas scales. Logic handled at editor's side /// -[CustomEditor(typeof(CanvasScalerUtil))] -public class CanvasScalerUtilEditor : Editor +namespace UnityLibrary { - CanvasScalerUtil t; - - private void OnEnable() - { - t = (CanvasScalerUtil) target; - } - - public override void OnInspectorGUI() - { - base.OnInspectorGUI(); - if (GUILayout.Button("Scale Canvas")) ScaleCanvas(); - } - - private void ScaleCanvas() + [CustomEditor(typeof(CanvasScalerUtil))] + public class CanvasScalerUtilEditor : Editor { - Canvas canvas = t.GetComponent(); - RectTransform rectTransform = t.GetComponent(); + CanvasScalerUtil t; - Vector2 sizeDelta = new Vector2(t.CanvasWidth, t.CanvasHeight); - Vector3 scale = t.CanvasWorldSizeInMeters / t.CanvasWidth * Vector3.one; + private void OnEnable() + { + t = (CanvasScalerUtil)target; + } - if (canvas.renderMode != RenderMode.WorldSpace) + public override void OnInspectorGUI() { - Debug.Log("CanvasScalerUtil: Swiched to WorldSpace Render Mode from " + canvas.renderMode); - canvas.renderMode = RenderMode.WorldSpace; + base.OnInspectorGUI(); + if (GUILayout.Button("Scale Canvas")) ScaleCanvas(); } - Debug.LogFormat("CanvasScalerUtil: calculated sizeDelta: {0} scale: {1}", sizeDelta, scale); + private void ScaleCanvas() + { + Canvas canvas = t.GetComponent(); + RectTransform rectTransform = t.GetComponent(); + + Vector2 sizeDelta = new Vector2(t.CanvasWidth, t.CanvasHeight); + Vector3 scale = t.CanvasWorldSizeInMeters / t.CanvasWidth * Vector3.one; - rectTransform.sizeDelta = sizeDelta; - rectTransform.localScale = scale; + if (canvas.renderMode != RenderMode.WorldSpace) + { + Debug.Log("CanvasScalerUtil: Swiched to WorldSpace Render Mode from " + canvas.renderMode); + canvas.renderMode = RenderMode.WorldSpace; + } + + Debug.LogFormat("CanvasScalerUtil: calculated sizeDelta: {0} scale: {1}", sizeDelta, scale); + + rectTransform.sizeDelta = sizeDelta; + rectTransform.localScale = scale; + } } -} +} \ No newline at end of file diff --git a/Assets/Scripts/Helpers/DrawGLLine.cs b/Assets/Scripts/Helpers/DrawGLLine.cs index 5b2231e..d659766 100644 --- a/Assets/Scripts/Helpers/DrawGLLine.cs +++ b/Assets/Scripts/Helpers/DrawGLLine.cs @@ -2,51 +2,53 @@ // Draws lines with GL : https://docs.unity3d.com/ScriptReference/GL.html // Usage: Attach this script to gameobject in scene - -public class DrawGLLine : MonoBehaviour +namespace UnityLibrary { - public Color lineColor = Color.red; - - Material lineMaterial; - - void Awake() + public class DrawGLLine : MonoBehaviour { - // must be called before trying to draw lines.. - CreateLineMaterial(); - } - - void CreateLineMaterial() - { - // Unity has a built-in shader that is useful for drawing simple colored things - var shader = Shader.Find("Hidden/Internal-Colored"); - lineMaterial = new Material(shader); - lineMaterial.hideFlags = HideFlags.HideAndDontSave; - // Turn on alpha blending - lineMaterial.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha); - lineMaterial.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha); - // Turn backface culling off - lineMaterial.SetInt("_Cull", (int)UnityEngine.Rendering.CullMode.Off); - // Turn off depth writes - lineMaterial.SetInt("_ZWrite", 0); - } - - - // cannot call this on update, line wont be visible then.. and if used OnPostRender() thats works when attached to camera only - void OnRenderObject() - { - lineMaterial.SetPass(0); - - GL.PushMatrix(); - GL.MultMatrix(transform.localToWorldMatrix); - - GL.Begin(GL.LINES); - GL.Color(lineColor); - // start line from transform position - GL.Vertex(transform.position); - // end line 100 units forward from transform position - GL.Vertex(transform.position + transform.forward * 100); - - GL.End(); - GL.PopMatrix(); + public Color lineColor = Color.red; + + Material lineMaterial; + + void Awake() + { + // must be called before trying to draw lines.. + CreateLineMaterial(); + } + + void CreateLineMaterial() + { + // Unity has a built-in shader that is useful for drawing simple colored things + var shader = Shader.Find("Hidden/Internal-Colored"); + lineMaterial = new Material(shader); + lineMaterial.hideFlags = HideFlags.HideAndDontSave; + // Turn on alpha blending + lineMaterial.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha); + lineMaterial.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha); + // Turn backface culling off + lineMaterial.SetInt("_Cull", (int)UnityEngine.Rendering.CullMode.Off); + // Turn off depth writes + lineMaterial.SetInt("_ZWrite", 0); + } + + + // cannot call this on update, line wont be visible then.. and if used OnPostRender() thats works when attached to camera only + void OnRenderObject() + { + lineMaterial.SetPass(0); + + GL.PushMatrix(); + GL.MultMatrix(transform.localToWorldMatrix); + + GL.Begin(GL.LINES); + GL.Color(lineColor); + // start line from transform position + GL.Vertex(transform.position); + // end line 100 units forward from transform position + GL.Vertex(transform.position + transform.forward * 100); + + GL.End(); + GL.PopMatrix(); + } } -} +} \ No newline at end of file diff --git a/Assets/Scripts/Helpers/DrawRendererBounds.cs b/Assets/Scripts/Helpers/DrawRendererBounds.cs index b2320c4..627112c 100644 --- a/Assets/Scripts/Helpers/DrawRendererBounds.cs +++ b/Assets/Scripts/Helpers/DrawRendererBounds.cs @@ -1,47 +1,49 @@ using UnityEngine; // draws mesh renderer bounding box using Debug.Drawline - -public class DrawRendererBounds : MonoBehaviour +namespace UnityLibrary { - MeshRenderer meshRenderer; - - void Awake() - { - meshRenderer = GetComponent(); - } - - - void Update() + public class DrawRendererBounds : MonoBehaviour { - var b = meshRenderer.bounds; - - // bottom - var p1 = new Vector3(b.min.x, b.min.y, b.min.z); - var p2 = new Vector3(b.max.x, b.min.y, b.min.z); - var p3 = new Vector3(b.max.x, b.min.y, b.max.z); - var p4 = new Vector3(b.min.x, b.min.y, b.max.z); - - Debug.DrawLine(p1, p2, Color.blue); - Debug.DrawLine(p2, p3, Color.red); - Debug.DrawLine(p3, p4, Color.yellow); - Debug.DrawLine(p4, p1, Color.magenta); - - // top - var p5 = new Vector3(b.min.x, b.max.y, b.min.z); - var p6 = new Vector3(b.max.x, b.max.y, b.min.z); - var p7 = new Vector3(b.max.x, b.max.y, b.max.z); - var p8 = new Vector3(b.min.x, b.max.y, b.max.z); - - Debug.DrawLine(p5, p6, Color.blue); - Debug.DrawLine(p6, p7, Color.red); - Debug.DrawLine(p7, p8, Color.yellow); - Debug.DrawLine(p8, p5, Color.magenta); - - // sides - Debug.DrawLine(p1, p5, Color.white); - Debug.DrawLine(p2, p6, Color.gray); - Debug.DrawLine(p3, p7, Color.green); - Debug.DrawLine(p4, p8, Color.cyan); + MeshRenderer meshRenderer; + + void Awake() + { + meshRenderer = GetComponent(); + } + + + void Update() + { + var b = meshRenderer.bounds; + + // bottom + var p1 = new Vector3(b.min.x, b.min.y, b.min.z); + var p2 = new Vector3(b.max.x, b.min.y, b.min.z); + var p3 = new Vector3(b.max.x, b.min.y, b.max.z); + var p4 = new Vector3(b.min.x, b.min.y, b.max.z); + + Debug.DrawLine(p1, p2, Color.blue); + Debug.DrawLine(p2, p3, Color.red); + Debug.DrawLine(p3, p4, Color.yellow); + Debug.DrawLine(p4, p1, Color.magenta); + + // top + var p5 = new Vector3(b.min.x, b.max.y, b.min.z); + var p6 = new Vector3(b.max.x, b.max.y, b.min.z); + var p7 = new Vector3(b.max.x, b.max.y, b.max.z); + var p8 = new Vector3(b.min.x, b.max.y, b.max.z); + + Debug.DrawLine(p5, p6, Color.blue); + Debug.DrawLine(p6, p7, Color.red); + Debug.DrawLine(p7, p8, Color.yellow); + Debug.DrawLine(p8, p5, Color.magenta); + + // sides + Debug.DrawLine(p1, p5, Color.white); + Debug.DrawLine(p2, p6, Color.gray); + Debug.DrawLine(p3, p7, Color.green); + Debug.DrawLine(p4, p8, Color.cyan); + } } } diff --git a/Assets/Scripts/Helpers/Drawing/DrawCrossHair.cs b/Assets/Scripts/Helpers/Drawing/DrawCrossHair.cs index 69d052a..66df970 100644 --- a/Assets/Scripts/Helpers/Drawing/DrawCrossHair.cs +++ b/Assets/Scripts/Helpers/Drawing/DrawCrossHair.cs @@ -3,42 +3,44 @@ // Draws crosshair to mouseposition with GL.Lines, takes line length in pixels // Usage: Attach this script to Main Camera, Assign material (for example some particle shader) - -public class DrawCrossHair : MonoBehaviour +namespace UnityLibrary { - public Material mat; - public float lineLen = 5f; // in pixels + public class DrawCrossHair : MonoBehaviour + { + public Material mat; + public float lineLen = 5f; // in pixels - Vector3 mousePos; - float lineLenHorizontal; - float lineLenVertical; + Vector3 mousePos; + float lineLenHorizontal; + float lineLenVertical; - void Awake() - { - // if you want to adjust lineLen at runtime, would need to calculate these again - lineLenHorizontal = lineLen / Screen.width; - lineLenVertical = lineLen/Screen.height; - } + void Awake() + { + // if you want to adjust lineLen at runtime, would need to calculate these again + lineLenHorizontal = lineLen / Screen.width; + lineLenVertical = lineLen / Screen.height; + } - void Update() - { - mousePos = Input.mousePosition; - mousePos.x /= Screen.width; - mousePos.y /= Screen.height; - } + void Update() + { + mousePos = Input.mousePosition; + mousePos.x /= Screen.width; + mousePos.y /= Screen.height; + } - void OnPostRender() - { - GL.PushMatrix(); - mat.SetPass(0); - GL.LoadOrtho(); - GL.Begin(GL.LINES); - GL.Color(Color.white); - GL.Vertex(new Vector3(mousePos.x, mousePos.y - lineLenVertical, 0)); - GL.Vertex(new Vector3(mousePos.x, mousePos.y + lineLenVertical, 0)); - GL.Vertex(new Vector3(mousePos.x - lineLenHorizontal, mousePos.y, 0)); - GL.Vertex(new Vector3(mousePos.x + lineLenHorizontal, mousePos.y, 0)); - GL.End(); - GL.PopMatrix(); + void OnPostRender() + { + GL.PushMatrix(); + mat.SetPass(0); + GL.LoadOrtho(); + GL.Begin(GL.LINES); + GL.Color(Color.white); + GL.Vertex(new Vector3(mousePos.x, mousePos.y - lineLenVertical, 0)); + GL.Vertex(new Vector3(mousePos.x, mousePos.y + lineLenVertical, 0)); + GL.Vertex(new Vector3(mousePos.x - lineLenHorizontal, mousePos.y, 0)); + GL.Vertex(new Vector3(mousePos.x + lineLenHorizontal, mousePos.y, 0)); + GL.End(); + GL.PopMatrix(); + } } -} +} \ No newline at end of file diff --git a/Assets/Scripts/Helpers/FPSCounter.cs b/Assets/Scripts/Helpers/FPSCounter.cs index 508aca7..e140cb2 100644 --- a/Assets/Scripts/Helpers/FPSCounter.cs +++ b/Assets/Scripts/Helpers/FPSCounter.cs @@ -1,42 +1,44 @@ using UnityEngine; - -public class FPSCounter : MonoBehaviour +namespace UnityLibrary { - [SerializeField] - private float updateInterval = 0.1f; - - private float accum = 0.0f; - private int frames = 0; - private float timeleft; + public class FPSCounter : MonoBehaviour + { + [SerializeField] + private float updateInterval = 0.1f; - int qty; + private float accum = 0.0f; + private int frames = 0; + private float timeleft; - float fps; - float avgFps; + int qty; - void Update() - { - timeleft -= Time.deltaTime; - accum += Time.timeScale / Time.deltaTime; - ++frames; + float fps; + float avgFps; - if (timeleft <= 0.0) + void Update() { - fps = (accum / frames); - timeleft = updateInterval; - accum = 0f; - frames = 0; - } + timeleft -= Time.deltaTime; + accum += Time.timeScale / Time.deltaTime; + ++frames; - qty++; + if (timeleft <= 0.0) + { + fps = (accum / frames); + timeleft = updateInterval; + accum = 0f; + frames = 0; + } - avgFps += (fps - avgFps) / qty; - } + qty++; - void OnGUI() - { - GUI.Label(new Rect(Screen.width - 150, 0, 150, 20), "FPS: " + fps.ToString("f2")); - GUI.Label(new Rect(Screen.width - 150, 20, 150, 20), "Avg FPS: " + avgFps.ToString("f2")); - } + avgFps += (fps - avgFps) / qty; + } + + void OnGUI() + { + GUI.Label(new Rect(Screen.width - 150, 0, 150, 20), "FPS: " + fps.ToString("f2")); + GUI.Label(new Rect(Screen.width - 150, 20, 150, 20), "Avg FPS: " + avgFps.ToString("f2")); + } + } } diff --git a/Assets/Scripts/Helpers/FileSystem/OpenExternalFile.cs b/Assets/Scripts/Helpers/FileSystem/OpenExternalFile.cs index ea8d651..bb2b0bd 100644 --- a/Assets/Scripts/Helpers/FileSystem/OpenExternalFile.cs +++ b/Assets/Scripts/Helpers/FileSystem/OpenExternalFile.cs @@ -7,28 +7,30 @@ using System.Diagnostics; using System; using Debug = UnityEngine.Debug; - -public class OpenExternalFile : MonoBehaviour +namespace UnityLibrary { - - // opens external file in default viewer - public static void OpenFile(string fullPath) + public class OpenExternalFile : MonoBehaviour { - Debug.Log("opening:" + fullPath); - if (File.Exists(fullPath)) + // opens external file in default viewer + public static void OpenFile(string fullPath) { - try - { - Process myProcess = new Process(); - myProcess.StartInfo.FileName = fullPath; - myProcess.Start(); - // myProcess.WaitForExit(); - } - catch (Exception e) + Debug.Log("opening:" + fullPath); + + if (File.Exists(fullPath)) { - Debug.Log(e); + try + { + Process myProcess = new Process(); + myProcess.StartInfo.FileName = fullPath; + myProcess.Start(); + // myProcess.WaitForExit(); + } + catch (Exception e) + { + Debug.Log(e); + } } } } -} +} \ No newline at end of file diff --git a/Assets/Scripts/Helpers/Screenshot/GrabDesktop.cs b/Assets/Scripts/Helpers/Screenshot/GrabDesktop.cs index 51cc65f..75af304 100644 --- a/Assets/Scripts/Helpers/Screenshot/GrabDesktop.cs +++ b/Assets/Scripts/Helpers/Screenshot/GrabDesktop.cs @@ -20,6 +20,7 @@ //using System.Windows.Forms.Screen; //using System.Drawing; //using System.Drawing.Imaging; +namespace UnityLibrary{ public class GrabDesktop : MonoBehaviour { [DllImport("kernel32", SetLastError = true)] @@ -52,4 +53,5 @@ private void Start() } } +} */ diff --git a/Assets/Scripts/Helpers/Version/GetVersion.cs b/Assets/Scripts/Helpers/Version/GetVersion.cs index 2016346..1803923 100644 --- a/Assets/Scripts/Helpers/Version/GetVersion.cs +++ b/Assets/Scripts/Helpers/Version/GetVersion.cs @@ -3,15 +3,17 @@ // Usage: attach this to UI Text component // it displays current version number from Ios/Android player settings with Application.version - -public class GetVersion : MonoBehaviour +namespace UnityLibrary { - void Awake() + public class GetVersion : MonoBehaviour { - var t = GetComponent(); - if (t!=null) + void Awake() { - t.text = "v"+Application.version; + var t = GetComponent(); + if (t != null) + { + t.text = "v" + Application.version; + } } } -} +} \ No newline at end of file diff --git a/Assets/Scripts/Misc/Messaging/Messenger.cs b/Assets/Scripts/Misc/Messaging/Messenger.cs index db4fe16..41759f9 100644 --- a/Assets/Scripts/Misc/Messaging/Messenger.cs +++ b/Assets/Scripts/Misc/Messaging/Messenger.cs @@ -1,195 +1,254 @@ using System; using System.Collections.Generic; - -public enum MessengerMode { - DONT_REQUIRE_LISTENER, - REQUIRE_LISTENER, -} - -static internal class MessengerInternal { - static public Dictionary eventTable = new Dictionary(); - static public readonly MessengerMode DEFAULT_MODE = MessengerMode.REQUIRE_LISTENER; - - static public void OnListenerAdding(string eventType, Delegate listenerBeingAdded) { - if (!eventTable.ContainsKey(eventType)) { - eventTable.Add(eventType, null); - } - - Delegate d = eventTable[eventType]; - if (d != null && d.GetType() != listenerBeingAdded.GetType()) { - throw new ListenerException(string.Format("Attempting to add listener with inconsistent signature for event type {0}. Current listeners have type {1} and listener being added has type {2}", eventType, d.GetType().Name, listenerBeingAdded.GetType().Name)); - } - } - - static public void OnListenerRemoving(string eventType, Delegate listenerBeingRemoved) { - if (eventTable.ContainsKey(eventType)) { - Delegate d = eventTable[eventType]; - - if (d == null) { - throw new ListenerException(string.Format("Attempting to remove listener with for event type {0} but current listener is null.", eventType)); - } else if (d.GetType() != listenerBeingRemoved.GetType()) { - throw new ListenerException(string.Format("Attempting to remove listener with inconsistent signature for event type {0}. Current listeners have type {1} and listener being removed has type {2}", eventType, d.GetType().Name, listenerBeingRemoved.GetType().Name)); - } - } else { - throw new ListenerException(string.Format("Attempting to remove listener for type {0} but Messenger doesn't know about this event type.", eventType)); - } - } - - static public void OnListenerRemoved(string eventType) { - if (eventTable[eventType] == null) { - eventTable.Remove(eventType); - } - } - - static public void OnBroadcasting(string eventType, MessengerMode mode) { - if (mode == MessengerMode.REQUIRE_LISTENER && !eventTable.ContainsKey(eventType)) { - throw new MessengerInternal.BroadcastException(string.Format("Broadcasting message {0} but no listener found.", eventType)); - } - } - - static public BroadcastException CreateBroadcastSignatureException(string eventType) { - return new BroadcastException(string.Format("Broadcasting message {0} but listeners have a different signature than the broadcaster.", eventType)); - } - - public class BroadcastException : Exception { - public BroadcastException(string msg) - : base(msg) { - } - } - - public class ListenerException : Exception { - public ListenerException(string msg) - : base(msg) { - } - } -} - - -static public class Messenger { - private static Dictionary eventTable = MessengerInternal.eventTable; - - static public void AddListener(string eventType, Callback handler) { - MessengerInternal.OnListenerAdding(eventType, handler); - eventTable[eventType] = (Callback)eventTable[eventType] + handler; - } - - static public void RemoveListener(string eventType, Callback handler) { - MessengerInternal.OnListenerRemoving(eventType, handler); - eventTable[eventType] = (Callback)eventTable[eventType] - handler; - MessengerInternal.OnListenerRemoved(eventType); - } - - static public void Broadcast(string eventType) { - Broadcast(eventType, MessengerInternal.DEFAULT_MODE); - } - - static public void Broadcast(string eventType, MessengerMode mode) { - MessengerInternal.OnBroadcasting(eventType, mode); - Delegate d; - if (eventTable.TryGetValue(eventType, out d)) { - Callback callback = d as Callback; - if (callback != null) { - callback(); - } else { - throw MessengerInternal.CreateBroadcastSignatureException(eventType); - } - } - } -} - - -static public class Messenger { - private static Dictionary eventTable = MessengerInternal.eventTable; - - static public void AddListener(string eventType, Callback handler) { - MessengerInternal.OnListenerAdding(eventType, handler); - eventTable[eventType] = (Callback)eventTable[eventType] + handler; - } - - static public void RemoveListener(string eventType, Callback handler) { - MessengerInternal.OnListenerRemoving(eventType, handler); - eventTable[eventType] = (Callback)eventTable[eventType] - handler; - MessengerInternal.OnListenerRemoved(eventType); - } - - static public void Broadcast(string eventType, T arg1) { - Broadcast(eventType, arg1, MessengerInternal.DEFAULT_MODE); - } - - static public void Broadcast(string eventType, T arg1, MessengerMode mode) { - MessengerInternal.OnBroadcasting(eventType, mode); - Delegate d; - if (eventTable.TryGetValue(eventType, out d)) { - Callback callback = d as Callback; - if (callback != null) { - callback(arg1); - } else { - throw MessengerInternal.CreateBroadcastSignatureException(eventType); - } - } - } -} - -static public class Messenger { - private static Dictionary eventTable = MessengerInternal.eventTable; - - static public void AddListener(string eventType, Callback handler) { - MessengerInternal.OnListenerAdding(eventType, handler); - eventTable[eventType] = (Callback)eventTable[eventType] + handler; - } - - static public void RemoveListener(string eventType, Callback handler) { - MessengerInternal.OnListenerRemoving(eventType, handler); - eventTable[eventType] = (Callback)eventTable[eventType] - handler; - MessengerInternal.OnListenerRemoved(eventType); - } - - static public void Broadcast(string eventType, T arg1, U arg2) { - Broadcast(eventType, arg1, arg2, MessengerInternal.DEFAULT_MODE); - } - - static public void Broadcast(string eventType, T arg1, U arg2, MessengerMode mode) { - MessengerInternal.OnBroadcasting(eventType, mode); - Delegate d; - if (eventTable.TryGetValue(eventType, out d)) { - Callback callback = d as Callback; - if (callback != null) { - callback(arg1, arg2); - } else { - throw MessengerInternal.CreateBroadcastSignatureException(eventType); - } - } - } -} - -static public class Messenger { - private static Dictionary eventTable = MessengerInternal.eventTable; - - static public void AddListener(string eventType, Callback handler) { - MessengerInternal.OnListenerAdding(eventType, handler); - eventTable[eventType] = (Callback)eventTable[eventType] + handler; - } - - static public void RemoveListener(string eventType, Callback handler) { - MessengerInternal.OnListenerRemoving(eventType, handler); - eventTable[eventType] = (Callback)eventTable[eventType] - handler; - MessengerInternal.OnListenerRemoved(eventType); - } - - static public void Broadcast(string eventType, T arg1, U arg2, V arg3) { - Broadcast(eventType, arg1, arg2, arg3, MessengerInternal.DEFAULT_MODE); - } - - static public void Broadcast(string eventType, T arg1, U arg2, V arg3, MessengerMode mode) { - MessengerInternal.OnBroadcasting(eventType, mode); - Delegate d; - if (eventTable.TryGetValue(eventType, out d)) { - Callback callback = d as Callback; - if (callback != null) { - callback(arg1, arg2, arg3); - } else { - throw MessengerInternal.CreateBroadcastSignatureException(eventType); - } - } - } +namespace UnityLibrary +{ + public enum MessengerMode + { + DONT_REQUIRE_LISTENER, + REQUIRE_LISTENER, + } + + static internal class MessengerInternal + { + static public Dictionary eventTable = new Dictionary(); + static public readonly MessengerMode DEFAULT_MODE = MessengerMode.REQUIRE_LISTENER; + + static public void OnListenerAdding(string eventType, Delegate listenerBeingAdded) + { + if (!eventTable.ContainsKey(eventType)) + { + eventTable.Add(eventType, null); + } + + Delegate d = eventTable[eventType]; + if (d != null && d.GetType() != listenerBeingAdded.GetType()) + { + throw new ListenerException(string.Format("Attempting to add listener with inconsistent signature for event type {0}. Current listeners have type {1} and listener being added has type {2}", eventType, d.GetType().Name, listenerBeingAdded.GetType().Name)); + } + } + + static public void OnListenerRemoving(string eventType, Delegate listenerBeingRemoved) + { + if (eventTable.ContainsKey(eventType)) + { + Delegate d = eventTable[eventType]; + + if (d == null) + { + throw new ListenerException(string.Format("Attempting to remove listener with for event type {0} but current listener is null.", eventType)); + } + else if (d.GetType() != listenerBeingRemoved.GetType()) + { + throw new ListenerException(string.Format("Attempting to remove listener with inconsistent signature for event type {0}. Current listeners have type {1} and listener being removed has type {2}", eventType, d.GetType().Name, listenerBeingRemoved.GetType().Name)); + } + } + else + { + throw new ListenerException(string.Format("Attempting to remove listener for type {0} but Messenger doesn't know about this event type.", eventType)); + } + } + + static public void OnListenerRemoved(string eventType) + { + if (eventTable[eventType] == null) + { + eventTable.Remove(eventType); + } + } + + static public void OnBroadcasting(string eventType, MessengerMode mode) + { + if (mode == MessengerMode.REQUIRE_LISTENER && !eventTable.ContainsKey(eventType)) + { + throw new MessengerInternal.BroadcastException(string.Format("Broadcasting message {0} but no listener found.", eventType)); + } + } + + static public BroadcastException CreateBroadcastSignatureException(string eventType) + { + return new BroadcastException(string.Format("Broadcasting message {0} but listeners have a different signature than the broadcaster.", eventType)); + } + + public class BroadcastException : Exception + { + public BroadcastException(string msg) + : base(msg) + { + } + } + + public class ListenerException : Exception + { + public ListenerException(string msg) + : base(msg) + { + } + } + } + + + static public class Messenger + { + private static Dictionary eventTable = MessengerInternal.eventTable; + + static public void AddListener(string eventType, Callback handler) + { + MessengerInternal.OnListenerAdding(eventType, handler); + eventTable[eventType] = (Callback)eventTable[eventType] + handler; + } + + static public void RemoveListener(string eventType, Callback handler) + { + MessengerInternal.OnListenerRemoving(eventType, handler); + eventTable[eventType] = (Callback)eventTable[eventType] - handler; + MessengerInternal.OnListenerRemoved(eventType); + } + + static public void Broadcast(string eventType) + { + Broadcast(eventType, MessengerInternal.DEFAULT_MODE); + } + + static public void Broadcast(string eventType, MessengerMode mode) + { + MessengerInternal.OnBroadcasting(eventType, mode); + Delegate d; + if (eventTable.TryGetValue(eventType, out d)) + { + Callback callback = d as Callback; + if (callback != null) + { + callback(); + } + else + { + throw MessengerInternal.CreateBroadcastSignatureException(eventType); + } + } + } + } + + + static public class Messenger + { + private static Dictionary eventTable = MessengerInternal.eventTable; + + static public void AddListener(string eventType, Callback handler) + { + MessengerInternal.OnListenerAdding(eventType, handler); + eventTable[eventType] = (Callback)eventTable[eventType] + handler; + } + + static public void RemoveListener(string eventType, Callback handler) + { + MessengerInternal.OnListenerRemoving(eventType, handler); + eventTable[eventType] = (Callback)eventTable[eventType] - handler; + MessengerInternal.OnListenerRemoved(eventType); + } + + static public void Broadcast(string eventType, T arg1) + { + Broadcast(eventType, arg1, MessengerInternal.DEFAULT_MODE); + } + + static public void Broadcast(string eventType, T arg1, MessengerMode mode) + { + MessengerInternal.OnBroadcasting(eventType, mode); + Delegate d; + if (eventTable.TryGetValue(eventType, out d)) + { + Callback callback = d as Callback; + if (callback != null) + { + callback(arg1); + } + else + { + throw MessengerInternal.CreateBroadcastSignatureException(eventType); + } + } + } + } + + static public class Messenger + { + private static Dictionary eventTable = MessengerInternal.eventTable; + + static public void AddListener(string eventType, Callback handler) + { + MessengerInternal.OnListenerAdding(eventType, handler); + eventTable[eventType] = (Callback)eventTable[eventType] + handler; + } + + static public void RemoveListener(string eventType, Callback handler) + { + MessengerInternal.OnListenerRemoving(eventType, handler); + eventTable[eventType] = (Callback)eventTable[eventType] - handler; + MessengerInternal.OnListenerRemoved(eventType); + } + + static public void Broadcast(string eventType, T arg1, U arg2) + { + Broadcast(eventType, arg1, arg2, MessengerInternal.DEFAULT_MODE); + } + + static public void Broadcast(string eventType, T arg1, U arg2, MessengerMode mode) + { + MessengerInternal.OnBroadcasting(eventType, mode); + Delegate d; + if (eventTable.TryGetValue(eventType, out d)) + { + Callback callback = d as Callback; + if (callback != null) + { + callback(arg1, arg2); + } + else + { + throw MessengerInternal.CreateBroadcastSignatureException(eventType); + } + } + } + } + + static public class Messenger + { + private static Dictionary eventTable = MessengerInternal.eventTable; + + static public void AddListener(string eventType, Callback handler) + { + MessengerInternal.OnListenerAdding(eventType, handler); + eventTable[eventType] = (Callback)eventTable[eventType] + handler; + } + + static public void RemoveListener(string eventType, Callback handler) + { + MessengerInternal.OnListenerRemoving(eventType, handler); + eventTable[eventType] = (Callback)eventTable[eventType] - handler; + MessengerInternal.OnListenerRemoved(eventType); + } + + static public void Broadcast(string eventType, T arg1, U arg2, V arg3) + { + Broadcast(eventType, arg1, arg2, arg3, MessengerInternal.DEFAULT_MODE); + } + + static public void Broadcast(string eventType, T arg1, U arg2, V arg3, MessengerMode mode) + { + MessengerInternal.OnBroadcasting(eventType, mode); + Delegate d; + if (eventTable.TryGetValue(eventType, out d)) + { + Callback callback = d as Callback; + if (callback != null) + { + callback(arg1, arg2, arg3); + } + else + { + throw MessengerInternal.CreateBroadcastSignatureException(eventType); + } + } + } + } } \ No newline at end of file diff --git a/Assets/Scripts/Misc/Messaging/MessengerUnitTest.cs b/Assets/Scripts/Misc/Messaging/MessengerUnitTest.cs index 3425eb2..8ad484e 100644 --- a/Assets/Scripts/Misc/Messaging/MessengerUnitTest.cs +++ b/Assets/Scripts/Misc/Messaging/MessengerUnitTest.cs @@ -6,127 +6,154 @@ // A lot of attention is paid to proper exception throwing from the Messenger. using System; - -class MessengerUnitTest { - - private readonly string eventType1 = "__testEvent1"; - private readonly string eventType2 = "__testEvent2"; - - bool wasCalled = false; - - public void RunTest() { - RunAddTests(); - RunBroadcastTests(); - RunRemoveTests(); - Console.Out.WriteLine("All Messenger tests passed."); - } - - - private void RunAddTests() { - Messenger.AddListener(eventType1, TestCallback); - - try { - // This should fail because we're adding a new event listener for same event type but a different delegate signature - Messenger.AddListener(eventType1, TestCallbackFloat); - throw new Exception("Unit test failure - expected a ListenerException"); - } catch (MessengerInternal.ListenerException e) { - // All good - } - - Messenger.AddListener(eventType2, TestCallbackFloat); - } - - - private void RunBroadcastTests() { - wasCalled = false; - Messenger.Broadcast(eventType1); - if (!wasCalled) { throw new Exception("Unit test failure - event handler appears to have not been called."); } - wasCalled = false; - Messenger.Broadcast(eventType2, 1.0f); - if (!wasCalled) { throw new Exception("Unit test failure - event handler appears to have not been called."); } - - // No listener should exist for this event, but we don't require a listener so it should pass - Messenger.Broadcast(eventType2 + "_", 1.0f, MessengerMode.DONT_REQUIRE_LISTENER); - - try { - // Broadcasting for an event there exists listeners for, but using wrong signature - Messenger.Broadcast(eventType1, 1.0f, MessengerMode.DONT_REQUIRE_LISTENER); - throw new Exception("Unit test failure - expected a BroadcastException"); - } - catch (MessengerInternal.BroadcastException e) { - // All good - } - - try { - // Same thing, but now we (implicitly) require at least one listener - Messenger.Broadcast(eventType2 + "_", 1.0f); - throw new Exception("Unit test failure - expected a BroadcastException"); - } catch (MessengerInternal.BroadcastException e) { - // All good - } - - try { - // Wrong generic type for this broadcast, and we implicitly require a listener - Messenger.Broadcast(eventType2, 1.0); - throw new Exception("Unit test failure - expected a BroadcastException"); - } catch (MessengerInternal.BroadcastException e) { - // All good - } - - } - - - private void RunRemoveTests() { - - try { - // Removal with wrong signature should fail - Messenger.RemoveListener(eventType1, TestCallbackFloat); - throw new Exception("Unit test failure - expected a ListenerException"); - } - catch (MessengerInternal.ListenerException e) { - // All good - } - - Messenger.RemoveListener(eventType1, TestCallback); - - try { - // Repeated removal should fail - Messenger.RemoveListener(eventType1, TestCallback); - throw new Exception("Unit test failure - expected a ListenerException"); - } - catch (MessengerInternal.ListenerException e) { - // All good - } - - - - Messenger.RemoveListener(eventType2, TestCallbackFloat); - - try { - // Repeated removal should fail - Messenger.RemoveListener(eventType2, TestCallbackFloat); - throw new Exception("Unit test failure - expected a ListenerException"); - } - catch (MessengerInternal.ListenerException e) { - // All good - } - } - - - void TestCallback() { - wasCalled = true; - Console.Out.WriteLine("TestCallback() was called."); - } - - void TestCallbackFloat(float f) { - wasCalled = true; - Console.Out.WriteLine("TestCallbackFloat(float) was called."); - - if (f != 1.0f) { - throw new Exception("Unit test failure - wrong value on float argument"); - } - } - - - +namespace UnityLibrary +{ + class MessengerUnitTest + { + + private readonly string eventType1 = "__testEvent1"; + private readonly string eventType2 = "__testEvent2"; + + bool wasCalled = false; + + public void RunTest() + { + RunAddTests(); + RunBroadcastTests(); + RunRemoveTests(); + Console.Out.WriteLine("All Messenger tests passed."); + } + + + private void RunAddTests() + { + Messenger.AddListener(eventType1, TestCallback); + + try + { + // This should fail because we're adding a new event listener for same event type but a different delegate signature + Messenger.AddListener(eventType1, TestCallbackFloat); + throw new Exception("Unit test failure - expected a ListenerException"); + } + catch (MessengerInternal.ListenerException e) + { + // All good + } + + Messenger.AddListener(eventType2, TestCallbackFloat); + } + + + private void RunBroadcastTests() + { + wasCalled = false; + Messenger.Broadcast(eventType1); + if (!wasCalled) { throw new Exception("Unit test failure - event handler appears to have not been called."); } + wasCalled = false; + Messenger.Broadcast(eventType2, 1.0f); + if (!wasCalled) { throw new Exception("Unit test failure - event handler appears to have not been called."); } + + // No listener should exist for this event, but we don't require a listener so it should pass + Messenger.Broadcast(eventType2 + "_", 1.0f, MessengerMode.DONT_REQUIRE_LISTENER); + + try + { + // Broadcasting for an event there exists listeners for, but using wrong signature + Messenger.Broadcast(eventType1, 1.0f, MessengerMode.DONT_REQUIRE_LISTENER); + throw new Exception("Unit test failure - expected a BroadcastException"); + } + catch (MessengerInternal.BroadcastException e) + { + // All good + } + + try + { + // Same thing, but now we (implicitly) require at least one listener + Messenger.Broadcast(eventType2 + "_", 1.0f); + throw new Exception("Unit test failure - expected a BroadcastException"); + } + catch (MessengerInternal.BroadcastException e) + { + // All good + } + + try + { + // Wrong generic type for this broadcast, and we implicitly require a listener + Messenger.Broadcast(eventType2, 1.0); + throw new Exception("Unit test failure - expected a BroadcastException"); + } + catch (MessengerInternal.BroadcastException e) + { + // All good + } + + } + + + private void RunRemoveTests() + { + + try + { + // Removal with wrong signature should fail + Messenger.RemoveListener(eventType1, TestCallbackFloat); + throw new Exception("Unit test failure - expected a ListenerException"); + } + catch (MessengerInternal.ListenerException e) + { + // All good + } + + Messenger.RemoveListener(eventType1, TestCallback); + + try + { + // Repeated removal should fail + Messenger.RemoveListener(eventType1, TestCallback); + throw new Exception("Unit test failure - expected a ListenerException"); + } + catch (MessengerInternal.ListenerException e) + { + // All good + } + + + + Messenger.RemoveListener(eventType2, TestCallbackFloat); + + try + { + // Repeated removal should fail + Messenger.RemoveListener(eventType2, TestCallbackFloat); + throw new Exception("Unit test failure - expected a ListenerException"); + } + catch (MessengerInternal.ListenerException e) + { + // All good + } + } + + + void TestCallback() + { + wasCalled = true; + Console.Out.WriteLine("TestCallback() was called."); + } + + void TestCallbackFloat(float f) + { + wasCalled = true; + Console.Out.WriteLine("TestCallbackFloat(float) was called."); + + if (f != 1.0f) + { + throw new Exception("Unit test failure - wrong value on float argument"); + } + } + + + + } } \ No newline at end of file diff --git a/Assets/Scripts/Misc/MeteorRing.cs b/Assets/Scripts/Misc/MeteorRing.cs index 1b803db..763747f 100644 --- a/Assets/Scripts/Misc/MeteorRing.cs +++ b/Assets/Scripts/Misc/MeteorRing.cs @@ -3,28 +3,30 @@ // Usage: Attach to gameobject (enable gizmos to see Debug.DrawRay()) // reference: http://forum.unity3d.com/threads/procedural-generation-in-a-specific-shape-question.421659/ - -public class MeteorRing : MonoBehaviour +namespace UnityLibrary { - public int totalCount = 5000; - public float ringRadius = 10; - public float ringHeight = 1; - - void Start() + public class MeteorRing : MonoBehaviour { - for (int i = 0; i < totalCount; i++) + public int totalCount = 5000; + public float ringRadius = 10; + public float ringHeight = 1; + + void Start() { - // outer ring - float angle = i * (Mathf.PI *2) / totalCount; - var x = Mathf.Sin(angle) * ringRadius; - var y = Mathf.Cos(angle) * ringRadius; - var pos = new Vector3(x, 0, y); + for (int i = 0; i < totalCount; i++) + { + // outer ring + float angle = i * (Mathf.PI * 2) / totalCount; + var x = Mathf.Sin(angle) * ringRadius; + var y = Mathf.Cos(angle) * ringRadius; + var pos = new Vector3(x, 0, y); - // spread within outer ring - pos += Random.insideUnitSphere * ringHeight; + // spread within outer ring + pos += Random.insideUnitSphere * ringHeight; - // draw - Debug.DrawRay(pos, Vector3.up * 0.05f, Color.yellow, 100); + // draw + Debug.DrawRay(pos, Vector3.up * 0.05f, Color.yellow, 100); + } } } } diff --git a/Assets/Scripts/Misc/TexturePixels2Quads.cs b/Assets/Scripts/Misc/TexturePixels2Quads.cs index bef6074..c1ffe69 100644 --- a/Assets/Scripts/Misc/TexturePixels2Quads.cs +++ b/Assets/Scripts/Misc/TexturePixels2Quads.cs @@ -4,23 +4,25 @@ // Usage: // - assign texture (that has [x] read/write enabled in inspector // - assign Quad mesh (prefab) to planePrefab. You can assign Unlit/Color material to the quad prefab first. - -public class TexturePixels2Quads : MonoBehaviour +namespace UnityLibrary { - public Texture2D tex; - public Renderer planePrefab; - - void Start() + public class TexturePixels2Quads : MonoBehaviour { - for (int x = 0; x < tex.width; x++) + public Texture2D tex; + public Renderer planePrefab; + + void Start() { - for (int y = 0; y < tex.height; y++) + for (int x = 0; x < tex.width; x++) { - var c = tex.GetPixel(x, y); - var pos = new Vector3(x, y, 0); - var plane = Instantiate(planePrefab, pos, Quaternion.identity) as Renderer; - plane.material.color = c; + for (int y = 0; y < tex.height; y++) + { + var c = tex.GetPixel(x, y); + var pos = new Vector3(x, y, 0); + var plane = Instantiate(planePrefab, pos, Quaternion.identity) as Renderer; + plane.material.color = c; + } } } } -} +} \ No newline at end of file diff --git a/Assets/Scripts/Serialization/Color32Serializable.cs b/Assets/Scripts/Serialization/Color32Serializable.cs index 659dc00..4ca9832 100644 --- a/Assets/Scripts/Serialization/Color32Serializable.cs +++ b/Assets/Scripts/Serialization/Color32Serializable.cs @@ -7,85 +7,88 @@ /// /// Representation of RGBA colors in 32 bit format. /// -[Serializable] -public struct Color32Serializable : ISerializable +namespace UnityLibrary { - - #region Parameters - - /// - /// Th Red. - /// - public byte r; - - /// - /// The Green. - /// - public byte g; - - /// - /// The Blue. - /// - public byte b; - - /// - /// The Alpha. - /// - public byte a; - - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the struct. - /// - /// Color. - public Color32Serializable ( Color32 color ) : this ( color.r, color.g, color.b, color.a ) - { - } - - /// - /// Initializes a new instance of the struct. - /// - /// The red component. - /// The green component. - /// The blue component. - /// The alpha component. - public Color32Serializable ( byte r, byte g, byte b, byte a ) - { - this.r = r; - this.g = g; - this.b = b; - this.a = a; - } - - #endregion - - #region Operators Overload - - public static implicit operator Color32Serializable ( Color32 color ) - { - return new Color32Serializable ( color ); - } - - public static implicit operator Color32 ( Color32Serializable color ) - { - return new Color32 ( color.r, color.g, color.b, color.a ); - } - - #endregion - - #region ISerializable implementation - - public void GetObjectData ( SerializationInfo info, StreamingContext context ) - { - info.AddValue ( "r", this.r, typeof ( byte ) ); - info.AddValue ( "g", this.g, typeof ( byte ) ); - info.AddValue ( "b", this.b, typeof ( byte ) ); - info.AddValue ( "a", this.a, typeof ( byte ) ); - } - - #endregion - -} + [Serializable] + public struct Color32Serializable : ISerializable + { + + #region Parameters + + /// + /// Th Red. + /// + public byte r; + + /// + /// The Green. + /// + public byte g; + + /// + /// The Blue. + /// + public byte b; + + /// + /// The Alpha. + /// + public byte a; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the struct. + /// + /// Color. + public Color32Serializable(Color32 color) : this(color.r, color.g, color.b, color.a) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// The red component. + /// The green component. + /// The blue component. + /// The alpha component. + public Color32Serializable(byte r, byte g, byte b, byte a) + { + this.r = r; + this.g = g; + this.b = b; + this.a = a; + } + + #endregion + + #region Operators Overload + + public static implicit operator Color32Serializable(Color32 color) + { + return new Color32Serializable(color); + } + + public static implicit operator Color32(Color32Serializable color) + { + return new Color32(color.r, color.g, color.b, color.a); + } + + #endregion + + #region ISerializable implementation + + public void GetObjectData(SerializationInfo info, StreamingContext context) + { + info.AddValue("r", this.r, typeof(byte)); + info.AddValue("g", this.g, typeof(byte)); + info.AddValue("b", this.b, typeof(byte)); + info.AddValue("a", this.a, typeof(byte)); + } + + #endregion + + } +} \ No newline at end of file diff --git a/Assets/Scripts/Serialization/ColorSerializable.cs b/Assets/Scripts/Serialization/ColorSerializable.cs index 41462a3..7a54589 100644 --- a/Assets/Scripts/Serialization/ColorSerializable.cs +++ b/Assets/Scripts/Serialization/ColorSerializable.cs @@ -7,95 +7,98 @@ /// /// Representation of RGBA colors. /// -[Serializable] -public struct ColorSerializable : ISerializable +namespace UnityLibrary { - - #region Parameters - - /// - /// Th Red. - /// - public float r; - - /// - /// The Green. - /// - public float g; - - /// - /// The Blue. - /// - public float b; - - /// - /// The Alpha. - /// - public float a; - - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the struct. - /// - /// The red component. - /// The green component. - /// The blue component. - public ColorSerializable ( float r, float g, float b ) : this ( r, g, b, 1f ) - { - } - - /// - /// Initializes a new instance of the struct. - /// - /// Color. - public ColorSerializable ( Color color ) : this ( color.r, color.g, color.b, color.a ) - { - } - - /// - /// Initializes a new instance of the struct. - /// - /// The red component. - /// The green component. - /// The blue component. - /// The alpha component. - public ColorSerializable ( float r, float g, float b, float a ) - { - this.r = r; - this.g = g; - this.b = b; - this.a = a; - } - - #endregion - - #region Operators Overload - - public static implicit operator ColorSerializable ( Color color ) - { - return new ColorSerializable ( color ); - } - - public static implicit operator Color ( ColorSerializable color ) - { - return new Color ( color.r, color.g, color.b, color.a ); - } - - #endregion - - #region ISerializable implementation - - public void GetObjectData ( SerializationInfo info, StreamingContext context ) - { - info.AddValue ( "r", this.r, typeof ( float ) ); - info.AddValue ( "g", this.g, typeof ( float ) ); - info.AddValue ( "b", this.b, typeof ( float ) ); - info.AddValue ( "a", this.a, typeof ( float ) ); - } - - #endregion - -} + [Serializable] + public struct ColorSerializable : ISerializable + { + + #region Parameters + + /// + /// Th Red. + /// + public float r; + + /// + /// The Green. + /// + public float g; + + /// + /// The Blue. + /// + public float b; + + /// + /// The Alpha. + /// + public float a; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the struct. + /// + /// The red component. + /// The green component. + /// The blue component. + public ColorSerializable(float r, float g, float b) : this(r, g, b, 1f) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// Color. + public ColorSerializable(Color color) : this(color.r, color.g, color.b, color.a) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// The red component. + /// The green component. + /// The blue component. + /// The alpha component. + public ColorSerializable(float r, float g, float b, float a) + { + this.r = r; + this.g = g; + this.b = b; + this.a = a; + } + + #endregion + + #region Operators Overload + + public static implicit operator ColorSerializable(Color color) + { + return new ColorSerializable(color); + } + + public static implicit operator Color(ColorSerializable color) + { + return new Color(color.r, color.g, color.b, color.a); + } + + #endregion + + #region ISerializable implementation + + public void GetObjectData(SerializationInfo info, StreamingContext context) + { + info.AddValue("r", this.r, typeof(float)); + info.AddValue("g", this.g, typeof(float)); + info.AddValue("b", this.b, typeof(float)); + info.AddValue("a", this.a, typeof(float)); + } + + #endregion + + } +} \ No newline at end of file diff --git a/Assets/Scripts/Serialization/MeshSerializable.cs b/Assets/Scripts/Serialization/MeshSerializable.cs index 48c76f1..62a99e3 100644 --- a/Assets/Scripts/Serialization/MeshSerializable.cs +++ b/Assets/Scripts/Serialization/MeshSerializable.cs @@ -7,96 +7,99 @@ /// /// A class that allows creating and modifying meshes from scripts. /// -[Serializable] -public sealed class MeshSerializable : UnityEngine.Object, ISerializable +namespace UnityLibrary { - - #region Parameters - - public Vector3[] vertices; - public int[] triangles; - public Vector3[] normals; - public Color[] colors; - public Vector4[] tangents; - public Color32[] colors32; - public Vector2[] uv; - public Vector2[] uv2; - public Vector2[] uv3; - public Vector2[] uv4; - - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - public MeshSerializable () : this ( new Mesh () ) - { - - } - - /// - /// Initializes a new instance of the class. - /// - /// Mesh. - public MeshSerializable ( Mesh mesh ) - { - this.vertices = mesh.vertices; - this.triangles = mesh.triangles; - this.normals = mesh.normals; - this.colors = mesh.colors; - this.tangents = mesh.tangents; - this.colors32 = mesh.colors32; - this.uv = mesh.uv; - this.uv2 = mesh.uv2; - this.uv3 = mesh.uv3; - this.uv4 = mesh.uv4; - } - - #endregion - - #region Operators Overload - - public static implicit operator MeshSerializable ( Mesh mesh ) - { - return new MeshSerializable ( mesh ); - } - - public static implicit operator Mesh ( MeshSerializable mesh ) - { - Mesh result = new Mesh (); - result.vertices = mesh.vertices; - result.triangles = mesh.triangles; - result.normals = mesh.normals; - result.colors = mesh.colors; - result.tangents = mesh.tangents; - result.colors32 = mesh.colors32; - result.uv = mesh.uv; - result.uv2 = mesh.uv2; - result.uv3 = mesh.uv3; - result.uv4 = mesh.uv4; - return result; - } - - #endregion - - #region ISerializable implementation - - public void GetObjectData ( SerializationInfo info, StreamingContext context ) - { - info.AddValue ( "vertices", this.vertices, typeof ( Vector3[] ) ); - info.AddValue ( "triangles", this.triangles, typeof ( int[] ) ); - info.AddValue ( "normals", this.normals, typeof ( Vector3[] ) ); - info.AddValue ( "colors", this.colors, typeof ( Color[] ) ); - info.AddValue ( "tangents", this.tangents, typeof ( Vector4[] ) ); - info.AddValue ( "colors32", this.colors32, typeof ( Color32[] ) ); - info.AddValue ( "uv", this.uv, typeof ( Vector3[] ) ); - info.AddValue ( "uv2", this.uv2, typeof ( Vector3[] ) ); - info.AddValue ( "uv3", this.uv3, typeof ( Vector3[] ) ); - info.AddValue ( "uv4", this.uv4, typeof ( Vector3[] ) ); - } - - #endregion + [Serializable] + public sealed class MeshSerializable : UnityEngine.Object, ISerializable + { + #region Parameters + + public Vector3[] vertices; + public int[] triangles; + public Vector3[] normals; + public Color[] colors; + public Vector4[] tangents; + public Color32[] colors32; + public Vector2[] uv; + public Vector2[] uv2; + public Vector2[] uv3; + public Vector2[] uv4; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + public MeshSerializable() : this(new Mesh()) + { + + } + + /// + /// Initializes a new instance of the class. + /// + /// Mesh. + public MeshSerializable(Mesh mesh) + { + this.vertices = mesh.vertices; + this.triangles = mesh.triangles; + this.normals = mesh.normals; + this.colors = mesh.colors; + this.tangents = mesh.tangents; + this.colors32 = mesh.colors32; + this.uv = mesh.uv; + this.uv2 = mesh.uv2; + this.uv3 = mesh.uv3; + this.uv4 = mesh.uv4; + } + + #endregion + + #region Operators Overload + + public static implicit operator MeshSerializable(Mesh mesh) + { + return new MeshSerializable(mesh); + } + + public static implicit operator Mesh(MeshSerializable mesh) + { + Mesh result = new Mesh(); + result.vertices = mesh.vertices; + result.triangles = mesh.triangles; + result.normals = mesh.normals; + result.colors = mesh.colors; + result.tangents = mesh.tangents; + result.colors32 = mesh.colors32; + result.uv = mesh.uv; + result.uv2 = mesh.uv2; + result.uv3 = mesh.uv3; + result.uv4 = mesh.uv4; + return result; + } + + #endregion + + #region ISerializable implementation + + public void GetObjectData(SerializationInfo info, StreamingContext context) + { + info.AddValue("vertices", this.vertices, typeof(Vector3[])); + info.AddValue("triangles", this.triangles, typeof(int[])); + info.AddValue("normals", this.normals, typeof(Vector3[])); + info.AddValue("colors", this.colors, typeof(Color[])); + info.AddValue("tangents", this.tangents, typeof(Vector4[])); + info.AddValue("colors32", this.colors32, typeof(Color32[])); + info.AddValue("uv", this.uv, typeof(Vector3[])); + info.AddValue("uv2", this.uv2, typeof(Vector3[])); + info.AddValue("uv3", this.uv3, typeof(Vector3[])); + info.AddValue("uv4", this.uv4, typeof(Vector3[])); + } + + #endregion + + } } diff --git a/Assets/Scripts/Serialization/Vector2Serializable.cs b/Assets/Scripts/Serialization/Vector2Serializable.cs index 8e4374d..db8ab97 100644 --- a/Assets/Scripts/Serialization/Vector2Serializable.cs +++ b/Assets/Scripts/Serialization/Vector2Serializable.cs @@ -7,149 +7,152 @@ /// /// Representation of 2D vectors and points. /// -[Serializable] -public struct Vector2Serializable : ISerializable +namespace UnityLibrary { - - #region Parametres - - /// - /// X component of the vector. - /// - public float x; - - /// - /// Y component of the vector. - /// - public float y; - - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the struct. - /// - /// Vector. - public Vector2Serializable ( Vector2 vector ) : this ( vector.x, vector.y ) - { - } - - /// - /// Initializes a new instance of the struct. - /// - /// Vector. - public Vector2Serializable ( Vector3 vector ) : this ( vector.x, vector.y ) - { - } - - /// - /// Initializes a new instance of the struct. - /// - /// Vector. - public Vector2Serializable ( Vector4 vector ) : this ( vector.x, vector.y ) - { - } - - /// - /// Initializes a new instance of the struct. - /// - /// The x coordinate. - /// The y coordinate. - public Vector2Serializable ( float x, float y ) - { - this.x = x; - this.y = y; - } - - #endregion - - #region Methods - - public override bool Equals ( object obj ) - { - if ( obj is Vector2Serializable || obj is Vector2 ) - { - Vector2Serializable vector = ( Vector2Serializable )obj; - return this.x == vector.x && this.y == vector.y; - } - return false; - } - - public override int GetHashCode () - { - return this.x.GetHashCode () ^ this.y.GetHashCode () << 2; - } - - public override string ToString () - { - return string.Format ( "({0}, {1})", this.x, this.y ); - } - - #endregion - - #region Operators Overload - - public static implicit operator Vector2Serializable ( Vector2 vector ) - { - return new Vector2Serializable ( vector ); - } - - public static implicit operator Vector2 ( Vector2Serializable vector ) - { - return new Vector2 ( vector.x, vector.y ); - } - - public static implicit operator Vector2Serializable ( Vector3 vector ) - { - return new Vector2Serializable ( vector ); - } - - public static implicit operator Vector3 ( Vector2Serializable vector ) - { - return new Vector3 ( vector.x, vector.y ); - } - - public static implicit operator Vector2Serializable ( Vector4 vector ) - { - return new Vector2Serializable ( vector ); - } - - public static implicit operator Vector4 ( Vector2Serializable vector ) - { - return new Vector4 ( vector.x, vector.y ); - } - - public static implicit operator Vector2Serializable ( Vector3Serializable vector ) - { - return new Vector2Serializable ( ( Vector2 )vector ); - } - - public static implicit operator Vector3Serializable ( Vector2Serializable vector ) - { - return new Vector3Serializable ( ( Vector2 )vector ); - } - - public static implicit operator Vector2Serializable ( Vector4Serializable vector ) - { - return new Vector2Serializable ( ( Vector2 )vector ); - } - - public static implicit operator Vector4Serializable ( Vector2Serializable vector ) - { - return new Vector4Serializable ( ( Vector2 )vector ); - } - - #endregion - - #region ISerializable implementation - - public void GetObjectData ( SerializationInfo info, StreamingContext context ) - { - info.AddValue ( "x", this.x, typeof ( float ) ); - info.AddValue ( "y", this.y, typeof ( float ) ); - } - - #endregion - -} + [Serializable] + public struct Vector2Serializable : ISerializable + { + + #region Parametres + + /// + /// X component of the vector. + /// + public float x; + + /// + /// Y component of the vector. + /// + public float y; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the struct. + /// + /// Vector. + public Vector2Serializable(Vector2 vector) : this(vector.x, vector.y) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// Vector. + public Vector2Serializable(Vector3 vector) : this(vector.x, vector.y) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// Vector. + public Vector2Serializable(Vector4 vector) : this(vector.x, vector.y) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// The x coordinate. + /// The y coordinate. + public Vector2Serializable(float x, float y) + { + this.x = x; + this.y = y; + } + + #endregion + + #region Methods + + public override bool Equals(object obj) + { + if (obj is Vector2Serializable || obj is Vector2) + { + Vector2Serializable vector = (Vector2Serializable)obj; + return this.x == vector.x && this.y == vector.y; + } + return false; + } + + public override int GetHashCode() + { + return this.x.GetHashCode() ^ this.y.GetHashCode() << 2; + } + + public override string ToString() + { + return string.Format("({0}, {1})", this.x, this.y); + } + + #endregion + + #region Operators Overload + + public static implicit operator Vector2Serializable(Vector2 vector) + { + return new Vector2Serializable(vector); + } + + public static implicit operator Vector2(Vector2Serializable vector) + { + return new Vector2(vector.x, vector.y); + } + + public static implicit operator Vector2Serializable(Vector3 vector) + { + return new Vector2Serializable(vector); + } + + public static implicit operator Vector3(Vector2Serializable vector) + { + return new Vector3(vector.x, vector.y); + } + + public static implicit operator Vector2Serializable(Vector4 vector) + { + return new Vector2Serializable(vector); + } + + public static implicit operator Vector4(Vector2Serializable vector) + { + return new Vector4(vector.x, vector.y); + } + + public static implicit operator Vector2Serializable(Vector3Serializable vector) + { + return new Vector2Serializable((Vector2)vector); + } + + public static implicit operator Vector3Serializable(Vector2Serializable vector) + { + return new Vector3Serializable((Vector2)vector); + } + + public static implicit operator Vector2Serializable(Vector4Serializable vector) + { + return new Vector2Serializable((Vector2)vector); + } + + public static implicit operator Vector4Serializable(Vector2Serializable vector) + { + return new Vector4Serializable((Vector2)vector); + } + + #endregion + + #region ISerializable implementation + + public void GetObjectData(SerializationInfo info, StreamingContext context) + { + info.AddValue("x", this.x, typeof(float)); + info.AddValue("y", this.y, typeof(float)); + } + + #endregion + + } +} \ No newline at end of file diff --git a/Assets/Scripts/Serialization/Vector3Serializable.cs b/Assets/Scripts/Serialization/Vector3Serializable.cs index e3fb18f..053ace1 100644 --- a/Assets/Scripts/Serialization/Vector3Serializable.cs +++ b/Assets/Scripts/Serialization/Vector3Serializable.cs @@ -7,166 +7,169 @@ /// /// Representation of 3D vectors and points. /// -[Serializable] -public struct Vector3Serializable : ISerializable +namespace UnityLibrary { - - #region Parametres - - /// - /// X component of the vector. - /// - public float x; - - /// - /// Y component of the vector. - /// - public float y; - - /// - /// Z component of the vector. - /// - public float z; - - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the struct. - /// - /// Vector. - public Vector3Serializable ( Vector2 vector ) : this ( vector.x, vector.y ) - { - } - - /// - /// Initializes a new instance of the struct. - /// - /// Vector. - public Vector3Serializable ( Vector3 vector ) : this ( vector.x, vector.y, vector.z ) - { - } - - /// - /// Initializes a new instance of the struct. - /// - /// Vector. - public Vector3Serializable ( Vector4 vector ) : this ( vector.x, vector.y, vector.z ) - { - } - - /// - /// Initializes a new instance of the struct. - /// - /// The x coordinate. - /// The y coordinate. - public Vector3Serializable ( float x, float y ) : this ( x, y, 0f ) - { - } - - /// - /// Initializes a new instance of the struct. - /// - /// The x coordinate. - /// The y coordinate. - /// The z coordinate. - public Vector3Serializable ( float x, float y, float z ) - { - this.x = x; - this.y = y; - this.z = z; - } - - #endregion - - #region Methods - - public override bool Equals ( object obj ) - { - if ( obj is Vector3Serializable || obj is Vector3 ) - { - Vector3Serializable vector = ( Vector3Serializable )obj; - return this.x == vector.x && this.y == vector.y && this.z == vector.z; - } - return false; - } - - public override int GetHashCode () - { - return this.x.GetHashCode () ^ this.y.GetHashCode () << 2 ^ this.z.GetHashCode () >> 2; - } - - public override string ToString () - { - return string.Format ( "({0}, {1}, {2})", this.x, this.y, this.z ); - } - - #endregion - - #region Operators Overload - - public static implicit operator Vector3Serializable ( Vector2 vector ) - { - return new Vector3Serializable ( vector ); - } - - public static implicit operator Vector2 ( Vector3Serializable vector ) - { - return new Vector2 ( vector.x, vector.y ); - } - - public static implicit operator Vector3Serializable ( Vector3 vector ) - { - return new Vector3Serializable ( vector ); - } - - public static implicit operator Vector3 ( Vector3Serializable vector ) - { - return new Vector3 ( vector.x, vector.y, vector.z ); - } - - public static implicit operator Vector3Serializable ( Vector4 vector ) - { - return new Vector3Serializable ( vector ); - } - - public static implicit operator Vector4 ( Vector3Serializable vector ) - { - return new Vector4 ( vector.x, vector.y, vector.z ); - } - - public static implicit operator Vector3Serializable ( Vector2Serializable vector ) - { - return new Vector3Serializable ( ( Vector3 )vector ); - } - - public static implicit operator Vector2Serializable ( Vector3Serializable vector ) - { - return new Vector2Serializable ( ( Vector3 )vector ); - } - - public static implicit operator Vector3Serializable ( Vector4Serializable vector ) - { - return new Vector3Serializable ( ( Vector3 )vector ); - } - - public static implicit operator Vector4Serializable ( Vector3Serializable vector ) - { - return new Vector4Serializable ( ( Vector3 )vector ); - } - - #endregion - - #region ISerializable implementation - - public void GetObjectData ( SerializationInfo info, StreamingContext context ) - { - info.AddValue ( "x", this.x, typeof ( float ) ); - info.AddValue ( "y", this.y, typeof ( float ) ); - info.AddValue ( "z", this.z, typeof ( float ) ); - } - - #endregion - + [Serializable] + public struct Vector3Serializable : ISerializable + { + + #region Parametres + + /// + /// X component of the vector. + /// + public float x; + + /// + /// Y component of the vector. + /// + public float y; + + /// + /// Z component of the vector. + /// + public float z; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the struct. + /// + /// Vector. + public Vector3Serializable(Vector2 vector) : this(vector.x, vector.y) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// Vector. + public Vector3Serializable(Vector3 vector) : this(vector.x, vector.y, vector.z) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// Vector. + public Vector3Serializable(Vector4 vector) : this(vector.x, vector.y, vector.z) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// The x coordinate. + /// The y coordinate. + public Vector3Serializable(float x, float y) : this(x, y, 0f) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// The x coordinate. + /// The y coordinate. + /// The z coordinate. + public Vector3Serializable(float x, float y, float z) + { + this.x = x; + this.y = y; + this.z = z; + } + + #endregion + + #region Methods + + public override bool Equals(object obj) + { + if (obj is Vector3Serializable || obj is Vector3) + { + Vector3Serializable vector = (Vector3Serializable)obj; + return this.x == vector.x && this.y == vector.y && this.z == vector.z; + } + return false; + } + + public override int GetHashCode() + { + return this.x.GetHashCode() ^ this.y.GetHashCode() << 2 ^ this.z.GetHashCode() >> 2; + } + + public override string ToString() + { + return string.Format("({0}, {1}, {2})", this.x, this.y, this.z); + } + + #endregion + + #region Operators Overload + + public static implicit operator Vector3Serializable(Vector2 vector) + { + return new Vector3Serializable(vector); + } + + public static implicit operator Vector2(Vector3Serializable vector) + { + return new Vector2(vector.x, vector.y); + } + + public static implicit operator Vector3Serializable(Vector3 vector) + { + return new Vector3Serializable(vector); + } + + public static implicit operator Vector3(Vector3Serializable vector) + { + return new Vector3(vector.x, vector.y, vector.z); + } + + public static implicit operator Vector3Serializable(Vector4 vector) + { + return new Vector3Serializable(vector); + } + + public static implicit operator Vector4(Vector3Serializable vector) + { + return new Vector4(vector.x, vector.y, vector.z); + } + + public static implicit operator Vector3Serializable(Vector2Serializable vector) + { + return new Vector3Serializable((Vector3)vector); + } + + public static implicit operator Vector2Serializable(Vector3Serializable vector) + { + return new Vector2Serializable((Vector3)vector); + } + + public static implicit operator Vector3Serializable(Vector4Serializable vector) + { + return new Vector3Serializable((Vector3)vector); + } + + public static implicit operator Vector4Serializable(Vector3Serializable vector) + { + return new Vector4Serializable((Vector3)vector); + } + + #endregion + + #region ISerializable implementation + + public void GetObjectData(SerializationInfo info, StreamingContext context) + { + info.AddValue("x", this.x, typeof(float)); + info.AddValue("y", this.y, typeof(float)); + info.AddValue("z", this.z, typeof(float)); + } + + #endregion + + } } diff --git a/Assets/Scripts/Serialization/Vector4Serializable.cs b/Assets/Scripts/Serialization/Vector4Serializable.cs index 7adb319..2f85748 100644 --- a/Assets/Scripts/Serialization/Vector4Serializable.cs +++ b/Assets/Scripts/Serialization/Vector4Serializable.cs @@ -7,184 +7,187 @@ /// /// Representation of four-dimensional vectors. /// -[Serializable] -public struct Vector4Serializable : ISerializable +namespace UnityLibrary { - - #region Parametres - - /// - /// X component of the vector. - /// - public float x; - - /// - /// Y component of the vector. - /// - public float y; - - /// - /// Z component of the vector. - /// - public float z; - - /// - /// W component of the vector. - /// - public float w; - - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the struct. - /// - /// Vector. - public Vector4Serializable ( Vector2 vector ) : this ( vector.x, vector.y ) - { - } - - /// - /// Initializes a new instance of the struct. - /// - /// Vector. - public Vector4Serializable ( Vector3 vector ) : this ( vector.x, vector.y, vector.z ) - { - } - - /// - /// Initializes a new instance of the struct. - /// - /// Vector. - public Vector4Serializable ( Vector4 vector ) : this ( vector.x, vector.y, vector.z, vector.w ) - { - } - - /// - /// Initializes a new instance of the struct. - /// - /// The x coordinate. - /// The y coordinate. - public Vector4Serializable ( float x, float y ) : this ( x, y, 0f ) - { - } - - /// - /// Initializes a new instance of the struct. - /// - /// The x coordinate. - /// The y coordinate. - /// The z coordinate. - public Vector4Serializable ( float x, float y, float z ) : this ( x, y, z, 0f ) - { - } - - /// - /// Initializes a new instance of the struct. - /// - /// The x coordinate. - /// The y coordinate. - /// The z coordinate. - /// The width. - public Vector4Serializable ( float x, float y, float z, float w ) - { - this.x = x; - this.y = y; - this.z = z; - this.w = w; - } - - #endregion - - #region Methods - - public override bool Equals ( object obj ) - { - if ( obj is Vector4Serializable || obj is Vector4 ) - { - Vector4Serializable vector = ( Vector4Serializable )obj; - return this.x == vector.x && this.y == vector.y && this.z == vector.z && this.w == vector.w; - } - return false; - } - - public override int GetHashCode () - { - return this.x.GetHashCode () ^ this.y.GetHashCode () << 2 ^ this.z.GetHashCode () >> 2 ^ this.w.GetHashCode () >> 1; - } - - public override string ToString () - { - return string.Format ( "({0}, {1}, {2}, {3})", this.x, this.y, this.z, this.w ); - } - - #endregion - - #region Operators Overload - - public static implicit operator Vector4Serializable ( Vector2 vector ) - { - return new Vector4Serializable ( vector ); - } - - public static implicit operator Vector2 ( Vector4Serializable vector ) - { - return new Vector2 ( vector.x, vector.y ); - } - - public static implicit operator Vector4Serializable ( Vector3 vector ) - { - return new Vector4Serializable ( vector ); - } - - public static implicit operator Vector3 ( Vector4Serializable vector ) - { - return new Vector3 ( vector.x, vector.y, vector.z ); - } - - public static implicit operator Vector4Serializable ( Vector4 vector ) - { - return new Vector4Serializable ( vector ); - } - - public static implicit operator Vector4 ( Vector4Serializable vector ) - { - return new Vector4 ( vector.x, vector.y, vector.z, vector.w ); - } - - public static implicit operator Vector4Serializable ( Vector2Serializable vector ) - { - return new Vector4Serializable ( ( Vector4 )vector ); - } - - public static implicit operator Vector2Serializable ( Vector4Serializable vector ) - { - return new Vector2Serializable ( ( Vector4 )vector ); - } - - public static implicit operator Vector4Serializable ( Vector3Serializable vector ) - { - return new Vector4Serializable ( ( Vector4 )vector ); - } - - public static implicit operator Vector3Serializable ( Vector4Serializable vector ) - { - return new Vector3Serializable ( ( Vector4 )vector ); - } - - #endregion - - #region ISerializable implementation - - public void GetObjectData ( SerializationInfo info, StreamingContext context ) - { - info.AddValue ( "x", this.x, typeof ( float ) ); - info.AddValue ( "y", this.y, typeof ( float ) ); - info.AddValue ( "z", this.w, typeof ( float ) ); - info.AddValue ( "w", this.w, typeof ( float ) ); - } - - #endregion - + [Serializable] + public struct Vector4Serializable : ISerializable + { + + #region Parametres + + /// + /// X component of the vector. + /// + public float x; + + /// + /// Y component of the vector. + /// + public float y; + + /// + /// Z component of the vector. + /// + public float z; + + /// + /// W component of the vector. + /// + public float w; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the struct. + /// + /// Vector. + public Vector4Serializable(Vector2 vector) : this(vector.x, vector.y) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// Vector. + public Vector4Serializable(Vector3 vector) : this(vector.x, vector.y, vector.z) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// Vector. + public Vector4Serializable(Vector4 vector) : this(vector.x, vector.y, vector.z, vector.w) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// The x coordinate. + /// The y coordinate. + public Vector4Serializable(float x, float y) : this(x, y, 0f) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// The x coordinate. + /// The y coordinate. + /// The z coordinate. + public Vector4Serializable(float x, float y, float z) : this(x, y, z, 0f) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// The x coordinate. + /// The y coordinate. + /// The z coordinate. + /// The width. + public Vector4Serializable(float x, float y, float z, float w) + { + this.x = x; + this.y = y; + this.z = z; + this.w = w; + } + + #endregion + + #region Methods + + public override bool Equals(object obj) + { + if (obj is Vector4Serializable || obj is Vector4) + { + Vector4Serializable vector = (Vector4Serializable)obj; + return this.x == vector.x && this.y == vector.y && this.z == vector.z && this.w == vector.w; + } + return false; + } + + public override int GetHashCode() + { + return this.x.GetHashCode() ^ this.y.GetHashCode() << 2 ^ this.z.GetHashCode() >> 2 ^ this.w.GetHashCode() >> 1; + } + + public override string ToString() + { + return string.Format("({0}, {1}, {2}, {3})", this.x, this.y, this.z, this.w); + } + + #endregion + + #region Operators Overload + + public static implicit operator Vector4Serializable(Vector2 vector) + { + return new Vector4Serializable(vector); + } + + public static implicit operator Vector2(Vector4Serializable vector) + { + return new Vector2(vector.x, vector.y); + } + + public static implicit operator Vector4Serializable(Vector3 vector) + { + return new Vector4Serializable(vector); + } + + public static implicit operator Vector3(Vector4Serializable vector) + { + return new Vector3(vector.x, vector.y, vector.z); + } + + public static implicit operator Vector4Serializable(Vector4 vector) + { + return new Vector4Serializable(vector); + } + + public static implicit operator Vector4(Vector4Serializable vector) + { + return new Vector4(vector.x, vector.y, vector.z, vector.w); + } + + public static implicit operator Vector4Serializable(Vector2Serializable vector) + { + return new Vector4Serializable((Vector4)vector); + } + + public static implicit operator Vector2Serializable(Vector4Serializable vector) + { + return new Vector2Serializable((Vector4)vector); + } + + public static implicit operator Vector4Serializable(Vector3Serializable vector) + { + return new Vector4Serializable((Vector4)vector); + } + + public static implicit operator Vector3Serializable(Vector4Serializable vector) + { + return new Vector3Serializable((Vector4)vector); + } + + #endregion + + #region ISerializable implementation + + public void GetObjectData(SerializationInfo info, StreamingContext context) + { + info.AddValue("x", this.x, typeof(float)); + info.AddValue("y", this.y, typeof(float)); + info.AddValue("z", this.w, typeof(float)); + info.AddValue("w", this.w, typeof(float)); + } + + #endregion + + } } diff --git a/Assets/Scripts/Threading/ThreadPoolTest.cs b/Assets/Scripts/Threading/ThreadPoolTest.cs index 3d2a485..67c55e7 100644 --- a/Assets/Scripts/Threading/ThreadPoolTest.cs +++ b/Assets/Scripts/Threading/ThreadPoolTest.cs @@ -6,79 +6,82 @@ // Usage: Attach this script to gameobject in scene, press play, hit 1 key to queue new threads, see console for progress // we pass thread parameters as object -class ThreadInfo +namespace UnityLibrary { - public int threadIndex; - public Vector3 myVector; -} + class ThreadInfo + { + public int threadIndex; + public Vector3 myVector; + } -public class ThreadPoolTest : MonoBehaviour -{ - int maxThreads = 2; // set your max threads here + public class ThreadPoolTest : MonoBehaviour + { + int maxThreads = 2; // set your max threads here - static readonly object _countLock = new object(); - static int _threadCount = 0; - static bool closingApp = false; + static readonly object _countLock = new object(); + static int _threadCount = 0; + static bool closingApp = false; - int clickCounter = 0; + int clickCounter = 0; - void Update() - { - // press 1 to spawn thread(s) - if (Input.GetKeyDown(KeyCode.Alpha1)) + void Update() { - // Pass these values to the thread. - ThreadInfo threadData = new ThreadInfo(); - threadData.myVector = Random.insideUnitSphere * 10; // get some random vector3 value - threadData.threadIndex = ++clickCounter; - print("Queue new thread #"+ threadData.threadIndex); - ThreadPool.QueueUserWorkItem(new WaitCallback(MyWorkerThread), threadData); + // press 1 to spawn thread(s) + if (Input.GetKeyDown(KeyCode.Alpha1)) + { + // Pass these values to the thread. + ThreadInfo threadData = new ThreadInfo(); + threadData.myVector = Random.insideUnitSphere * 10; // get some random vector3 value + threadData.threadIndex = ++clickCounter; + print("Queue new thread #" + threadData.threadIndex); + ThreadPool.QueueUserWorkItem(new WaitCallback(MyWorkerThread), threadData); + } } - } - private void MyWorkerThread(System.Object a) - { - // Constrain the number of worker threads, loop here until less than maxthreads are running - while (!closingApp) + private void MyWorkerThread(System.Object a) { - // Prevent other threads from changing this under us - lock (_countLock) + // Constrain the number of worker threads, loop here until less than maxthreads are running + while (!closingApp) { - if (_threadCount < maxThreads && !closingApp) + // Prevent other threads from changing this under us + lock (_countLock) { - // Start processing - _threadCount++; - break; + if (_threadCount < maxThreads && !closingApp) + { + // Start processing + _threadCount++; + break; + } } + Thread.Sleep(50); } - Thread.Sleep(50); - } - if (closingApp) return; + if (closingApp) return; - // we are ready to work now, prepare object that contains necessary info for the thread - ThreadInfo threadInfo = a as ThreadInfo; - Vector3 myVector = threadInfo.myVector; - int myIndex = threadInfo.threadIndex; - print("---From thread #"+ myIndex + " processing myVector " + myVector); + // we are ready to work now, prepare object that contains necessary info for the thread + ThreadInfo threadInfo = a as ThreadInfo; + Vector3 myVector = threadInfo.myVector; + int myIndex = threadInfo.threadIndex; + print("---From thread #" + myIndex + " processing myVector " + myVector); - // for testing we just sleep here (you could do your heavy calculations here) - Thread.Sleep(5000); + // for testing we just sleep here (you could do your heavy calculations here) + Thread.Sleep(5000); - // add this to your heavy work loop, so the thread quits if scene is closed - //if (closingApp) return; + // add this to your heavy work loop, so the thread quits if scene is closed + //if (closingApp) return; - print("---Finished thread #"+ myIndex); + print("---Finished thread #" + myIndex); - // decrease thread counter, so other threads can start - _threadCount--; - } + // decrease thread counter, so other threads can start + _threadCount--; + } - // set bool to close threads on exit - void OnDestroy() - { - closingApp = true; - } + // set bool to close threads on exit + void OnDestroy() + { + closingApp = true; + } + } } From 71ab6d3c22a31ac6c9189c9f2e7d796681a73484 Mon Sep 17 00:00:00 2001 From: unitycoder Date: Sun, 6 Aug 2017 15:30:41 +0800 Subject: [PATCH 086/231] assetbundleloader: fix memory leaks --- .../Scripts/AssetBundles/AssetBundleLoader.cs | 241 +++++++++--------- 1 file changed, 123 insertions(+), 118 deletions(-) diff --git a/Assets/Scripts/AssetBundles/AssetBundleLoader.cs b/Assets/Scripts/AssetBundles/AssetBundleLoader.cs index eab1e01..215d6de 100644 --- a/Assets/Scripts/AssetBundles/AssetBundleLoader.cs +++ b/Assets/Scripts/AssetBundles/AssetBundleLoader.cs @@ -2,123 +2,123 @@ using UnityEngine; using UnityEngine.Networking; -// example script to load hash from manifest file -// then use that hash for asset bundle loading (to use cached version when available) +// AssetBundle cache checker & loader with caching +// worsk by loading .manifest file from server and parsing hash string from it namespace UnityLibrary { - public class AssetBundleLoader : MonoBehaviour - { - public string assetBundleURL = "http://localhost/bundle"; - - void Start () - { - StartCoroutine ( DownloadAndCache ( assetBundleURL, "" ) ); - } - - - /// - /// asset bundle load and instantiate - /// - /// full url to the bundle file - /// optional asset name to instantiate from the bundle - IEnumerator DownloadAndCache ( string bundleURL, string assetName ) - { - // Wait for the Caching system to be ready - while ( !Caching.ready ) - { - yield return null; - } - - // if you want to always load from server, can clear cache first - // Caching.CleanCache(); - - // get current bundle hash from server, random value added to avoid caching - UnityWebRequest www = UnityWebRequest.Get ( bundleURL + ".manifest?r=" + ( Random.value * 9999999 ) ); - Debug.Log ( "Loading manifest:" + bundleURL + ".manifest" ); - - // wait for load to finish - yield return www.Send (); - - // if received error, exit - if ( www.isNetworkError == true ) - { - Debug.LogError ( "www error:" + www.error ); - yield break; - } - - // create empty hash string - Hash128 hashString = ( default(Hash128) );// new Hash128(0, 0, 0, 0); - - // check if received data contains 'ManifestFileVersion' - if ( www.downloadHandler.text.Contains ( "ManifestFileVersion" ) ) - { - // extract hash string from the received data, should add some error checking here - var hashRow = www.downloadHandler.text.ToString ().Split ( "\n".ToCharArray () ) [ 5 ]; - hashString = Hash128.Parse ( hashRow.Split ( ':' ) [ 1 ].Trim () ); - - if ( hashString.isValid == true ) - { - if ( Caching.IsVersionCached ( bundleURL, hashString ) == true ) - { - Debug.Log ( "Bundle with this hash is already cached!" ); - } - else - { - Debug.Log ( "No cached version founded for this hash.." ); - } - } - else - { - // invalid loaded hash, just try loading latest bundle - Debug.LogError ( "Invalid hash:" + hashString ); - yield break; - } - - } - else - { - Debug.LogError ( "Manifest doesn't contain string 'ManifestFileVersion': " + bundleURL + ".manifest" ); - yield break; - } - - - - // now download the actual bundle, with hashString parameter it uses cached version if available - www = UnityWebRequest.GetAssetBundle ( bundleURL + "?r=" + ( Random.value * 9999999 ), hashString, 0 ); - - // wait for load to finish - yield return www.Send (); - - if ( www.error != null ) - { - Debug.LogError ( "www error:" + www.error ); - yield break; - } - - // get bundle from downloadhandler - AssetBundle bundle = ( ( DownloadHandlerAssetBundle )www.downloadHandler ).assetBundle; - - GameObject bundlePrefab = null; - - // if no asset name is given, take the first/main asset - if ( assetName == "" ) - { - bundlePrefab = ( GameObject )bundle.LoadAsset ( bundle.GetAllAssetNames () [ 0 ] ); - } - else - { // use asset name - bundlePrefab = ( GameObject )bundle.LoadAsset ( assetName ); - } - - // if we got something out - if ( bundlePrefab != null ) - { - - // instantiate at 0,0,0 and without rotation - Instantiate ( bundlePrefab, Vector3.zero, Quaternion.identity ); - - /* + public class AssetBundleLoader : MonoBehaviour + { + public string assetBundleURL = "http://localhost/bundle"; + + void Start() + { + //StartCoroutine(DownloadAndCache(assetBundleURL)); + } + + /// + /// load assetbundle manifest, check hash, load actual bundle with hash parameter to use caching + /// instantiate gameobject + /// + /// full url to assetbundle file + /// optional parameter to access specific asset from assetbundle + /// + IEnumerator DownloadAndCache(string bundleURL, string assetName = "") + { + // Wait for the Caching system to be ready + while (!Caching.ready) + { + yield return null; + } + + // if you want to always load from server, can clear cache first + // Caching.CleanCache(); + + // get current bundle hash from server, random value added to avoid caching + UnityWebRequest www = UnityWebRequest.Get(bundleURL + ".manifest?r=" + (Random.value * 9999999)); + Debug.Log("Loading manifest:" + bundleURL + ".manifest"); + + // wait for load to finish + yield return www.Send(); + + // if received error, exit + if (www.isNetworkError == true) + { + Debug.LogError("www error: " + www.error); + www.Dispose(); + www = null; + yield break; + } + + // create empty hash string + Hash128 hashString = (default(Hash128));// new Hash128(0, 0, 0, 0); + + // check if received data contains 'ManifestFileVersion' + if (www.downloadHandler.text.Contains("ManifestFileVersion")) + { + // extract hash string from the received data, TODO should add some error checking here + var hashRow = www.downloadHandler.text.ToString().Split("\n".ToCharArray())[5]; + hashString = Hash128.Parse(hashRow.Split(':')[1].Trim()); + + if (hashString.isValid == true) + { + // we can check if there is cached version or not + if (Caching.IsVersionCached(bundleURL, hashString) == true) + { + Debug.Log("Bundle with this hash is already cached!"); + } else + { + Debug.Log("No cached version founded for this hash.."); + } + } else + { + // invalid loaded hash, just try loading latest bundle + Debug.LogError("Invalid hash:" + hashString); + yield break; + } + + } else + { + Debug.LogError("Manifest doesn't contain string 'ManifestFileVersion': " + bundleURL + ".manifest"); + yield break; + } + + // now download the actual bundle, with hashString parameter it uses cached version if available + www = UnityWebRequest.GetAssetBundle(bundleURL + "?r=" + (Random.value * 9999999), hashString, 0); + + // wait for load to finish + yield return www.Send(); + + if (www.error != null) + { + Debug.LogError("www error: " + www.error); + www.Dispose(); + www = null; + yield break; + } + + // get bundle from downloadhandler + AssetBundle bundle = ((DownloadHandlerAssetBundle)www.downloadHandler).assetBundle; + + GameObject bundlePrefab = null; + + // if no asset name is given, take the first/main asset + if (assetName == "") + { + bundlePrefab = (GameObject)bundle.LoadAsset(bundle.GetAllAssetNames()[0]); + } else + { // use asset name to access inside bundle + bundlePrefab = (GameObject)bundle.LoadAsset(assetName); + } + + // if we got something out + if (bundlePrefab != null) + { + + // instantiate at 0,0,0 and without rotation + Instantiate(bundlePrefab, Vector3.zero, Quaternion.identity); + + /* // fix pink shaders, NOTE: not always needed.. foreach (Renderer r in go.GetComponentsInChildren(includeInactive: true)) { @@ -127,10 +127,15 @@ IEnumerator DownloadAndCache ( string bundleURL, string assetName ) r.material.shader = null; r.material.shader = material; }*/ - } + } - bundle.Unload ( false ); - } - } + www.Dispose(); + www = null; + // try to cleanup memory + Resources.UnloadUnusedAssets(); + bundle.Unload(false); + bundle = null; + } + } } From 259674373b582075f1758c9c11b2f8f7d8be53cc Mon Sep 17 00:00:00 2001 From: unitycoder Date: Wed, 9 Aug 2017 13:39:29 +0800 Subject: [PATCH 087/231] move Docs/ under Scripts/, Add MonoBehaviour_OnValidate-example --- Assets/Scripts/Docs.meta | 9 ++++++ Assets/Scripts/Docs/Camera.meta | 9 ++++++ .../Docs/Camera/Camera_depthTextureMode.cs | 21 ++++++++++++ .../Camera/Camera_depthTextureMode.cs.meta | 12 +++++++ Assets/Scripts/Docs/Graphics.meta | 9 ++++++ Assets/Scripts/Docs/Graphics/Graphics_Blit.cs | 32 +++++++++++++++++++ .../Docs/Graphics/Graphics_Blit.cs.meta | 12 +++++++ Assets/Scripts/Docs/MonoBehaviour.meta | 9 ++++++ .../MonoBehaviour/MonoBehaviour_OnValidate.cs | 25 +++++++++++++++ .../MonoBehaviour_OnValidate.cs.meta | 12 +++++++ Assets/Scripts/Docs/README.md | 9 ++++++ Assets/Scripts/Docs/README.md.meta | 8 +++++ 12 files changed, 167 insertions(+) create mode 100644 Assets/Scripts/Docs.meta create mode 100644 Assets/Scripts/Docs/Camera.meta create mode 100644 Assets/Scripts/Docs/Camera/Camera_depthTextureMode.cs create mode 100644 Assets/Scripts/Docs/Camera/Camera_depthTextureMode.cs.meta create mode 100644 Assets/Scripts/Docs/Graphics.meta create mode 100644 Assets/Scripts/Docs/Graphics/Graphics_Blit.cs create mode 100644 Assets/Scripts/Docs/Graphics/Graphics_Blit.cs.meta create mode 100644 Assets/Scripts/Docs/MonoBehaviour.meta create mode 100644 Assets/Scripts/Docs/MonoBehaviour/MonoBehaviour_OnValidate.cs create mode 100644 Assets/Scripts/Docs/MonoBehaviour/MonoBehaviour_OnValidate.cs.meta create mode 100644 Assets/Scripts/Docs/README.md create mode 100644 Assets/Scripts/Docs/README.md.meta diff --git a/Assets/Scripts/Docs.meta b/Assets/Scripts/Docs.meta new file mode 100644 index 0000000..3717894 --- /dev/null +++ b/Assets/Scripts/Docs.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: a5f32495e2dec8f4f9793a3b0c2c16cc +folderAsset: yes +timeCreated: 1502256483 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Docs/Camera.meta b/Assets/Scripts/Docs/Camera.meta new file mode 100644 index 0000000..67ee210 --- /dev/null +++ b/Assets/Scripts/Docs/Camera.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: f156ebd0553293648ad08d0bb96d6a17 +folderAsset: yes +timeCreated: 1502256483 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Docs/Camera/Camera_depthTextureMode.cs b/Assets/Scripts/Docs/Camera/Camera_depthTextureMode.cs new file mode 100644 index 0000000..2b70930 --- /dev/null +++ b/Assets/Scripts/Docs/Camera/Camera_depthTextureMode.cs @@ -0,0 +1,21 @@ +// page https://docs.unity3d.com/ScriptReference/Camera-depthTextureMode.html +// usage: attach this script to Camera + +using UnityEngine; + +namespace UnityLibrary +{ + public class Camera_depthTextureMode : MonoBehaviour + { + void OnEnable() + { + var cam = GetComponent(); + if (cam!=null) + { + // enable camera depth texture + cam.depthTextureMode = DepthTextureMode.Depth; + } +// Debug.Log(Camera.main.depthTextureMode); + } + } +} diff --git a/Assets/Scripts/Docs/Camera/Camera_depthTextureMode.cs.meta b/Assets/Scripts/Docs/Camera/Camera_depthTextureMode.cs.meta new file mode 100644 index 0000000..98beb3d --- /dev/null +++ b/Assets/Scripts/Docs/Camera/Camera_depthTextureMode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 952055200907e8b4f95a7539f6d5607f +timeCreated: 1502256483 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Docs/Graphics.meta b/Assets/Scripts/Docs/Graphics.meta new file mode 100644 index 0000000..57ac596 --- /dev/null +++ b/Assets/Scripts/Docs/Graphics.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 8f51a49ed57226740a48b0c16003d736 +folderAsset: yes +timeCreated: 1502256483 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Docs/Graphics/Graphics_Blit.cs b/Assets/Scripts/Docs/Graphics/Graphics_Blit.cs new file mode 100644 index 0000000..6760898 --- /dev/null +++ b/Assets/Scripts/Docs/Graphics/Graphics_Blit.cs @@ -0,0 +1,32 @@ +using UnityEngine; +using System.Collections; + +// Example: Using Graphics.Blit to draw a full screen texture, with particle shader +// Usage: Attach to Main Camera +// Optional: Assign some texture into the displayTexture field in inspector + +namespace UnityLibrary +{ + public class Graphics_Blit : MonoBehaviour + { + public Texture displayTexture; // assign texture you want to blit fullscreen + Material mat; // material(shader) to use for blitting + + void Awake() + { + if (displayTexture == null) displayTexture = Texture2D.whiteTexture; // use white texture, if nothing is set + + // use particle shader for the Blit material + var shader = Shader.Find("Particles/Multiply (Double)"); + mat = new Material(shader); + } + + // This function is called only if the script is attached to the camera and is enabled + void OnPostRender() + { + // Copies source texture into destination render texture with a shader + // Destination RenderTexture is null to blit directly to screen + Graphics.Blit(displayTexture, null, mat); + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/Docs/Graphics/Graphics_Blit.cs.meta b/Assets/Scripts/Docs/Graphics/Graphics_Blit.cs.meta new file mode 100644 index 0000000..b9cc5b1 --- /dev/null +++ b/Assets/Scripts/Docs/Graphics/Graphics_Blit.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 57240369e62ddfe4f89dbf0b4462a1ea +timeCreated: 1502256483 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Docs/MonoBehaviour.meta b/Assets/Scripts/Docs/MonoBehaviour.meta new file mode 100644 index 0000000..e084d9a --- /dev/null +++ b/Assets/Scripts/Docs/MonoBehaviour.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 9855b6fa6f6a43b468a2c8bb672a64a6 +folderAsset: yes +timeCreated: 1502256483 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Docs/MonoBehaviour/MonoBehaviour_OnValidate.cs b/Assets/Scripts/Docs/MonoBehaviour/MonoBehaviour_OnValidate.cs new file mode 100644 index 0000000..6b0b99f --- /dev/null +++ b/Assets/Scripts/Docs/MonoBehaviour/MonoBehaviour_OnValidate.cs @@ -0,0 +1,25 @@ +using UnityEngine; +using System.Collections; + +// Example: Using OnValidate() to validate inspector fields in editor +// https://docs.unity3d.com/ScriptReference/MonoBehaviour.OnValidate.html + +namespace UnityLibrary +{ + public class MonoBehaviour_OnValidate : MonoBehaviour + { + // try setting this number larger than 100 in inspector + public float number = 0; + + // this gets called only in editor, when inspector field is modified + void OnValidate() + { + // you can print warnings also + // if (number < 0 || number > 100) Debug.LogWarning("OnValidate: number value is invalid.."); + + // clamp number to 0-100 + number = Mathf.Clamp(number, 0, 100); + } + } +} + diff --git a/Assets/Scripts/Docs/MonoBehaviour/MonoBehaviour_OnValidate.cs.meta b/Assets/Scripts/Docs/MonoBehaviour/MonoBehaviour_OnValidate.cs.meta new file mode 100644 index 0000000..8b2f5ef --- /dev/null +++ b/Assets/Scripts/Docs/MonoBehaviour/MonoBehaviour_OnValidate.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: a69f3fc609439c64381e334c508b0b82 +timeCreated: 1502256483 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Docs/README.md b/Assets/Scripts/Docs/README.md new file mode 100644 index 0000000..45f96a5 --- /dev/null +++ b/Assets/Scripts/Docs/README.md @@ -0,0 +1,9 @@ +# Docs +Sometimes we see some missing, outdated or broken documentations and examples at Unity official documentation Manual or Scripting API, so we have collected some of them and made a good examples and documentations about them. + +Do you found a missing documentation or example? [File it here and let us add it](https://github.com/UnityCommunity/UnityLibrary/issues) + +## License +[MIT](https://github.com/UnityCommunity/UnityLibrary/blob/master/LICENSE.md) @ [Unity Community](https://github.com/UnityCommunity/) + +Made with :heart: by [Unity Community](https://github.com/UnityCommunity/) diff --git a/Assets/Scripts/Docs/README.md.meta b/Assets/Scripts/Docs/README.md.meta new file mode 100644 index 0000000..2d208e8 --- /dev/null +++ b/Assets/Scripts/Docs/README.md.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2d99c632bd78fa748850ab71f0eed232 +timeCreated: 1502256483 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: From d34e774ef59c1ea2fd2a155d804d23b6bc534b34 Mon Sep 17 00:00:00 2001 From: unitycoder Date: Wed, 9 Aug 2017 21:11:17 +0800 Subject: [PATCH 088/231] delete duplicate folders --- Docs/Camera/Camera_depthTextureMode.cs | 21 ------------------- Docs/Graphics/Graphics_Blit.cs | 29 -------------------------- Docs/README.md | 9 -------- 3 files changed, 59 deletions(-) delete mode 100644 Docs/Camera/Camera_depthTextureMode.cs delete mode 100644 Docs/Graphics/Graphics_Blit.cs delete mode 100644 Docs/README.md diff --git a/Docs/Camera/Camera_depthTextureMode.cs b/Docs/Camera/Camera_depthTextureMode.cs deleted file mode 100644 index 2b70930..0000000 --- a/Docs/Camera/Camera_depthTextureMode.cs +++ /dev/null @@ -1,21 +0,0 @@ -// page https://docs.unity3d.com/ScriptReference/Camera-depthTextureMode.html -// usage: attach this script to Camera - -using UnityEngine; - -namespace UnityLibrary -{ - public class Camera_depthTextureMode : MonoBehaviour - { - void OnEnable() - { - var cam = GetComponent(); - if (cam!=null) - { - // enable camera depth texture - cam.depthTextureMode = DepthTextureMode.Depth; - } -// Debug.Log(Camera.main.depthTextureMode); - } - } -} diff --git a/Docs/Graphics/Graphics_Blit.cs b/Docs/Graphics/Graphics_Blit.cs deleted file mode 100644 index a195b90..0000000 --- a/Docs/Graphics/Graphics_Blit.cs +++ /dev/null @@ -1,29 +0,0 @@ -using UnityEngine; -using System.Collections; - -// Example: Using Graphics.Blit to draw a full screen texture, with particle shader -// Usage: Attach to Main Camera -// Optional: Assign some texture into the displayTexture field in inspector - -public class Graphics_Blit : MonoBehaviour -{ - public Texture displayTexture; // assign texture you want to blit fullscreen - Material mat; // material(shader) to use for blitting - - void Awake() - { - if (displayTexture == null) displayTexture = Texture2D.whiteTexture; // use white texture, if nothing is set - - // use particle shader for the Blit material - var shader = Shader.Find("Particles/Multiply (Double)"); - mat = new Material(shader); - } - - // This function is called only if the script is attached to the camera and is enabled - void OnPostRender() - { - // Copies source texture into destination render texture with a shader - // Destination RenderTexture is null to blit directly to screen - Graphics.Blit(displayTexture, null, mat); - } -} diff --git a/Docs/README.md b/Docs/README.md deleted file mode 100644 index 45f96a5..0000000 --- a/Docs/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# Docs -Sometimes we see some missing, outdated or broken documentations and examples at Unity official documentation Manual or Scripting API, so we have collected some of them and made a good examples and documentations about them. - -Do you found a missing documentation or example? [File it here and let us add it](https://github.com/UnityCommunity/UnityLibrary/issues) - -## License -[MIT](https://github.com/UnityCommunity/UnityLibrary/blob/master/LICENSE.md) @ [Unity Community](https://github.com/UnityCommunity/) - -Made with :heart: by [Unity Community](https://github.com/UnityCommunity/) From c1a416ea4f909b30f5340e7838de05496677a068 Mon Sep 17 00:00:00 2001 From: mika Date: Wed, 9 Aug 2017 21:14:05 +0800 Subject: [PATCH 089/231] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6183d23..d0cef11 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ or you can find useful stuff by [browsing awesome resources in the below](#resou ## Content -- [Docs/](https://github.com/UnityCommunity/UnityLibrary/tree/master/Docs) : A small replacement for missing Unity documentations. +- [Docs/](https://github.com/UnityCommunity/UnityLibrary/tree/master/Assets/Scripts/Docs) : "Missing" examples from Unity Docs. - [Assets/Scripts/](https://github.com/UnityCommunity/UnityLibrary/tree/master/Assets/Scripts) : Complete set of Unity scripts. - [Assets/Scripts/Editor/](https://github.com/UnityCommunity/UnityLibrary/tree/master/Assets/Scripts/Editor) : Editor related scripts. - [Assets/Shaders/](https://github.com/UnityCommunity/UnityLibrary/tree/master/Assets/Shaders) : Ready-to-use shaders. From 900b51defc848122f4badc89a4bf17dcb7be3a71 Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Thu, 10 Aug 2017 20:07:30 +0430 Subject: [PATCH 090/231] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d0cef11..cdf2f21 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ or you can find useful stuff by [browsing awesome resources in the below](#resou ## Content -- [Docs/](https://github.com/UnityCommunity/UnityLibrary/tree/master/Assets/Scripts/Docs) : "Missing" examples from Unity Docs. +- [Assets/Scripts/Docs/](https://github.com/UnityCommunity/UnityLibrary/tree/master/Assets/Scripts/Docs) : "Missing" examples from Unity Docs. - [Assets/Scripts/](https://github.com/UnityCommunity/UnityLibrary/tree/master/Assets/Scripts) : Complete set of Unity scripts. - [Assets/Scripts/Editor/](https://github.com/UnityCommunity/UnityLibrary/tree/master/Assets/Scripts/Editor) : Editor related scripts. - [Assets/Shaders/](https://github.com/UnityCommunity/UnityLibrary/tree/master/Assets/Shaders) : Ready-to-use shaders. From 7dd2abe5e9d11af043785fd58f8db7f3cae9e2e4 Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Sat, 19 Aug 2017 20:10:37 +0430 Subject: [PATCH 091/231] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cdf2f21..53d44ae 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ You can [browse this repository](#content) and find your desired utility or you git clone https://github.com/UnityCommunity/UnityLibrary.git ``` -or you can find useful stuff by [browsing awesome resources in the below](#resources). +and then open the folder in unity or you can find useful stuff by [browsing awesome resources in the below](#resources). [:sparkles: Contribution is Welcome](#contribution) From 96cafec33229ddb2ead5c48107bc9b11724b3582 Mon Sep 17 00:00:00 2001 From: mika Date: Wed, 30 Aug 2017 22:32:43 +0800 Subject: [PATCH 092/231] Create CanvasRenderMode.cs --- .../Docs/UnityEngine/CanvasRenderMode.cs | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 Assets/Scripts/Docs/UnityEngine/CanvasRenderMode.cs diff --git a/Assets/Scripts/Docs/UnityEngine/CanvasRenderMode.cs b/Assets/Scripts/Docs/UnityEngine/CanvasRenderMode.cs new file mode 100644 index 0000000..a8b26ca --- /dev/null +++ b/Assets/Scripts/Docs/UnityEngine/CanvasRenderMode.cs @@ -0,0 +1,40 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +// usage: Attach this script to gameobject with Canvas component +// click mouse button to switch modes *note: worldspace will not be visible without scaling it +// https://docs.unity3d.com/ScriptReference/Canvas-renderMode.html + +namespace UnityLibrary +{ + public class CanvasRenderMode : MonoBehaviour + { + Canvas canvas; + + void Start() + { + canvas = GetComponent(); + if (canvas == null) + { + Debug.LogError("Canvas not found..", gameObject); + this.enabled = false; + } + } + + void Update() + { + // switch modes on left mouse click + if (Input.GetMouseButtonDown(0)) + { + if (canvas.renderMode != RenderMode.WorldSpace) + { + canvas.renderMode = RenderMode.WorldSpace; + } else + { + canvas.renderMode = RenderMode.ScreenSpaceOverlay; + } + } + } + } +} From 35d9e61d5cd455ef7a9f64633adf55ce9ebd4d83 Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Sat, 16 Sep 2017 12:39:22 +0430 Subject: [PATCH 093/231] Create Singleton.cs --- Assets/Scripts/Utilities/Singleton.cs | 63 +++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 Assets/Scripts/Utilities/Singleton.cs diff --git a/Assets/Scripts/Utilities/Singleton.cs b/Assets/Scripts/Utilities/Singleton.cs new file mode 100644 index 0000000..0a6d2b1 --- /dev/null +++ b/Assets/Scripts/Utilities/Singleton.cs @@ -0,0 +1,63 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public abstract class Singleton : MonoBehaviour where T : Component +{ + + #region Fields + + /// + /// The instance. + /// + private static T instance; + + #endregion + + #region Properties + + /// + /// Gets the instance. + /// + /// The instance. + public static T Instance + { + get + { + if ( instance == null ) + { + instance = FindObjectOfType (); + if ( instance == null ) + { + GameObject obj = new GameObject (); + obj.name = typeof ( T ).Name; + instance = obj.AddComponent (); + } + } + return instance; + } + } + + #endregion + + #region Methods + + /// + /// Use this for initialization. + /// + protected virtual void Awake () + { + if ( instance == null ) + { + instance = this as T; + DontDestroyOnLoad ( gameObject ); + } + else + { + Destroy ( gameObject ); + } + } + + #endregion + +} From e02307aeafd48cfd1828bdc9bcac89323d24d0e9 Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Sat, 16 Sep 2017 12:42:01 +0430 Subject: [PATCH 094/231] Update README.md --- README.md | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 53d44ae..fffe7a5 100644 --- a/README.md +++ b/README.md @@ -6,14 +6,6 @@ Useful scripts, snippets and shaders here it is gathered for free. We have collected most scripts from external sources like Unity Communities (Forums, Answers) and we made it ourselves a little. -## Call for Help - -[:star: Help us update our old scripts](https://github.com/UnityCommunity/UnityLibrary/issues/15) - -[:star2: Help us update our old shaders](https://github.com/UnityCommunity/UnityLibrary/issues/14) - -You can post the old scripts, shaders, ... names to us and we will update them, or you can update them yourself and make a pull request. - ## Getting Started This repository contains all kind of utilities for Unity from scripts to shaders. @@ -53,6 +45,8 @@ Awesome and Useful Unity Resources: [:video_game: Games On GitHub](https://github.com/leereilly/games/) +[:star: Unity Singleton](https://github.com/UnityCommunity/UnitySingleton) + ## Contribution Any contribution to this repository are welcome. From a090e4bbecd3353e619e02844dc56b7da59cad5e Mon Sep 17 00:00:00 2001 From: mika Date: Wed, 4 Oct 2017 19:27:26 +0800 Subject: [PATCH 095/231] Create Additive-ScrollingUV.shader --- .../LineRenderer/Additive-ScrollingUV.shader | 89 +++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 Assets/Shaders/LineRenderer/Additive-ScrollingUV.shader diff --git a/Assets/Shaders/LineRenderer/Additive-ScrollingUV.shader b/Assets/Shaders/LineRenderer/Additive-ScrollingUV.shader new file mode 100644 index 0000000..d64a66b --- /dev/null +++ b/Assets/Shaders/LineRenderer/Additive-ScrollingUV.shader @@ -0,0 +1,89 @@ +// Unity built-in shader source. Copyright (c) 2016 Unity Technologies. MIT license + +Shader "UnityLibrary/Particles/Additive Scrolling UV" { +Properties { + _TintColor ("Tint Color", Color) = (0.5,0.5,0.5,0.5) + _MainTex ("Particle Texture", 2D) = "white" {} + _InvFade ("Soft Particles Factor", Range(0.01,3.0)) = 1.0 + _ScrollingSpeed("Scrolling Speed",float) = 2 +} + +Category { + Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" "PreviewType"="Plane" } + Blend SrcAlpha One + ColorMask RGB + Cull Off Lighting Off ZWrite Off + + SubShader { + Pass { + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma target 2.0 + #pragma multi_compile_particles + #pragma multi_compile_fog + + #include "UnityCG.cginc" + + sampler2D _MainTex; + fixed4 _TintColor; + float _ScrollingSpeed; + + struct appdata_t { + float4 vertex : POSITION; + fixed4 color : COLOR; + float2 texcoord : TEXCOORD0; + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct v2f { + float4 vertex : SV_POSITION; + fixed4 color : COLOR; + float2 texcoord : TEXCOORD0; + UNITY_FOG_COORDS(1) + #ifdef SOFTPARTICLES_ON + float4 projPos : TEXCOORD2; + #endif + UNITY_VERTEX_OUTPUT_STEREO + }; + + float4 _MainTex_ST; + + v2f vert (appdata_t v) + { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + o.vertex = UnityObjectToClipPos(v.vertex); + #ifdef SOFTPARTICLES_ON + o.projPos = ComputeScreenPos (o.vertex); + COMPUTE_EYEDEPTH(o.projPos.z); + #endif + o.color = v.color; + o.texcoord = TRANSFORM_TEX(v.texcoord,_MainTex); + UNITY_TRANSFER_FOG(o,o.vertex); + return o; + } + + UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture); + float _InvFade; + + fixed4 frag (v2f i) : SV_Target + { + #ifdef SOFTPARTICLES_ON + float sceneZ = LinearEyeDepth (SAMPLE_DEPTH_TEXTURE_PROJ(_CameraDepthTexture, UNITY_PROJ_COORD(i.projPos))); + float partZ = i.projPos.z; + float fade = saturate (_InvFade * (sceneZ-partZ)); + i.color.a *= fade; + #endif + + fixed4 col = 2.0f * i.color * _TintColor * tex2D(_MainTex, float2(i.texcoord.x+_Time.x*_ScrollingSpeed,i.texcoord.y)); + UNITY_APPLY_FOG_COLOR(i.fogCoord, col, fixed4(0,0,0,0)); // fog towards black due to our blend mode + return col; + } + ENDCG + } + } +} +} From f482d7bb85cd8f4340625849bf7fec201df355ae Mon Sep 17 00:00:00 2001 From: mika Date: Thu, 12 Oct 2017 15:53:57 +0800 Subject: [PATCH 096/231] Create GetSelectedMeshInfo --- .../Scripts/Editor/Tools/GetSelectedMeshInfo | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 Assets/Scripts/Editor/Tools/GetSelectedMeshInfo diff --git a/Assets/Scripts/Editor/Tools/GetSelectedMeshInfo b/Assets/Scripts/Editor/Tools/GetSelectedMeshInfo new file mode 100644 index 0000000..06aba89 --- /dev/null +++ b/Assets/Scripts/Editor/Tools/GetSelectedMeshInfo @@ -0,0 +1,52 @@ +// display selected gameobject mesh stats (should work on prefabs,models in project window also) + +using UnityEditor; +using UnityEngine; + +namespace UnityLibrary +{ + public class GetSelectedMeshInfo : EditorWindow + { + [MenuItem("Tools/UnityLibrary/GetMeshInfo")] + public static void ShowWindow() + { + var window = GetWindow(typeof(GetSelectedMeshInfo)); + window.titleContent = new GUIContent("MeshInfo"); + } + + void OnGUI() + { + var selection = Selection.activeGameObject; + + if (selection != null) + { + EditorGUILayout.LabelField("Selected: " + selection.name); + + int totalMeshes = 0; + int totalVertices = 0; + int totalTris = 0; + + // get all meshes + var meshes = selection.GetComponentsInChildren(); + for (int i = 0, length = meshes.Length; i < length; i++) + { + totalVertices += meshes[i].sharedMesh.vertexCount; + totalTris += meshes[i].sharedMesh.triangles.Length; + totalMeshes++; + } + + // display stats + EditorGUILayout.LabelField("Meshes: " + totalMeshes); + EditorGUILayout.LabelField("Vertices: " + totalVertices); + EditorGUILayout.LabelField("Triangles: " + totalTris); + } + + } + + void OnSelectionChange() + { + // force redraw window + Repaint(); + } + } +} From d6ce671c0d76a17529bbccf866d305158be6fc8d Mon Sep 17 00:00:00 2001 From: mika Date: Thu, 12 Oct 2017 15:54:12 +0800 Subject: [PATCH 097/231] Rename GetSelectedMeshInfo to GetSelectedMeshInfo.cs --- .../Editor/Tools/{GetSelectedMeshInfo => GetSelectedMeshInfo.cs} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Assets/Scripts/Editor/Tools/{GetSelectedMeshInfo => GetSelectedMeshInfo.cs} (100%) diff --git a/Assets/Scripts/Editor/Tools/GetSelectedMeshInfo b/Assets/Scripts/Editor/Tools/GetSelectedMeshInfo.cs similarity index 100% rename from Assets/Scripts/Editor/Tools/GetSelectedMeshInfo rename to Assets/Scripts/Editor/Tools/GetSelectedMeshInfo.cs From a016c2be5fee8d5f0bcb719de79cc512a72b257c Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Sat, 21 Oct 2017 15:23:20 +0330 Subject: [PATCH 098/231] Create AddDefineSymbols.cs --- Assets/Scripts/Editor/AddDefineSymbols.cs | 36 +++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 Assets/Scripts/Editor/AddDefineSymbols.cs diff --git a/Assets/Scripts/Editor/AddDefineSymbols.cs b/Assets/Scripts/Editor/AddDefineSymbols.cs new file mode 100644 index 0000000..d04e951 --- /dev/null +++ b/Assets/Scripts/Editor/AddDefineSymbols.cs @@ -0,0 +1,36 @@ +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using UnityEngine; +using UnityEditor; + +/// +/// Adds the given define symbols to PlayerSettings define symbols. +/// Just add your own define symbols to the Symbols property at the below. +/// +[InitializeOnLoad] +public class AddDefineSymbols : Editor +{ + + /// + /// Symbols that will be added to the editor + /// + public static readonly string [] Symbols = new string[] { + "MYCOMPANY", + "MYCOMPANY_MYPACKAGE" + }; + + /// + /// Add define symbols as soon as Unity gets done compiling. + /// + static AddDefineSymbols () + { + string definesString = PlayerSettings.GetScriptingDefineSymbolsForGroup ( EditorUserBuildSettings.selectedBuildTargetGroup ); + List allDefines = definesString.Split ( ';' ).ToList (); + allDefines.AddRange ( Symbols.Except ( allDefines ) ); + PlayerSettings.SetScriptingDefineSymbolsForGroup ( + EditorUserBuildSettings.selectedBuildTargetGroup, + string.Join ( ";", allDefines.ToArray () ) ); + } + +} From 540b31ab5eb4c54b266a56080ff44a300efd7b8a Mon Sep 17 00:00:00 2001 From: mika Date: Mon, 30 Oct 2017 16:07:05 +0800 Subject: [PATCH 099/231] Create MassRenameChildren.cs --- .../Editor/BatchTools/MassRenameChildren.cs | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 Assets/Scripts/Editor/BatchTools/MassRenameChildren.cs diff --git a/Assets/Scripts/Editor/BatchTools/MassRenameChildren.cs b/Assets/Scripts/Editor/BatchTools/MassRenameChildren.cs new file mode 100644 index 0000000..41adfb4 --- /dev/null +++ b/Assets/Scripts/Editor/BatchTools/MassRenameChildren.cs @@ -0,0 +1,44 @@ +// Renames child gameobjects in hierarchy (by replacting strings) +// open wizard from GameObject/MassRenameChildren menu item + +using UnityEditor; +using UnityEngine; + +namespace UnityLibrary +{ + public class MassRenameChildren : ScriptableWizard + { + public string findString = ""; + public string replaceWith = ""; + + [MenuItem("GameObject/Mass Rename Children")] + static void CreateWizard() + { + DisplayWizard("MassRenamer", "Apply"); + } + + // user clicked create button + void OnWizardCreate() + { + if (Selection.activeTransform == null || findString == "") + { + Debug.Log(name + " Select Root Transform and set FindString first.."); + return; + } + + // get all children for the selection, NOTE: includeInactive is true, so disabled objects will get selected also + Transform[] allChildren = Selection.activeTransform.GetComponentsInChildren(includeInactive: true); + foreach (Transform child in allChildren) + { + // skip self (selection root) + if (child != Selection.activeTransform) + { + var newName = child.name.Replace(findString, replaceWith); + Debug.LogFormat("Before: {0} | After: {1}", child.name, newName); + child.name = newName; + } + } + } + + } +} From 61d4d437242614b9044ff046ea073ed13cf90d27 Mon Sep 17 00:00:00 2001 From: mika Date: Tue, 31 Oct 2017 12:36:15 +0800 Subject: [PATCH 100/231] Update MassRenameChildren.cs --- .../Editor/BatchTools/MassRenameChildren.cs | 25 ++++++++++++++++--- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/Assets/Scripts/Editor/BatchTools/MassRenameChildren.cs b/Assets/Scripts/Editor/BatchTools/MassRenameChildren.cs index 41adfb4..cfcf9d4 100644 --- a/Assets/Scripts/Editor/BatchTools/MassRenameChildren.cs +++ b/Assets/Scripts/Editor/BatchTools/MassRenameChildren.cs @@ -10,6 +10,8 @@ public class MassRenameChildren : ScriptableWizard { public string findString = ""; public string replaceWith = ""; + // if set false: would replace "Hand" inside "RightHandRig", if set true: would replace "Hand" only if name starts with "Hand" like "HandRigWasd" + public bool onlyIfStartsWithFindString = true; [MenuItem("GameObject/Mass Rename Children")] static void CreateWizard() @@ -33,12 +35,27 @@ void OnWizardCreate() // skip self (selection root) if (child != Selection.activeTransform) { - var newName = child.name.Replace(findString, replaceWith); - Debug.LogFormat("Before: {0} | After: {1}", child.name, newName); - child.name = newName; + string newName = child.name; + if (onlyIfStartsWithFindString == true) + { + // string starts with our search string + if (child.name.IndexOf(findString) == 0) + { + newName = child.name.Replace(findString, replaceWith); + } + } else // replace anywhere in target string + { + newName = child.name.Replace(findString, replaceWith); + } + + // if would have any changes to name, print out and change + if (child.name != newName) + { + Debug.LogFormat("Before: {0} | After: {1}", child.name, newName); + child.name = newName; + } } } } - } } From 1dbe5d8b8e3219743def5931a851b5766eb8cddf Mon Sep 17 00:00:00 2001 From: smkplus Date: Sat, 25 Nov 2017 16:22:32 +0330 Subject: [PATCH 101/231] Improving Shaders Delete unuseful shaders --- .vscode/settings.json | 56 +++++++++++ Assets/New Material.mat | 76 ++++++++++++++ Assets/New Material.mat.meta | 9 ++ Assets/Scenes/Test.unity | 84 +++++++++++++++- Assets/Scripts/2D/Follow2DRigidbody.cs.meta | 12 +++ .../Docs/UnityEngine.meta} | 4 +- .../Docs/UnityEngine/CanvasRenderMode.cs.meta | 12 +++ .../Scripts/Editor/AddDefineSymbols.cs.meta | 12 +++ .../Editor/BatchTools.meta} | 4 +- .../BatchTools/MassRenameChildren.cs.meta | 12 +++ Assets/Scripts/Editor/HelpLastRelease.cs.meta | 12 +++ .../Editor/Tools/GetSelectedMeshInfo.cs.meta | 12 +++ Assets/{Shaders => Scripts}/ImageEffects.meta | 0 .../ImageEffects/GrayscaleLayers.cs | 0 .../ImageEffects/GrayscaleLayers.cs.meta | 0 .../Mask.meta => Scripts/Utilities.meta} | 4 +- Assets/Scripts/Utilities/Singleton.cs.meta | 12 +++ Assets/Shaders/{Effects => }/2D.meta | 4 +- Assets/Shaders/{ => 2D}/Effects.meta | 0 Assets/Shaders/{ => 2D}/Effects/Glow.shader | 0 .../Shaders/{ => 2D}/Effects/Glow.shader.meta | 0 .../Shaders/{ => 2D}/Effects/Highlight.shader | 0 .../{ => 2D}/Effects/Highlight.shader.meta | 0 .../Shaders/{ => 2D}/Effects/ToonIce.shader | 0 .../{ => 2D}/Effects/ToonIce.shader.meta | 0 .../Shaders/{ => 2D}/Effects/WireFrame.shader | 1 + .../{ => 2D}/Effects/WireFrame.shader.meta | 0 Assets/Shaders/2D/LineRenderer.meta | 9 ++ .../LineRenderer/Additive-ScrollingUV.shader | 0 .../Additive-ScrollingUV.shader.meta} | 4 +- Assets/Shaders/{ => 2D}/Sprites.meta | 0 Assets/Shaders/2D/Sprites/Outline2D.shader | 77 ++++++++++++++ .../Sprites/Outline2D.shader.meta} | 4 +- .../{ => 2D}/Sprites/SpriteDropShadow.shader | 0 .../Sprites/SpriteDropShadow.shader.meta | 0 .../{ => 2D}/Sprites/SpriteHDRBloom.shader | 0 .../Sprites/SpriteHDRBloom.shader.meta | 0 Assets/Shaders/{ => 2D}/UI.meta | 0 .../{ => 2D}/UI/UI_Always_On_Top.shader | 0 .../{ => 2D}/UI/UI_Always_On_Top.shader.meta | 0 Assets/Shaders/3D.meta | 9 ++ Assets/Shaders/{ => 3D}/Debug.meta | 0 .../Debug/DebugNormalsTangents.shader | 0 .../Debug/DebugNormalsTangents.shader.meta | 0 .../Debug/LerpColorNearToFarPlane.shader | 0 .../Debug/LerpColorNearToFarPlane.shader.meta | 0 Assets/Shaders/3D/Reflection.meta | 9 ++ .../{ => 3D/Reflection}/Reflective.meta | 0 .../Reflective/BumpedSpecularFresnel.shader | 0 .../BumpedSpecularFresnel.shader.meta | 0 .../{ => 3D/Reflection}/ReliefMapping.meta | 0 .../ReliefMapping/ReliefMapping.shader | 0 .../ReliefMapping/ReliefMapping.shader.meta | 0 Assets/Shaders/{ => 3D}/SkyBox.meta | 0 .../{ => 3D}/SkyBox/Cubemap-Simple.shader | 0 .../SkyBox/Cubemap-Simple.shader.meta | 0 Assets/Shaders/{ => 3D}/Terrain.meta | 0 .../Terrain/Splatmask4Textures.shader | 0 .../Terrain/Splatmask4Textures.shader.meta | 0 Assets/Shaders/{ => 3D}/Terrain/Trees.meta | 0 .../Terrain/Trees/Unity-BillboardTree.shader | 0 .../Trees/Unity-BillboardTree.shader.meta | 0 Assets/Shaders/{ => 3D}/TextureMapping.meta | 0 .../TextureMapping/Equirectangular.shader | 0 .../Equirectangular.shader.meta | 0 Assets/Shaders/{ => 3D}/Unlit.meta | 0 .../Unlit/UnlitTransparentColor.shader | 0 .../Unlit/UnlitTransparentColor.shader.meta | 0 .../UnlitTransparentColorGradient.shader | 0 .../UnlitTransparentColorGradient.shader.meta | 0 Assets/Shaders/{ => 3D}/Vertex.meta | 0 .../{ => 3D}/Vertex/VertexColorMesh.shader | 0 .../Vertex/VertexColorMesh.shader.meta | 0 .../Shaders/Effects/2D/ExplosionCircle.shader | 44 -------- .../Effects/2D/ExplosionCircle.shader.meta | 9 -- .../Shaders/Effects/AlphaBlendMasked.shader | 88 ---------------- Assets/Shaders/Mask/DepthMask.shader | 11 -- Assets/Shaders/Vertex/UnlitFakeCurved.shader | 72 ------------- .../Vertex/UnlitFakeCurved.shader.meta | 9 -- .../UnlitTransparentColorGradient.shader | 95 ------------------ .../UnlitTransparentColorGradient.shader.meta | 9 -- Assets/Square.png | Bin 0 -> 78 bytes Assets/Square.png.meta | 82 +++++++++++++++ Assets/latest.png | Bin 0 -> 198487 bytes Assets/latest.png.meta | 82 +++++++++++++++ ProjectSettings/ProjectSettings.asset | 3 +- 86 files changed, 591 insertions(+), 351 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 Assets/New Material.mat create mode 100644 Assets/New Material.mat.meta create mode 100644 Assets/Scripts/2D/Follow2DRigidbody.cs.meta rename Assets/{Editor/Tests/Edit Mode.meta => Scripts/Docs/UnityEngine.meta} (67%) create mode 100644 Assets/Scripts/Docs/UnityEngine/CanvasRenderMode.cs.meta create mode 100644 Assets/Scripts/Editor/AddDefineSymbols.cs.meta rename Assets/{Editor/Tests/Play Mode.meta => Scripts/Editor/BatchTools.meta} (67%) create mode 100644 Assets/Scripts/Editor/BatchTools/MassRenameChildren.cs.meta create mode 100644 Assets/Scripts/Editor/HelpLastRelease.cs.meta create mode 100644 Assets/Scripts/Editor/Tools/GetSelectedMeshInfo.cs.meta rename Assets/{Shaders => Scripts}/ImageEffects.meta (100%) rename Assets/{Shaders => Scripts}/ImageEffects/GrayscaleLayers.cs (100%) rename Assets/{Shaders => Scripts}/ImageEffects/GrayscaleLayers.cs.meta (100%) rename Assets/{Shaders/Mask.meta => Scripts/Utilities.meta} (67%) create mode 100644 Assets/Scripts/Utilities/Singleton.cs.meta rename Assets/Shaders/{Effects => }/2D.meta (67%) rename Assets/Shaders/{ => 2D}/Effects.meta (100%) rename Assets/Shaders/{ => 2D}/Effects/Glow.shader (100%) rename Assets/Shaders/{ => 2D}/Effects/Glow.shader.meta (100%) rename Assets/Shaders/{ => 2D}/Effects/Highlight.shader (100%) rename Assets/Shaders/{ => 2D}/Effects/Highlight.shader.meta (100%) rename Assets/Shaders/{ => 2D}/Effects/ToonIce.shader (100%) rename Assets/Shaders/{ => 2D}/Effects/ToonIce.shader.meta (100%) rename Assets/Shaders/{ => 2D}/Effects/WireFrame.shader (99%) rename Assets/Shaders/{ => 2D}/Effects/WireFrame.shader.meta (100%) create mode 100644 Assets/Shaders/2D/LineRenderer.meta rename Assets/Shaders/{ => 2D}/LineRenderer/Additive-ScrollingUV.shader (100%) rename Assets/Shaders/{Effects/AlphaBlendMasked.shader.meta => 2D/LineRenderer/Additive-ScrollingUV.shader.meta} (67%) rename Assets/Shaders/{ => 2D}/Sprites.meta (100%) create mode 100644 Assets/Shaders/2D/Sprites/Outline2D.shader rename Assets/Shaders/{Mask/DepthMask.shader.meta => 2D/Sprites/Outline2D.shader.meta} (67%) rename Assets/Shaders/{ => 2D}/Sprites/SpriteDropShadow.shader (100%) rename Assets/Shaders/{ => 2D}/Sprites/SpriteDropShadow.shader.meta (100%) rename Assets/Shaders/{ => 2D}/Sprites/SpriteHDRBloom.shader (100%) rename Assets/Shaders/{ => 2D}/Sprites/SpriteHDRBloom.shader.meta (100%) rename Assets/Shaders/{ => 2D}/UI.meta (100%) rename Assets/Shaders/{ => 2D}/UI/UI_Always_On_Top.shader (100%) rename Assets/Shaders/{ => 2D}/UI/UI_Always_On_Top.shader.meta (100%) create mode 100644 Assets/Shaders/3D.meta rename Assets/Shaders/{ => 3D}/Debug.meta (100%) rename Assets/Shaders/{ => 3D}/Debug/DebugNormalsTangents.shader (100%) rename Assets/Shaders/{ => 3D}/Debug/DebugNormalsTangents.shader.meta (100%) rename Assets/Shaders/{ => 3D}/Debug/LerpColorNearToFarPlane.shader (100%) rename Assets/Shaders/{ => 3D}/Debug/LerpColorNearToFarPlane.shader.meta (100%) create mode 100644 Assets/Shaders/3D/Reflection.meta rename Assets/Shaders/{ => 3D/Reflection}/Reflective.meta (100%) rename Assets/Shaders/{ => 3D/Reflection}/Reflective/BumpedSpecularFresnel.shader (100%) rename Assets/Shaders/{ => 3D/Reflection}/Reflective/BumpedSpecularFresnel.shader.meta (100%) rename Assets/Shaders/{ => 3D/Reflection}/ReliefMapping.meta (100%) rename Assets/Shaders/{ => 3D/Reflection}/ReliefMapping/ReliefMapping.shader (100%) rename Assets/Shaders/{ => 3D/Reflection}/ReliefMapping/ReliefMapping.shader.meta (100%) rename Assets/Shaders/{ => 3D}/SkyBox.meta (100%) rename Assets/Shaders/{ => 3D}/SkyBox/Cubemap-Simple.shader (100%) rename Assets/Shaders/{ => 3D}/SkyBox/Cubemap-Simple.shader.meta (100%) rename Assets/Shaders/{ => 3D}/Terrain.meta (100%) rename Assets/Shaders/{ => 3D}/Terrain/Splatmask4Textures.shader (100%) rename Assets/Shaders/{ => 3D}/Terrain/Splatmask4Textures.shader.meta (100%) rename Assets/Shaders/{ => 3D}/Terrain/Trees.meta (100%) rename Assets/Shaders/{ => 3D}/Terrain/Trees/Unity-BillboardTree.shader (100%) rename Assets/Shaders/{ => 3D}/Terrain/Trees/Unity-BillboardTree.shader.meta (100%) rename Assets/Shaders/{ => 3D}/TextureMapping.meta (100%) rename Assets/Shaders/{ => 3D}/TextureMapping/Equirectangular.shader (100%) rename Assets/Shaders/{ => 3D}/TextureMapping/Equirectangular.shader.meta (100%) rename Assets/Shaders/{ => 3D}/Unlit.meta (100%) rename Assets/Shaders/{ => 3D}/Unlit/UnlitTransparentColor.shader (100%) rename Assets/Shaders/{ => 3D}/Unlit/UnlitTransparentColor.shader.meta (100%) rename Assets/Shaders/{ => 3D}/Unlit/UnlitTransparentColorGradient.shader (100%) rename Assets/Shaders/{ => 3D}/Unlit/UnlitTransparentColorGradient.shader.meta (100%) rename Assets/Shaders/{ => 3D}/Vertex.meta (100%) rename Assets/Shaders/{ => 3D}/Vertex/VertexColorMesh.shader (100%) rename Assets/Shaders/{ => 3D}/Vertex/VertexColorMesh.shader.meta (100%) delete mode 100644 Assets/Shaders/Effects/2D/ExplosionCircle.shader delete mode 100644 Assets/Shaders/Effects/2D/ExplosionCircle.shader.meta delete mode 100644 Assets/Shaders/Effects/AlphaBlendMasked.shader delete mode 100644 Assets/Shaders/Mask/DepthMask.shader delete mode 100644 Assets/Shaders/Vertex/UnlitFakeCurved.shader delete mode 100644 Assets/Shaders/Vertex/UnlitFakeCurved.shader.meta delete mode 100644 Assets/Shaders/Vertex/UnlitTransparentColorGradient.shader delete mode 100644 Assets/Shaders/Vertex/UnlitTransparentColorGradient.shader.meta create mode 100644 Assets/Square.png create mode 100644 Assets/Square.png.meta create mode 100644 Assets/latest.png create mode 100644 Assets/latest.png.meta diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..4edd970 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,56 @@ +{ + "files.exclude": + { + "**/.DS_Store":true, + "**/.git":true, + "**/.gitignore":true, + "**/.gitmodules":true, + "**/*.booproj":true, + "**/*.pidb":true, + "**/*.suo":true, + "**/*.user":true, + "**/*.userprefs":true, + "**/*.unityproj":true, + "**/*.dll":true, + "**/*.exe":true, + "**/*.pdf":true, + "**/*.mid":true, + "**/*.midi":true, + "**/*.wav":true, + "**/*.gif":true, + "**/*.ico":true, + "**/*.jpg":true, + "**/*.jpeg":true, + "**/*.png":true, + "**/*.psd":true, + "**/*.tga":true, + "**/*.tif":true, + "**/*.tiff":true, + "**/*.3ds":true, + "**/*.3DS":true, + "**/*.fbx":true, + "**/*.FBX":true, + "**/*.lxo":true, + "**/*.LXO":true, + "**/*.ma":true, + "**/*.MA":true, + "**/*.obj":true, + "**/*.OBJ":true, + "**/*.asset":true, + "**/*.cubemap":true, + "**/*.flare":true, + "**/*.mat":true, + "**/*.meta":true, + "**/*.prefab":true, + "**/*.unity":true, + "build/":true, + "Build/":true, + "Library/":true, + "library/":true, + "obj/":true, + "Obj/":true, + "ProjectSettings/":true, + "temp/":true, + "Temp/":true + } +} \ No newline at end of file diff --git a/Assets/New Material.mat b/Assets/New Material.mat new file mode 100644 index 0000000..2791eb4 --- /dev/null +++ b/Assets/New Material.mat @@ -0,0 +1,76 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: New Material + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/New Material.mat.meta b/Assets/New Material.mat.meta new file mode 100644 index 0000000..d92c394 --- /dev/null +++ b/Assets/New Material.mat.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 4c6986c28f60385499d74b72699378e1 +timeCreated: 1511613281 +licenseType: Free +NativeFormatImporter: + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scenes/Test.unity b/Assets/Scenes/Test.unity index 4533bed..97d6285 100644 --- a/Assets/Scenes/Test.unity +++ b/Assets/Scenes/Test.unity @@ -38,7 +38,7 @@ RenderSettings: m_ReflectionIntensity: 1 m_CustomReflection: {fileID: 0} m_Sun: {fileID: 0} - m_IndirectSpecularColor: {r: 0.44657868, g: 0.49641263, b: 0.57481706, a: 1} + m_IndirectSpecularColor: {r: 0.44657844, g: 0.49641222, b: 0.57481694, a: 1} --- !u!157 &3 LightmapSettings: m_ObjectHideFlags: 0 @@ -276,3 +276,85 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1786072496 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1786072500} + - component: {fileID: 1786072499} + - component: {fileID: 1786072498} + - component: {fileID: 1786072497} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!23 &1786072497 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1786072496} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: f2042e1062153334ea0a77924a7327a4, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 1 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &1786072498 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1786072496} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &1786072499 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1786072496} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &1786072500 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1786072496} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2.3581216, y: -2.0539248, z: -16.652042} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} diff --git a/Assets/Scripts/2D/Follow2DRigidbody.cs.meta b/Assets/Scripts/2D/Follow2DRigidbody.cs.meta new file mode 100644 index 0000000..ee1020a --- /dev/null +++ b/Assets/Scripts/2D/Follow2DRigidbody.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: a7e1aa39bc8f2a147a374cdb56ddfb24 +timeCreated: 1511611021 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Editor/Tests/Edit Mode.meta b/Assets/Scripts/Docs/UnityEngine.meta similarity index 67% rename from Assets/Editor/Tests/Edit Mode.meta rename to Assets/Scripts/Docs/UnityEngine.meta index 5258e03..1ca44cd 100644 --- a/Assets/Editor/Tests/Edit Mode.meta +++ b/Assets/Scripts/Docs/UnityEngine.meta @@ -1,7 +1,7 @@ fileFormatVersion: 2 -guid: 3e6000cd87e342d4b98cd5ce263fa040 +guid: bb36932ec6987c54189247496091d7f6 folderAsset: yes -timeCreated: 1501226596 +timeCreated: 1511611015 licenseType: Free DefaultImporter: userData: diff --git a/Assets/Scripts/Docs/UnityEngine/CanvasRenderMode.cs.meta b/Assets/Scripts/Docs/UnityEngine/CanvasRenderMode.cs.meta new file mode 100644 index 0000000..f44cb21 --- /dev/null +++ b/Assets/Scripts/Docs/UnityEngine/CanvasRenderMode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 37aa85463a82a3448886076125e86145 +timeCreated: 1511611020 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Editor/AddDefineSymbols.cs.meta b/Assets/Scripts/Editor/AddDefineSymbols.cs.meta new file mode 100644 index 0000000..6aea040 --- /dev/null +++ b/Assets/Scripts/Editor/AddDefineSymbols.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 7fe019cd59a9a6c469975bb98490ba24 +timeCreated: 1511611020 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Editor/Tests/Play Mode.meta b/Assets/Scripts/Editor/BatchTools.meta similarity index 67% rename from Assets/Editor/Tests/Play Mode.meta rename to Assets/Scripts/Editor/BatchTools.meta index f86357c..3d56885 100644 --- a/Assets/Editor/Tests/Play Mode.meta +++ b/Assets/Scripts/Editor/BatchTools.meta @@ -1,7 +1,7 @@ fileFormatVersion: 2 -guid: 5043c30411a47e046bc3acda5263c808 +guid: 5b412ecce3fdda84085c2963eba28095 folderAsset: yes -timeCreated: 1501226600 +timeCreated: 1511611015 licenseType: Free DefaultImporter: userData: diff --git a/Assets/Scripts/Editor/BatchTools/MassRenameChildren.cs.meta b/Assets/Scripts/Editor/BatchTools/MassRenameChildren.cs.meta new file mode 100644 index 0000000..de3bd71 --- /dev/null +++ b/Assets/Scripts/Editor/BatchTools/MassRenameChildren.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: c9ef2083b7d1fba4aa65c75605fbf37c +timeCreated: 1511611021 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Editor/HelpLastRelease.cs.meta b/Assets/Scripts/Editor/HelpLastRelease.cs.meta new file mode 100644 index 0000000..64b1d97 --- /dev/null +++ b/Assets/Scripts/Editor/HelpLastRelease.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: e709b023ac010b643ad268fc30d93568 +timeCreated: 1511611021 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Editor/Tools/GetSelectedMeshInfo.cs.meta b/Assets/Scripts/Editor/Tools/GetSelectedMeshInfo.cs.meta new file mode 100644 index 0000000..8d74757 --- /dev/null +++ b/Assets/Scripts/Editor/Tools/GetSelectedMeshInfo.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: eff5480c5ab3f114792d467d0ad841c1 +timeCreated: 1511611021 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/ImageEffects.meta b/Assets/Scripts/ImageEffects.meta similarity index 100% rename from Assets/Shaders/ImageEffects.meta rename to Assets/Scripts/ImageEffects.meta diff --git a/Assets/Shaders/ImageEffects/GrayscaleLayers.cs b/Assets/Scripts/ImageEffects/GrayscaleLayers.cs similarity index 100% rename from Assets/Shaders/ImageEffects/GrayscaleLayers.cs rename to Assets/Scripts/ImageEffects/GrayscaleLayers.cs diff --git a/Assets/Shaders/ImageEffects/GrayscaleLayers.cs.meta b/Assets/Scripts/ImageEffects/GrayscaleLayers.cs.meta similarity index 100% rename from Assets/Shaders/ImageEffects/GrayscaleLayers.cs.meta rename to Assets/Scripts/ImageEffects/GrayscaleLayers.cs.meta diff --git a/Assets/Shaders/Mask.meta b/Assets/Scripts/Utilities.meta similarity index 67% rename from Assets/Shaders/Mask.meta rename to Assets/Scripts/Utilities.meta index 90a3db2..5e5533c 100644 --- a/Assets/Shaders/Mask.meta +++ b/Assets/Scripts/Utilities.meta @@ -1,7 +1,7 @@ fileFormatVersion: 2 -guid: 131b9655ea502674c9577a35011aec1a +guid: 19c151059837e8743b47a51a8f572228 folderAsset: yes -timeCreated: 1500793394 +timeCreated: 1511611013 licenseType: Free DefaultImporter: userData: diff --git a/Assets/Scripts/Utilities/Singleton.cs.meta b/Assets/Scripts/Utilities/Singleton.cs.meta new file mode 100644 index 0000000..4c9728c --- /dev/null +++ b/Assets/Scripts/Utilities/Singleton.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 95550a6b3e0eebd49a11850ed416e9d9 +timeCreated: 1511611021 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/Effects/2D.meta b/Assets/Shaders/2D.meta similarity index 67% rename from Assets/Shaders/Effects/2D.meta rename to Assets/Shaders/2D.meta index ef890cf..f3b970e 100644 --- a/Assets/Shaders/Effects/2D.meta +++ b/Assets/Shaders/2D.meta @@ -1,7 +1,7 @@ fileFormatVersion: 2 -guid: d1d731aef5970e3419edfcd06e282807 +guid: 99d7fe7c82d52b245bb4ff8844118c1f folderAsset: yes -timeCreated: 1500793397 +timeCreated: 1511612925 licenseType: Free DefaultImporter: userData: diff --git a/Assets/Shaders/Effects.meta b/Assets/Shaders/2D/Effects.meta similarity index 100% rename from Assets/Shaders/Effects.meta rename to Assets/Shaders/2D/Effects.meta diff --git a/Assets/Shaders/Effects/Glow.shader b/Assets/Shaders/2D/Effects/Glow.shader similarity index 100% rename from Assets/Shaders/Effects/Glow.shader rename to Assets/Shaders/2D/Effects/Glow.shader diff --git a/Assets/Shaders/Effects/Glow.shader.meta b/Assets/Shaders/2D/Effects/Glow.shader.meta similarity index 100% rename from Assets/Shaders/Effects/Glow.shader.meta rename to Assets/Shaders/2D/Effects/Glow.shader.meta diff --git a/Assets/Shaders/Effects/Highlight.shader b/Assets/Shaders/2D/Effects/Highlight.shader similarity index 100% rename from Assets/Shaders/Effects/Highlight.shader rename to Assets/Shaders/2D/Effects/Highlight.shader diff --git a/Assets/Shaders/Effects/Highlight.shader.meta b/Assets/Shaders/2D/Effects/Highlight.shader.meta similarity index 100% rename from Assets/Shaders/Effects/Highlight.shader.meta rename to Assets/Shaders/2D/Effects/Highlight.shader.meta diff --git a/Assets/Shaders/Effects/ToonIce.shader b/Assets/Shaders/2D/Effects/ToonIce.shader similarity index 100% rename from Assets/Shaders/Effects/ToonIce.shader rename to Assets/Shaders/2D/Effects/ToonIce.shader diff --git a/Assets/Shaders/Effects/ToonIce.shader.meta b/Assets/Shaders/2D/Effects/ToonIce.shader.meta similarity index 100% rename from Assets/Shaders/Effects/ToonIce.shader.meta rename to Assets/Shaders/2D/Effects/ToonIce.shader.meta diff --git a/Assets/Shaders/Effects/WireFrame.shader b/Assets/Shaders/2D/Effects/WireFrame.shader similarity index 99% rename from Assets/Shaders/Effects/WireFrame.shader rename to Assets/Shaders/2D/Effects/WireFrame.shader index 6191a71..1bc55df 100644 --- a/Assets/Shaders/Effects/WireFrame.shader +++ b/Assets/Shaders/2D/Effects/WireFrame.shader @@ -15,6 +15,7 @@ Shader "UnityLibrary/Effects/Wireframe" { Tags { "RenderType"="Opaque" } + Pass { // Wireframe shader based on the the following diff --git a/Assets/Shaders/Effects/WireFrame.shader.meta b/Assets/Shaders/2D/Effects/WireFrame.shader.meta similarity index 100% rename from Assets/Shaders/Effects/WireFrame.shader.meta rename to Assets/Shaders/2D/Effects/WireFrame.shader.meta diff --git a/Assets/Shaders/2D/LineRenderer.meta b/Assets/Shaders/2D/LineRenderer.meta new file mode 100644 index 0000000..7b5f36f --- /dev/null +++ b/Assets/Shaders/2D/LineRenderer.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: e87bf823cfbab8445867a12addd65cd7 +folderAsset: yes +timeCreated: 1511611014 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/LineRenderer/Additive-ScrollingUV.shader b/Assets/Shaders/2D/LineRenderer/Additive-ScrollingUV.shader similarity index 100% rename from Assets/Shaders/LineRenderer/Additive-ScrollingUV.shader rename to Assets/Shaders/2D/LineRenderer/Additive-ScrollingUV.shader diff --git a/Assets/Shaders/Effects/AlphaBlendMasked.shader.meta b/Assets/Shaders/2D/LineRenderer/Additive-ScrollingUV.shader.meta similarity index 67% rename from Assets/Shaders/Effects/AlphaBlendMasked.shader.meta rename to Assets/Shaders/2D/LineRenderer/Additive-ScrollingUV.shader.meta index e282edb..30e7147 100644 --- a/Assets/Shaders/Effects/AlphaBlendMasked.shader.meta +++ b/Assets/Shaders/2D/LineRenderer/Additive-ScrollingUV.shader.meta @@ -1,6 +1,6 @@ fileFormatVersion: 2 -guid: f61dad5edd22df54fb4587316f40f411 -timeCreated: 1500793477 +guid: 15701903e7dd975478b34a9e5bd4979b +timeCreated: 1511611033 licenseType: Free ShaderImporter: defaultTextures: [] diff --git a/Assets/Shaders/Sprites.meta b/Assets/Shaders/2D/Sprites.meta similarity index 100% rename from Assets/Shaders/Sprites.meta rename to Assets/Shaders/2D/Sprites.meta diff --git a/Assets/Shaders/2D/Sprites/Outline2D.shader b/Assets/Shaders/2D/Sprites/Outline2D.shader new file mode 100644 index 0000000..d449661 --- /dev/null +++ b/Assets/Shaders/2D/Sprites/Outline2D.shader @@ -0,0 +1,77 @@ + +Shader "UnityCommunity/Sprites/Outline" +{ +Properties +{ +_MainTex ("Base (RGB)", 2D) = "white" {} +_OutLineSpread ("Outline Spread", Range(0,0.01)) = 0.007 +_Color ("Tint", Color) = (1,1,1,1) +_ColorX ("Tint", Color) = (1,1,1,1) +_Alpha ("Alpha", Range (0,1)) = 1.0 +} + +SubShader +{ +Tags {"Queue"="Transparent" "IgnoreProjector"="true" "RenderType"="Transparent"} +ZWrite Off Blend SrcAlpha OneMinusSrcAlpha Cull Off + +Pass +{ + +CGPROGRAM +#pragma vertex vert +#pragma fragment frag +#pragma fragmentoption ARB_precision_hint_fastest +#include "UnityCG.cginc" + +struct appdata_t +{ +float4 vertex : POSITION; +float4 color : COLOR; +float2 texcoord : TEXCOORD0; +}; + +struct v2f +{ +half2 texcoord : TEXCOORD0; +float4 vertex : SV_POSITION; +fixed4 color : COLOR; +}; + +sampler2D _MainTex; +float _OutLineSpread; +fixed4 _Color; +fixed4 _ColorX; + +v2f vert(appdata_t IN) +{ +v2f OUT; +OUT.vertex = UnityObjectToClipPos(IN.vertex); +OUT.texcoord = IN.texcoord; +OUT.color = IN.color; +return OUT; +} + +float4 frag (v2f i) : COLOR +{ + +fixed4 mainColor = (tex2D(_MainTex, i.texcoord+float2(-_OutLineSpread,_OutLineSpread)) ++ tex2D(_MainTex, i.texcoord+float2(_OutLineSpread,-_OutLineSpread)) ++ tex2D(_MainTex, i.texcoord+float2(_OutLineSpread,_OutLineSpread)) ++ tex2D(_MainTex, i.texcoord-float2(_OutLineSpread,_OutLineSpread))); + +mainColor.rgb = _ColorX.rgb; + +fixed4 addcolor = tex2D(_MainTex, i.texcoord)*i.color; + +if (mainColor.a > 0.40) { mainColor = _ColorX; } +if (addcolor.a > 0.40) { mainColor = addcolor; mainColor.a = addcolor.a; } + +return mainColor*i.color.a; +} +ENDCG +} +} +Fallback "Sprites/Default" + +} diff --git a/Assets/Shaders/Mask/DepthMask.shader.meta b/Assets/Shaders/2D/Sprites/Outline2D.shader.meta similarity index 67% rename from Assets/Shaders/Mask/DepthMask.shader.meta rename to Assets/Shaders/2D/Sprites/Outline2D.shader.meta index 650a46b..00d6173 100644 --- a/Assets/Shaders/Mask/DepthMask.shader.meta +++ b/Assets/Shaders/2D/Sprites/Outline2D.shader.meta @@ -1,6 +1,6 @@ fileFormatVersion: 2 -guid: 674b907411eb5d74a8d85ca98816f7c6 -timeCreated: 1500793454 +guid: 88e77b0dcd3a1a247b7ad32561fefcd8 +timeCreated: 1511613854 licenseType: Free ShaderImporter: defaultTextures: [] diff --git a/Assets/Shaders/Sprites/SpriteDropShadow.shader b/Assets/Shaders/2D/Sprites/SpriteDropShadow.shader similarity index 100% rename from Assets/Shaders/Sprites/SpriteDropShadow.shader rename to Assets/Shaders/2D/Sprites/SpriteDropShadow.shader diff --git a/Assets/Shaders/Sprites/SpriteDropShadow.shader.meta b/Assets/Shaders/2D/Sprites/SpriteDropShadow.shader.meta similarity index 100% rename from Assets/Shaders/Sprites/SpriteDropShadow.shader.meta rename to Assets/Shaders/2D/Sprites/SpriteDropShadow.shader.meta diff --git a/Assets/Shaders/Sprites/SpriteHDRBloom.shader b/Assets/Shaders/2D/Sprites/SpriteHDRBloom.shader similarity index 100% rename from Assets/Shaders/Sprites/SpriteHDRBloom.shader rename to Assets/Shaders/2D/Sprites/SpriteHDRBloom.shader diff --git a/Assets/Shaders/Sprites/SpriteHDRBloom.shader.meta b/Assets/Shaders/2D/Sprites/SpriteHDRBloom.shader.meta similarity index 100% rename from Assets/Shaders/Sprites/SpriteHDRBloom.shader.meta rename to Assets/Shaders/2D/Sprites/SpriteHDRBloom.shader.meta diff --git a/Assets/Shaders/UI.meta b/Assets/Shaders/2D/UI.meta similarity index 100% rename from Assets/Shaders/UI.meta rename to Assets/Shaders/2D/UI.meta diff --git a/Assets/Shaders/UI/UI_Always_On_Top.shader b/Assets/Shaders/2D/UI/UI_Always_On_Top.shader similarity index 100% rename from Assets/Shaders/UI/UI_Always_On_Top.shader rename to Assets/Shaders/2D/UI/UI_Always_On_Top.shader diff --git a/Assets/Shaders/UI/UI_Always_On_Top.shader.meta b/Assets/Shaders/2D/UI/UI_Always_On_Top.shader.meta similarity index 100% rename from Assets/Shaders/UI/UI_Always_On_Top.shader.meta rename to Assets/Shaders/2D/UI/UI_Always_On_Top.shader.meta diff --git a/Assets/Shaders/3D.meta b/Assets/Shaders/3D.meta new file mode 100644 index 0000000..6902021 --- /dev/null +++ b/Assets/Shaders/3D.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 4e16b4c226149b5498e758bba415028e +folderAsset: yes +timeCreated: 1511611817 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/Debug.meta b/Assets/Shaders/3D/Debug.meta similarity index 100% rename from Assets/Shaders/Debug.meta rename to Assets/Shaders/3D/Debug.meta diff --git a/Assets/Shaders/Debug/DebugNormalsTangents.shader b/Assets/Shaders/3D/Debug/DebugNormalsTangents.shader similarity index 100% rename from Assets/Shaders/Debug/DebugNormalsTangents.shader rename to Assets/Shaders/3D/Debug/DebugNormalsTangents.shader diff --git a/Assets/Shaders/Debug/DebugNormalsTangents.shader.meta b/Assets/Shaders/3D/Debug/DebugNormalsTangents.shader.meta similarity index 100% rename from Assets/Shaders/Debug/DebugNormalsTangents.shader.meta rename to Assets/Shaders/3D/Debug/DebugNormalsTangents.shader.meta diff --git a/Assets/Shaders/Debug/LerpColorNearToFarPlane.shader b/Assets/Shaders/3D/Debug/LerpColorNearToFarPlane.shader similarity index 100% rename from Assets/Shaders/Debug/LerpColorNearToFarPlane.shader rename to Assets/Shaders/3D/Debug/LerpColorNearToFarPlane.shader diff --git a/Assets/Shaders/Debug/LerpColorNearToFarPlane.shader.meta b/Assets/Shaders/3D/Debug/LerpColorNearToFarPlane.shader.meta similarity index 100% rename from Assets/Shaders/Debug/LerpColorNearToFarPlane.shader.meta rename to Assets/Shaders/3D/Debug/LerpColorNearToFarPlane.shader.meta diff --git a/Assets/Shaders/3D/Reflection.meta b/Assets/Shaders/3D/Reflection.meta new file mode 100644 index 0000000..13e210f --- /dev/null +++ b/Assets/Shaders/3D/Reflection.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 4dcfe792bff0b3e4c9f909a023219231 +folderAsset: yes +timeCreated: 1511614225 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/Reflective.meta b/Assets/Shaders/3D/Reflection/Reflective.meta similarity index 100% rename from Assets/Shaders/Reflective.meta rename to Assets/Shaders/3D/Reflection/Reflective.meta diff --git a/Assets/Shaders/Reflective/BumpedSpecularFresnel.shader b/Assets/Shaders/3D/Reflection/Reflective/BumpedSpecularFresnel.shader similarity index 100% rename from Assets/Shaders/Reflective/BumpedSpecularFresnel.shader rename to Assets/Shaders/3D/Reflection/Reflective/BumpedSpecularFresnel.shader diff --git a/Assets/Shaders/Reflective/BumpedSpecularFresnel.shader.meta b/Assets/Shaders/3D/Reflection/Reflective/BumpedSpecularFresnel.shader.meta similarity index 100% rename from Assets/Shaders/Reflective/BumpedSpecularFresnel.shader.meta rename to Assets/Shaders/3D/Reflection/Reflective/BumpedSpecularFresnel.shader.meta diff --git a/Assets/Shaders/ReliefMapping.meta b/Assets/Shaders/3D/Reflection/ReliefMapping.meta similarity index 100% rename from Assets/Shaders/ReliefMapping.meta rename to Assets/Shaders/3D/Reflection/ReliefMapping.meta diff --git a/Assets/Shaders/ReliefMapping/ReliefMapping.shader b/Assets/Shaders/3D/Reflection/ReliefMapping/ReliefMapping.shader similarity index 100% rename from Assets/Shaders/ReliefMapping/ReliefMapping.shader rename to Assets/Shaders/3D/Reflection/ReliefMapping/ReliefMapping.shader diff --git a/Assets/Shaders/ReliefMapping/ReliefMapping.shader.meta b/Assets/Shaders/3D/Reflection/ReliefMapping/ReliefMapping.shader.meta similarity index 100% rename from Assets/Shaders/ReliefMapping/ReliefMapping.shader.meta rename to Assets/Shaders/3D/Reflection/ReliefMapping/ReliefMapping.shader.meta diff --git a/Assets/Shaders/SkyBox.meta b/Assets/Shaders/3D/SkyBox.meta similarity index 100% rename from Assets/Shaders/SkyBox.meta rename to Assets/Shaders/3D/SkyBox.meta diff --git a/Assets/Shaders/SkyBox/Cubemap-Simple.shader b/Assets/Shaders/3D/SkyBox/Cubemap-Simple.shader similarity index 100% rename from Assets/Shaders/SkyBox/Cubemap-Simple.shader rename to Assets/Shaders/3D/SkyBox/Cubemap-Simple.shader diff --git a/Assets/Shaders/SkyBox/Cubemap-Simple.shader.meta b/Assets/Shaders/3D/SkyBox/Cubemap-Simple.shader.meta similarity index 100% rename from Assets/Shaders/SkyBox/Cubemap-Simple.shader.meta rename to Assets/Shaders/3D/SkyBox/Cubemap-Simple.shader.meta diff --git a/Assets/Shaders/Terrain.meta b/Assets/Shaders/3D/Terrain.meta similarity index 100% rename from Assets/Shaders/Terrain.meta rename to Assets/Shaders/3D/Terrain.meta diff --git a/Assets/Shaders/Terrain/Splatmask4Textures.shader b/Assets/Shaders/3D/Terrain/Splatmask4Textures.shader similarity index 100% rename from Assets/Shaders/Terrain/Splatmask4Textures.shader rename to Assets/Shaders/3D/Terrain/Splatmask4Textures.shader diff --git a/Assets/Shaders/Terrain/Splatmask4Textures.shader.meta b/Assets/Shaders/3D/Terrain/Splatmask4Textures.shader.meta similarity index 100% rename from Assets/Shaders/Terrain/Splatmask4Textures.shader.meta rename to Assets/Shaders/3D/Terrain/Splatmask4Textures.shader.meta diff --git a/Assets/Shaders/Terrain/Trees.meta b/Assets/Shaders/3D/Terrain/Trees.meta similarity index 100% rename from Assets/Shaders/Terrain/Trees.meta rename to Assets/Shaders/3D/Terrain/Trees.meta diff --git a/Assets/Shaders/Terrain/Trees/Unity-BillboardTree.shader b/Assets/Shaders/3D/Terrain/Trees/Unity-BillboardTree.shader similarity index 100% rename from Assets/Shaders/Terrain/Trees/Unity-BillboardTree.shader rename to Assets/Shaders/3D/Terrain/Trees/Unity-BillboardTree.shader diff --git a/Assets/Shaders/Terrain/Trees/Unity-BillboardTree.shader.meta b/Assets/Shaders/3D/Terrain/Trees/Unity-BillboardTree.shader.meta similarity index 100% rename from Assets/Shaders/Terrain/Trees/Unity-BillboardTree.shader.meta rename to Assets/Shaders/3D/Terrain/Trees/Unity-BillboardTree.shader.meta diff --git a/Assets/Shaders/TextureMapping.meta b/Assets/Shaders/3D/TextureMapping.meta similarity index 100% rename from Assets/Shaders/TextureMapping.meta rename to Assets/Shaders/3D/TextureMapping.meta diff --git a/Assets/Shaders/TextureMapping/Equirectangular.shader b/Assets/Shaders/3D/TextureMapping/Equirectangular.shader similarity index 100% rename from Assets/Shaders/TextureMapping/Equirectangular.shader rename to Assets/Shaders/3D/TextureMapping/Equirectangular.shader diff --git a/Assets/Shaders/TextureMapping/Equirectangular.shader.meta b/Assets/Shaders/3D/TextureMapping/Equirectangular.shader.meta similarity index 100% rename from Assets/Shaders/TextureMapping/Equirectangular.shader.meta rename to Assets/Shaders/3D/TextureMapping/Equirectangular.shader.meta diff --git a/Assets/Shaders/Unlit.meta b/Assets/Shaders/3D/Unlit.meta similarity index 100% rename from Assets/Shaders/Unlit.meta rename to Assets/Shaders/3D/Unlit.meta diff --git a/Assets/Shaders/Unlit/UnlitTransparentColor.shader b/Assets/Shaders/3D/Unlit/UnlitTransparentColor.shader similarity index 100% rename from Assets/Shaders/Unlit/UnlitTransparentColor.shader rename to Assets/Shaders/3D/Unlit/UnlitTransparentColor.shader diff --git a/Assets/Shaders/Unlit/UnlitTransparentColor.shader.meta b/Assets/Shaders/3D/Unlit/UnlitTransparentColor.shader.meta similarity index 100% rename from Assets/Shaders/Unlit/UnlitTransparentColor.shader.meta rename to Assets/Shaders/3D/Unlit/UnlitTransparentColor.shader.meta diff --git a/Assets/Shaders/Unlit/UnlitTransparentColorGradient.shader b/Assets/Shaders/3D/Unlit/UnlitTransparentColorGradient.shader similarity index 100% rename from Assets/Shaders/Unlit/UnlitTransparentColorGradient.shader rename to Assets/Shaders/3D/Unlit/UnlitTransparentColorGradient.shader diff --git a/Assets/Shaders/Unlit/UnlitTransparentColorGradient.shader.meta b/Assets/Shaders/3D/Unlit/UnlitTransparentColorGradient.shader.meta similarity index 100% rename from Assets/Shaders/Unlit/UnlitTransparentColorGradient.shader.meta rename to Assets/Shaders/3D/Unlit/UnlitTransparentColorGradient.shader.meta diff --git a/Assets/Shaders/Vertex.meta b/Assets/Shaders/3D/Vertex.meta similarity index 100% rename from Assets/Shaders/Vertex.meta rename to Assets/Shaders/3D/Vertex.meta diff --git a/Assets/Shaders/Vertex/VertexColorMesh.shader b/Assets/Shaders/3D/Vertex/VertexColorMesh.shader similarity index 100% rename from Assets/Shaders/Vertex/VertexColorMesh.shader rename to Assets/Shaders/3D/Vertex/VertexColorMesh.shader diff --git a/Assets/Shaders/Vertex/VertexColorMesh.shader.meta b/Assets/Shaders/3D/Vertex/VertexColorMesh.shader.meta similarity index 100% rename from Assets/Shaders/Vertex/VertexColorMesh.shader.meta rename to Assets/Shaders/3D/Vertex/VertexColorMesh.shader.meta diff --git a/Assets/Shaders/Effects/2D/ExplosionCircle.shader b/Assets/Shaders/Effects/2D/ExplosionCircle.shader deleted file mode 100644 index 9b8d4e2..0000000 --- a/Assets/Shaders/Effects/2D/ExplosionCircle.shader +++ /dev/null @@ -1,44 +0,0 @@ -// source: http://unitycoder.com/blog/2013/08/11/scorched-earth-terrain-wip/ -// reference: http://johnwhigham.blogspot.sg/2011/11/planetary-rings.html - -Shader "UnityLibrary/ExplosionCircle" { - Properties { - _MainTex ("Base (RGB)", 2D) = "white" {} - _Radius ("Radius", float) = 0.5 - } - -SubShader { - Tags - { - "Queue"="Transparent" - "IgnoreProjector"="True" - "RenderType"="Transparent" - } - LOD 200 - Lighting Off - - CGPROGRAM - #pragma surface surf Lambert - - sampler2D _MainTex; - float _Radius; - - struct Input { - float2 uv_MainTex; - }; - - void surf (Input IN, inout SurfaceOutput o) - { - float dist = distance(IN.uv_MainTex, float2(0.5,0.5)); - if ( abs(dist) > _Radius) clip (-1.0); - float val = dist*128; - float c1 = 1-sin(val+_Time.x)+0.5; - float c2 = cos(val+_Time.y)+0.5; - float c3 = 0; - o.Albedo = float3(c1,c2,c3)*3; - o.Alpha = 1; - } - ENDCG - } -FallBack "Diffuse" -} diff --git a/Assets/Shaders/Effects/2D/ExplosionCircle.shader.meta b/Assets/Shaders/Effects/2D/ExplosionCircle.shader.meta deleted file mode 100644 index ec05eee..0000000 --- a/Assets/Shaders/Effects/2D/ExplosionCircle.shader.meta +++ /dev/null @@ -1,9 +0,0 @@ -fileFormatVersion: 2 -guid: 70e65bf87fb65fb41986104ef8ab98b6 -timeCreated: 1500793458 -licenseType: Free -ShaderImporter: - defaultTextures: [] - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Shaders/Effects/AlphaBlendMasked.shader b/Assets/Shaders/Effects/AlphaBlendMasked.shader deleted file mode 100644 index 302fb84..0000000 --- a/Assets/Shaders/Effects/AlphaBlendMasked.shader +++ /dev/null @@ -1,88 +0,0 @@ -//Only Renders particles that pass through the object, great for fire or mystic portals. -//Source: https://www.patreon.com/minionsart -Shader "Particles/Alpha Blended Masked" { - Properties{ - _TintColor("Tint Color", Color) = (0.5,0.5,0.5,0.5) - _MainTex("Particle Texture", 2D) = "white" {} - _InvFade("Soft Particles Factor", Range(0.01,3.0)) = 1.0 - } - - Category{ - Tags{ "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" "PreviewType" = "Plane" } - Blend SrcAlpha OneMinusSrcAlpha - ColorMask RGB - ZTest Greater - Cull Off Lighting Off ZWrite Off - - SubShader{ - Pass{ - - CGPROGRAM -#pragma vertex vert -#pragma fragment frag -#pragma target 2.0 -#pragma multi_compile_particles -#pragma multi_compile_fog - -#include "UnityCG.cginc" - - sampler2D _MainTex; - fixed4 _TintColor; - - struct appdata_t { - float4 vertex : POSITION; - fixed4 color : COLOR; - float2 texcoord : TEXCOORD0; - UNITY_VERTEX_INPUT_INSTANCE_ID - }; - - struct v2f { - float4 vertex : SV_POSITION; - fixed4 color : COLOR; - float2 texcoord : TEXCOORD0; - UNITY_FOG_COORDS(1) -#ifdef SOFTPARTICLES_ON - float4 projPos : TEXCOORD2; -#endif - UNITY_VERTEX_OUTPUT_STEREO - }; - - float4 _MainTex_ST; - - v2f vert(appdata_t v) - { - v2f o; - UNITY_SETUP_INSTANCE_ID(v); - UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); - o.vertex = UnityObjectToClipPos(v.vertex); -#ifdef SOFTPARTICLES_ON - o.projPos = ComputeScreenPos(o.vertex); - COMPUTE_EYEDEPTH(o.projPos.z); -#endif - o.color = v.color * _TintColor; - o.texcoord = TRANSFORM_TEX(v.texcoord,_MainTex); - UNITY_TRANSFER_FOG(o,o.vertex); - return o; - } - - sampler2D_float _CameraDepthTexture; - float _InvFade; - - fixed4 frag(v2f i) : SV_Target - { -#ifdef SOFTPARTICLES_ON - float sceneZ = LinearEyeDepth(SAMPLE_DEPTH_TEXTURE_PROJ(_CameraDepthTexture, UNITY_PROJ_COORD(i.projPos))); - float partZ = i.projPos.z; - float fade = saturate(_InvFade * (sceneZ - partZ)); - i.color.a *= fade; -#endif - - fixed4 col = 2.0f * i.color * tex2D(_MainTex, i.texcoord); - UNITY_APPLY_FOG(i.fogCoord, col); - return col; - } - ENDCG - } - } - } -} \ No newline at end of file diff --git a/Assets/Shaders/Mask/DepthMask.shader b/Assets/Shaders/Mask/DepthMask.shader deleted file mode 100644 index f6294f2..0000000 --- a/Assets/Shaders/Mask/DepthMask.shader +++ /dev/null @@ -1,11 +0,0 @@ -Shader "Custom/Mask/Depth" { - - SubShader{ - Tags{ "Queue" = "Geometry+10" } - - ColorMask 0 - ZWrite On - - Pass{} - } -} \ No newline at end of file diff --git a/Assets/Shaders/Vertex/UnlitFakeCurved.shader b/Assets/Shaders/Vertex/UnlitFakeCurved.shader deleted file mode 100644 index 642d654..0000000 --- a/Assets/Shaders/Vertex/UnlitFakeCurved.shader +++ /dev/null @@ -1,72 +0,0 @@ -// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' - -// Unlit Fake Curved World Shader -// Usage: Attach to objects that needs to be curved -// Adjust main camera to look downwards 15 degrees, and few meters higher than the ground - -Shader "UnityLibrary/UnlitFakeCurved" -{ - Properties - { - _MainTex ("Texture", 2D) = "white" {} - } - SubShader - { - Tags { "RenderType"="Opaque" } - LOD 100 - - Pass - { - CGPROGRAM - #pragma vertex vert - #pragma fragment frag - // make fog work - #pragma multi_compile_fog - - #include "UnityCG.cginc" - - struct appdata - { - float4 vertex : POSITION; - float2 uv : TEXCOORD0; - }; - - struct v2f - { - float2 uv : TEXCOORD0; - UNITY_FOG_COORDS(1) - float4 vertex : SV_POSITION; - }; - - sampler2D _MainTex; - float4 _MainTex_ST; - - // taken from UnityCG.cginc": #define COMPUTE_DEPTH_01 -(UnityObjectToViewPos( v.vertex ).z * _ProjectionParams.w) - float ComputeDepth01(float3 vertexZ) - { - return -(UnityObjectToViewPos( vertexZ ).z * _ProjectionParams.w); - } - - v2f vert (appdata v) - { - v2f o; - o.vertex = UnityObjectToClipPos(v.vertex); - - float depth = 1-ComputeDepth01(v.vertex); // invert depth - o.vertex.y *= exp(depth); // push Y coordinate based on distance - - o.uv = TRANSFORM_TEX(v.uv, _MainTex); - UNITY_TRANSFER_FOG(o,o.vertex); - return o; - } - - fixed4 frag (v2f i) : SV_Target - { - fixed4 col = tex2D(_MainTex, i.uv); - UNITY_APPLY_FOG(i.fogCoord, col); - return col; - } - ENDCG - } - } -} diff --git a/Assets/Shaders/Vertex/UnlitFakeCurved.shader.meta b/Assets/Shaders/Vertex/UnlitFakeCurved.shader.meta deleted file mode 100644 index 677d7ae..0000000 --- a/Assets/Shaders/Vertex/UnlitFakeCurved.shader.meta +++ /dev/null @@ -1,9 +0,0 @@ -fileFormatVersion: 2 -guid: cdcd1fe87f681e348ad1e6de834dccc7 -timeCreated: 1500793472 -licenseType: Free -ShaderImporter: - defaultTextures: [] - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Shaders/Vertex/UnlitTransparentColorGradient.shader b/Assets/Shaders/Vertex/UnlitTransparentColorGradient.shader deleted file mode 100644 index 8591c67..0000000 --- a/Assets/Shaders/Vertex/UnlitTransparentColorGradient.shader +++ /dev/null @@ -1,95 +0,0 @@ -Shader "Unlit/Transparent Color Gradient" { - Properties{ - _MainTex("Base (RGB) Trans (A)", 2D) = "white" { } - _Color("Color1", Color) = (1.000000,1.000000,1.000000,1.000000) - _Color2("Color2", Color) = (1.000000,1.000000,1.000000,1.000000) - } - - SubShader{ - LOD 100 - Tags{ "QUEUE" = "Transparent" "IGNOREPROJECTOR" = "true" "RenderType" = "Transparent" } - Pass{ - Tags{ "QUEUE" = "Transparent" "IGNOREPROJECTOR" = "true" "RenderType" = "Transparent" } - Blend SrcAlpha OneMinusSrcAlpha - - CGPROGRAM - #pragma vertex vert - #pragma fragment frag - #pragma target 2.0 - #include "UnityCG.cginc" - #pragma multi_compile_fog - #define USING_FOG (defined(FOG_LINEAR) || defined(FOG_EXP) || defined(FOG_EXP2)) - - // uniforms - float4 _MainTex_ST; - - // vertex shader input data - struct appdata { - float3 pos : POSITION; - float3 uv0 : TEXCOORD0; - }; - - // vertex-to-fragment interpolators - struct v2f { - fixed4 color : COLOR0; - float2 uv0 : TEXCOORD0; - #if USING_FOG - fixed fog : TEXCOORD1; - #endif - float4 pos : SV_POSITION; - float4 screenPos: TEXCOORD2; - }; - - // vertex shader - v2f vert(appdata IN) { - v2f o; - half4 color = half4(0,0,0,1.1); - float3 eyePos = mul(UNITY_MATRIX_MV, float4(IN.pos,1)).xyz; - half3 viewDir = 0.0; - o.color = saturate(color); - // compute texture coordinates - o.uv0 = IN.uv0.xy * _MainTex_ST.xy + _MainTex_ST.zw; - // fog - #if USING_FOG - float fogCoord = length(eyePos.xyz); // radial fog distance - UNITY_CALC_FOG_FACTOR(fogCoord); - o.fog = saturate(unityFogFactor); - #endif - // transform position - o.pos = UnityObjectToClipPos(IN.pos); - o.screenPos = ComputeScreenPos(o.pos); - return o; - } - - // textures - sampler2D _MainTex; - fixed4 _Color; - fixed4 _Color2; - - // fragment shader - fixed4 frag(v2f IN) : SV_Target{ - fixed4 col; - fixed4 tex, tmp0, tmp1, tmp2; - // SetTexture #0 - tex = tex2D(_MainTex, IN.uv0.xy); - - float2 screenPosition = (IN.screenPos.xy / IN.screenPos.w); - - //float2 screenUV = IN.screenPos.xy / IN.screenPos.w; - fixed4 color = lerp(_Color, _Color2, screenPosition.x); - - col.rgb = tex * color; - col.a = tex.a * color.a; - // fog - #if USING_FOG - col.rgb = lerp(unity_FogColor.rgb, col.rgb, IN.fog); - #endif - return col; - } - - // texenvs - //! TexEnv0: 01010102 01050106 [_MainTex] [_Color] - ENDCG - } - } -} diff --git a/Assets/Shaders/Vertex/UnlitTransparentColorGradient.shader.meta b/Assets/Shaders/Vertex/UnlitTransparentColorGradient.shader.meta deleted file mode 100644 index 107a4d4..0000000 --- a/Assets/Shaders/Vertex/UnlitTransparentColorGradient.shader.meta +++ /dev/null @@ -1,9 +0,0 @@ -fileFormatVersion: 2 -guid: fa97ff9cf8583334299162f06717640f -timeCreated: 1500793478 -licenseType: Free -ShaderImporter: - defaultTextures: [] - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Square.png b/Assets/Square.png new file mode 100644 index 0000000000000000000000000000000000000000..8eb1b1ecc13b6e1d2375151866134cd7a040340c GIT binary patch literal 78 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ℜ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 literal 0 HcmV?d00001 diff --git a/Assets/latest.png.meta b/Assets/latest.png.meta new file mode 100644 index 0000000..df51f99 --- /dev/null +++ b/Assets/latest.png.meta @@ -0,0 +1,82 @@ +fileFormatVersion: 2 +guid: bd4a0c2c1fa6c02409ca0b848503932e +timeCreated: 1511613646 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapU: 1 + wrapV: -1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset index 023ccce..c373cfb 100644 --- a/ProjectSettings/ProjectSettings.asset +++ b/ProjectSettings/ProjectSettings.asset @@ -496,7 +496,8 @@ PlayerSettings: webGLUseEmbeddedResources: 0 webGLUseWasm: 0 webGLCompressionFormat: 1 - scriptingDefineSymbols: {} + scriptingDefineSymbols: + 1: MYCOMPANY;MYCOMPANY_MYPACKAGE platformArchitecture: {} scriptingBackend: {} incrementalIl2cppBuild: {} From e575ae0e1b4f417106e8f7973dd78b1f2c26f920 Mon Sep 17 00:00:00 2001 From: smkplus Date: Sat, 25 Nov 2017 16:24:00 +0330 Subject: [PATCH 102/231] delete unused files --- Assets/New Material.mat | 76 -------------------------------- Assets/New Material.mat.meta | 9 ---- Assets/Square.png | Bin 78 -> 0 bytes Assets/Square.png.meta | 82 ----------------------------------- Assets/latest.png | Bin 198487 -> 0 bytes Assets/latest.png.meta | 82 ----------------------------------- 6 files changed, 249 deletions(-) delete mode 100644 Assets/New Material.mat delete mode 100644 Assets/New Material.mat.meta delete mode 100644 Assets/Square.png delete mode 100644 Assets/Square.png.meta delete mode 100644 Assets/latest.png delete mode 100644 Assets/latest.png.meta diff --git a/Assets/New Material.mat b/Assets/New Material.mat deleted file mode 100644 index 2791eb4..0000000 --- a/Assets/New Material.mat +++ /dev/null @@ -1,76 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!21 &2100000 -Material: - serializedVersion: 6 - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_Name: New Material - m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} - m_ShaderKeywords: - m_LightmapFlags: 4 - m_EnableInstancingVariants: 0 - m_DoubleSidedGI: 0 - m_CustomRenderQueue: -1 - stringTagMap: {} - disabledShaderPasses: [] - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: - - _BumpMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailAlbedoMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailMask: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailNormalMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _EmissionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MainTex: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MetallicGlossMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _OcclusionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _ParallaxMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - m_Floats: - - _BumpScale: 1 - - _Cutoff: 0.5 - - _DetailNormalMapScale: 1 - - _DstBlend: 0 - - _GlossMapScale: 1 - - _Glossiness: 0.5 - - _GlossyReflections: 1 - - _Metallic: 0 - - _Mode: 0 - - _OcclusionStrength: 1 - - _Parallax: 0.02 - - _SmoothnessTextureChannel: 0 - - _SpecularHighlights: 1 - - _SrcBlend: 1 - - _UVSec: 0 - - _ZWrite: 1 - m_Colors: - - _Color: {r: 1, g: 1, b: 1, a: 1} - - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/New Material.mat.meta b/Assets/New Material.mat.meta deleted file mode 100644 index d92c394..0000000 --- a/Assets/New Material.mat.meta +++ /dev/null @@ -1,9 +0,0 @@ -fileFormatVersion: 2 -guid: 4c6986c28f60385499d74b72699378e1 -timeCreated: 1511613281 -licenseType: Free -NativeFormatImporter: - mainObjectFileID: 2100000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Square.png b/Assets/Square.png deleted file mode 100644 index 8eb1b1ecc13b6e1d2375151866134cd7a040340c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 78 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ℜ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 diff --git a/Assets/latest.png.meta b/Assets/latest.png.meta deleted file mode 100644 index df51f99..0000000 --- a/Assets/latest.png.meta +++ /dev/null @@ -1,82 +0,0 @@ -fileFormatVersion: 2 -guid: bd4a0c2c1fa6c02409ca0b848503932e -timeCreated: 1511613646 -licenseType: Free -TextureImporter: - fileIDToRecycleName: {} - serializedVersion: 4 - mipmaps: - mipMapMode: 0 - enableMipMap: 0 - sRGBTexture: 1 - linearTexture: 0 - fadeOut: 0 - borderMipMap: 0 - mipMapsPreserveCoverage: 0 - alphaTestReferenceValue: 0.5 - mipMapFadeDistanceStart: 1 - mipMapFadeDistanceEnd: 3 - bumpmap: - convertToNormalMap: 0 - externalNormalMap: 0 - heightScale: 0.25 - normalMapFilter: 0 - isReadable: 0 - grayScaleToAlpha: 0 - generateCubemap: 6 - cubemapConvolution: 0 - seamlessCubemap: 0 - textureFormat: 1 - maxTextureSize: 2048 - textureSettings: - serializedVersion: 2 - filterMode: -1 - aniso: -1 - mipBias: -1 - wrapU: 1 - wrapV: -1 - wrapW: -1 - nPOTScale: 0 - lightmap: 0 - compressionQuality: 50 - spriteMode: 1 - spriteExtrude: 1 - spriteMeshType: 1 - alignment: 0 - spritePivot: {x: 0.5, y: 0.5} - spriteBorder: {x: 0, y: 0, z: 0, w: 0} - spritePixelsToUnits: 100 - alphaUsage: 1 - alphaIsTransparency: 1 - spriteTessellationDetail: -1 - textureType: 8 - textureShape: 1 - maxTextureSizeSet: 0 - compressionQualitySet: 0 - textureFormatSet: 0 - platformSettings: - - buildTarget: DefaultTexturePlatform - maxTextureSize: 2048 - textureFormat: -1 - textureCompression: 1 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - - buildTarget: Standalone - maxTextureSize: 2048 - textureFormat: -1 - textureCompression: 1 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - spriteSheet: - serializedVersion: 2 - sprites: [] - outline: [] - physicsShape: [] - spritePackingTag: - userData: - assetBundleName: - assetBundleVariant: From 5d293d9c7cb25f4f2ce93e22e1bb0c4aee0f4ee5 Mon Sep 17 00:00:00 2001 From: smkplus Date: Thu, 30 Nov 2017 10:42:47 +0330 Subject: [PATCH 103/231] add shaders (photoshop Blends,HSBC,Chromakey) --- Assets/Editor/Tests.meta | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 Assets/Editor/Tests.meta diff --git a/Assets/Editor/Tests.meta b/Assets/Editor/Tests.meta deleted file mode 100644 index aea5a9b..0000000 --- a/Assets/Editor/Tests.meta +++ /dev/null @@ -1,9 +0,0 @@ -fileFormatVersion: 2 -guid: 6018a0fd4c364f14bb8fe0e75a32e585 -folderAsset: yes -timeCreated: 1501225966 -licenseType: Free -DefaultImporter: - userData: - assetBundleName: - assetBundleVariant: From 9461aa2ca463462e6550ee9286fea77c84637ad7 Mon Sep 17 00:00:00 2001 From: smkplus Date: Thu, 30 Nov 2017 10:47:53 +0330 Subject: [PATCH 104/231] add new shaders Photoshop Blends Chromakey HSBC pixelation --- Assets/Shaders/2D/Sprites/Chromakey.shader | 75 +++++ .../Shaders/2D/Sprites/Chromakey.shader.meta | 9 + Assets/Shaders/2D/Sprites/HSBC.shader | 90 ++++++ Assets/Shaders/2D/Sprites/HSBC.shader.meta | 9 + .../Shaders/2D/Sprites/Photoshop Blends.meta | 9 + .../Photoshop Blends/Photoshop_Blends.cs | 20 ++ .../Photoshop Blends/Photoshop_Blends.cs.meta | 12 + .../Photoshop Blends/photoshop_blends.shader | 285 ++++++++++++++++++ .../photoshop_blends.shader.meta | 9 + Assets/Shaders/2D/Sprites/Pixelation.shader | 41 +++ .../Shaders/2D/Sprites/Pixelation.shader.meta | 9 + .../Shaders/2D/Sprites/SpriteHDRBloom.shader | 2 +- 12 files changed, 569 insertions(+), 1 deletion(-) create mode 100644 Assets/Shaders/2D/Sprites/Chromakey.shader create mode 100644 Assets/Shaders/2D/Sprites/Chromakey.shader.meta create mode 100644 Assets/Shaders/2D/Sprites/HSBC.shader create mode 100644 Assets/Shaders/2D/Sprites/HSBC.shader.meta create mode 100644 Assets/Shaders/2D/Sprites/Photoshop Blends.meta create mode 100644 Assets/Shaders/2D/Sprites/Photoshop Blends/Photoshop_Blends.cs create mode 100644 Assets/Shaders/2D/Sprites/Photoshop Blends/Photoshop_Blends.cs.meta create mode 100644 Assets/Shaders/2D/Sprites/Photoshop Blends/photoshop_blends.shader create mode 100644 Assets/Shaders/2D/Sprites/Photoshop Blends/photoshop_blends.shader.meta create mode 100644 Assets/Shaders/2D/Sprites/Pixelation.shader create mode 100644 Assets/Shaders/2D/Sprites/Pixelation.shader.meta diff --git a/Assets/Shaders/2D/Sprites/Chromakey.shader b/Assets/Shaders/2D/Sprites/Chromakey.shader new file mode 100644 index 0000000..f986582 --- /dev/null +++ b/Assets/Shaders/2D/Sprites/Chromakey.shader @@ -0,0 +1,75 @@ +Shader "UnityCommunity/ChromakeyTransparent" { +Properties +{ +_MainTex ("Base (RGB)", 2D) = "white" {} +_MaskCol ("Mask Color", Color) = (1.0, 0.0, 0.0, 1.0) +_Sensitivity ("Threshold Sensitivity", Range(0,1)) = 0.5 +_Smooth ("Smoothing", Range(0,1)) = 0.5 +} + +SubShader +{ +Tags {"Queue"="Transparent" "IgnoreProjector"="true" "RenderType"="Transparent"} + Blend SrcAlpha OneMinusSrcAlpha Cull Off + +Pass +{ + +CGPROGRAM +#pragma vertex vert +#pragma fragment frag +#pragma fragmentoption ARB_precision_hint_fastest +#include "UnityCG.cginc" + +struct appdata_t +{ +float4 vertex : POSITION; +float2 texcoord : TEXCOORD0; +}; + +struct v2f +{ +half2 texcoord : TEXCOORD0; +float4 vertex : SV_POSITION; +}; + +sampler2D _MainTex; +fixed4 _Color; +float _Speed; + +float4 _MaskCol; +float _Sensitivity; +float _Smooth; + + +v2f vert(appdata_t IN) +{ +v2f OUT; +OUT.vertex = UnityObjectToClipPos(IN.vertex); +OUT.texcoord = IN.texcoord; +return OUT; +} + +float4 frag (v2f i) : COLOR +{ + +float2 uv = i.texcoord.xy; +float4 c = tex2D(_MainTex, uv); + +float maskY = 0.2989 * _MaskCol.r + 0.5866 * _MaskCol.g + 0.1145 * _MaskCol.b; +float maskCr = 0.7132 * (_MaskCol.r - maskY); +float maskCb = 0.5647 * (_MaskCol.b - maskY); + +float Y = 0.2989 * c.r + 0.5866 * c.g + 0.1145 * c.b; +float Cr = 0.7132 * (c.r - Y); +float Cb = 0.5647 * (c.b - Y); + +float blendValue = smoothstep(_Sensitivity, _Sensitivity + _Smooth, distance(float2(Cr, Cb), float2(maskCr, maskCb))); + +return float4(c.rgb,c.a*blendValue); +} +ENDCG +} +} +Fallback "Sprites/Default" +} \ No newline at end of file diff --git a/Assets/Shaders/2D/Sprites/Chromakey.shader.meta b/Assets/Shaders/2D/Sprites/Chromakey.shader.meta new file mode 100644 index 0000000..8ad6280 --- /dev/null +++ b/Assets/Shaders/2D/Sprites/Chromakey.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: d519a4751a0aff74593843250496c08e +timeCreated: 1512025674 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/2D/Sprites/HSBC.shader b/Assets/Shaders/2D/Sprites/HSBC.shader new file mode 100644 index 0000000..7ecf0b9 --- /dev/null +++ b/Assets/Shaders/2D/Sprites/HSBC.shader @@ -0,0 +1,90 @@ +// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' + +Shader "Unlit/HSBC Effect" +{ + Properties + { + _MainTex ("Texture", 2D) = "white" {} + _Hue ("Hue", Range(0, 1.0)) = 0 + _Saturation ("Saturation", Range(0, 1.0)) = 0.5 + _Brightness ("Brightness", Range(0, 1.0)) = 0.5 + _Contrast ("Contrast", Range(0, 1.0)) = 0.5 + } + SubShader + { + Tags {"Queue"="Transparent" "IgnoreProjector"="true" "RenderType"="Transparent"} + Blend SrcAlpha OneMinusSrcAlpha Cull Off + Pass + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + #include "UnityCG.cginc" + + + inline float3 applyHue(float3 aColor, float aHue) + { + float angle = radians(aHue); + float3 k = float3(0.57735, 0.57735, 0.57735); + float cosAngle = cos(angle); + + return aColor * cosAngle + cross(k, aColor) * sin(angle) + k * dot(k, aColor) * (1 - cosAngle); + } + + inline float4 applyHSBCEffect(float4 startColor, fixed4 hsbc) + { + float hue = 360 * hsbc.r; + float saturation = hsbc.g * 2; + float brightness = hsbc.b * 2 - 1; + float contrast = hsbc.a * 2; + + float4 outputColor = startColor; + outputColor.rgb = applyHue(outputColor.rgb, hue); + outputColor.rgb = (outputColor.rgb - 0.5f) * contrast + 0.5f; + outputColor.rgb = outputColor.rgb + brightness; + float3 intensity = dot(outputColor.rgb, float3(0.39, 0.59, 0.11)); + outputColor.rgb = lerp(intensity, outputColor.rgb, saturation); + + return outputColor; + } + + struct appdata + { + float4 vertex : POSITION; + float2 uv : TEXCOORD0; + fixed4 color : COLOR; + }; + + struct v2f + { + float4 vertex : SV_POSITION; + float2 uv : TEXCOORD0; + fixed4 hsbc : COLOR; + }; + + sampler2D _MainTex; + float4 _MainTex_ST; + fixed _Hue, _Saturation, _Brightness, _Contrast; + + v2f vert (appdata v) + { + v2f o; + o.vertex = UnityObjectToClipPos(v.vertex); + o.uv = TRANSFORM_TEX(v.uv, _MainTex); + o.hsbc = fixed4(_Hue, _Saturation, _Brightness, _Contrast); + + return o; + } + + fixed4 frag (v2f i) : COLOR + { + fixed4 startColor = tex2D(_MainTex, i.uv); + float4 hsbcColor = applyHSBCEffect(startColor, i.hsbc); + + return hsbcColor*startColor.a; + } + ENDCG + } + } +} \ No newline at end of file diff --git a/Assets/Shaders/2D/Sprites/HSBC.shader.meta b/Assets/Shaders/2D/Sprites/HSBC.shader.meta new file mode 100644 index 0000000..76b8057 --- /dev/null +++ b/Assets/Shaders/2D/Sprites/HSBC.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 1c3c166a85bfe60428455775befe0f3b +timeCreated: 1512025650 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/2D/Sprites/Photoshop Blends.meta b/Assets/Shaders/2D/Sprites/Photoshop Blends.meta new file mode 100644 index 0000000..912fada --- /dev/null +++ b/Assets/Shaders/2D/Sprites/Photoshop Blends.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 37f060ed25d19ec49801a3bbf06bdea1 +folderAsset: yes +timeCreated: 1512025751 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/2D/Sprites/Photoshop Blends/Photoshop_Blends.cs b/Assets/Shaders/2D/Sprites/Photoshop Blends/Photoshop_Blends.cs new file mode 100644 index 0000000..85bb43c --- /dev/null +++ b/Assets/Shaders/2D/Sprites/Photoshop Blends/Photoshop_Blends.cs @@ -0,0 +1,20 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +[ExecuteInEditMode] +public class Photoshop_Blends : MonoBehaviour { + public enum BlendModes{darken,multiply,colorBurn,linearBurn,darkerColor,lighten,screen,colorDodge,linearDodge,lighterColor,overlay,softLight,hardLight,vividLight,linearLight,pinLight,hardlerp,difference,exclusion,subtract,divide,hue,color,saturation,luminosity} + public BlendModes blendmodes; + private Material Mat; + + void Awake () { + Material material = new Material (Shader.Find("UnityCommunity/Sprites/PhotoshopBlends")); + GetComponent ().sharedMaterial = material; + } + + void Update () { + + GetComponent ().sharedMaterial.SetInt ("number", blendmodes.GetHashCode ()); + } +} diff --git a/Assets/Shaders/2D/Sprites/Photoshop Blends/Photoshop_Blends.cs.meta b/Assets/Shaders/2D/Sprites/Photoshop Blends/Photoshop_Blends.cs.meta new file mode 100644 index 0000000..36b62d4 --- /dev/null +++ b/Assets/Shaders/2D/Sprites/Photoshop Blends/Photoshop_Blends.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: ead4927f89bb6d243a3d67b0fbfef19d +timeCreated: 1512025691 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/2D/Sprites/Photoshop Blends/photoshop_blends.shader b/Assets/Shaders/2D/Sprites/Photoshop Blends/photoshop_blends.shader new file mode 100644 index 0000000..e265405 --- /dev/null +++ b/Assets/Shaders/2D/Sprites/Photoshop Blends/photoshop_blends.shader @@ -0,0 +1,285 @@ +//useful links: +//https://www.shadertoy.com/view/XdS3RW +//see also: https://docs.gimp.org/en/gimp-concepts-layer-modes.html + +Shader "UnityCommunity/Sprites/PhotoshopBlends" +{ + Properties + { + _source ("Upper Layer", 2D) = "white" {} + _destination ("Lower Layer", 2D) = "white" {} + number("Mode 0-24", Int) = 0 + } + + Subshader + { + Pass + { + CGPROGRAM + #pragma vertex vertex_shader + #pragma fragment pixel_shader + #pragma target 3.0 + + struct custom_type + { + float4 vertex : SV_POSITION; + float2 uv : TEXCOORD0; + }; + + sampler2D _destination,_source; + int number; + + float3 darken( float3 s, float3 d ) + { + return min(s,d); + } + + float3 multiply( float3 s, float3 d ) + { + return s*d; + } + + float3 colorBurn( float3 s, float3 d ) + { + return 1.0 - (1.0 - d) / s; + } + + float3 linearBurn( float3 s, float3 d ) + { + return s + d - 1.0; + } + + float3 darkerColor( float3 s, float3 d ) + { + return (s.x + s.y + s.z < d.x + d.y + d.z) ? s : d; + } + + float3 lighten( float3 s, float3 d ) + { + return max(s,d); + } + + float3 screen( float3 s, float3 d ) + { + return s + d - s * d; + } + + float3 colorDodge( float3 s, float3 d ) + { + return d / (1.0 - s); + } + + float3 linearDodge( float3 s, float3 d ) + { + return s + d; + } + + float3 lighterColor( float3 s, float3 d ) + { + return (s.x + s.y + s.z > d.x + d.y + d.z) ? s : d; + } + + float overlay( float s, float d ) + { + return (d < 0.5) ? 2.0 * s * d : 1.0 - 2.0 * (1.0 - s) * (1.0 - d); + } + + float3 overlay( float3 s, float3 d ) + { + float3 c; + c.x = overlay(s.x,d.x); + c.y = overlay(s.y,d.y); + c.z = overlay(s.z,d.z); + return c; + } + + float softLight( float s, float d ) + { + return (s < 0.5) ? d - (1.0 - 2.0 * s) * d * (1.0 - d) + : (d < 0.25) ? d + (2.0 * s - 1.0) * d * ((16.0 * d - 12.0) * d + 3.0) + : d + (2.0 * s - 1.0) * (sqrt(d) - d); + } + + float3 softLight( float3 s, float3 d ) + { + float3 c; + c.x = softLight(s.x,d.x); + c.y = softLight(s.y,d.y); + c.z = softLight(s.z,d.z); + return c; + } + + float hardLight( float s, float d ) + { + return (s < 0.5) ? 2.0 * s * d : 1.0 - 2.0 * (1.0 - s) * (1.0 - d); + } + + float3 hardLight( float3 s, float3 d ) + { + float3 c; + c.x = hardLight(s.x,d.x); + c.y = hardLight(s.y,d.y); + c.z = hardLight(s.z,d.z); + return c; + } + + float vividLight( float s, float d ) + { + return (s < 0.5) ? 1.0 - (1.0 - d) / (2.0 * s) : d / (2.0 * (1.0 - s)); + } + + float3 vividLight( float3 s, float3 d ) + { + float3 c; + c.x = vividLight(s.x,d.x); + c.y = vividLight(s.y,d.y); + c.z = vividLight(s.z,d.z); + return c; + } + + float3 linearLight( float3 s, float3 d ) + { + return 2.0 * s + d - 1.0; + } + + float pinLight( float s, float d ) + { + return (2.0 * s - 1.0 > d) ? 2.0 * s - 1.0 : (s < 0.5 * d) ? 2.0 * s : d; + } + + float3 pinLight( float3 s, float3 d ) + { + float3 c; + c.x = pinLight(s.x,d.x); + c.y = pinLight(s.y,d.y); + c.z = pinLight(s.z,d.z); + return c; + } + + float3 hardlerp( float3 s, float3 d ) + { + return floor(s + d); + } + + float3 difference( float3 s, float3 d ) + { + return abs(d - s); + } + + float3 exclusion( float3 s, float3 d ) + { + return s + d - 2.0 * s * d; + } + + float3 subtract( float3 s, float3 d ) + { + return s - d; + } + + float3 divide( float3 s, float3 d ) + { + return s / d; + } + + float3 rgb2hsv(float3 c) + { + float4 K = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + float4 p = lerp(float4(c.bg, K.wz), float4(c.gb, K.xy), step(c.b, c.g)); + float4 q = lerp(float4(p.xyw, c.r), float4(c.r, p.yzx), step(p.x, c.r)); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + } + + float3 hsv2rgb(float3 c) + { + float4 K = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + float3 p = abs(frac(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * lerp(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); + } + + float3 hue( float3 s, float3 d ) + { + d = rgb2hsv(d); + d.x = rgb2hsv(s).x; + return hsv2rgb(d); + } + + float3 color( float3 s, float3 d ) + { + s = rgb2hsv(s); + s.z = rgb2hsv(d).z; + return hsv2rgb(s); + } + + float3 saturation( float3 s, float3 d ) + { + d = rgb2hsv(d); + d.y = rgb2hsv(s).y; + return hsv2rgb(d); + } + + float3 luminosity( float3 s, float3 d ) + { + float dLum = dot(d, float3(0.3, 0.59, 0.11)); + float sLum = dot(s, float3(0.3, 0.59, 0.11)); + float lum = sLum - dLum; + float3 c = d + lum; + float minC = min(min(c.x, c.y), c.z); + float maxC = max(max(c.x, c.y), c.z); + if(minC < 0.0) return sLum + ((c - sLum) * sLum) / (sLum - minC); + else if(maxC > 1.0) return sLum + ((c - sLum) * (1.0 - sLum)) / (maxC - sLum); + else return c; + } + + float3 blend( float3 s, float3 d, int id ) + { + if(id==0) return darken(s,d); + if(id==1) return multiply(s,d); + if(id==2) return colorBurn(s,d); + if(id==3) return linearBurn(s,d); + if(id==4) return darkerColor(s,d); + if(id==5) return lighten(s,d); + if(id==6) return screen(s,d); + if(id==7) return colorDodge(s,d); + if(id==8) return linearDodge(s,d); + if(id==9) return lighterColor(s,d); + if(id==10) return overlay(s,d); + if(id==11) return softLight(s,d); + if(id==12) return hardLight(s,d); + if(id==13) return vividLight(s,d); + if(id==14) return linearLight(s,d); + if(id==15) return pinLight(s,d); + if(id==16) return hardlerp(s,d); + if(id==17) return difference(s,d); + if(id==18) return exclusion(s,d); + if(id==19) return subtract(s,d); + if(id==20) return divide(s,d); + if(id==21) return hue(s,d); + if(id==22) return color(s,d); + if(id==23) return saturation(s,d); + if(id==24) return luminosity(s,d); + return float3(0,0,0); + } + + custom_type vertex_shader (float4 vertex:POSITION, float2 uv:TEXCOORD0) + { + custom_type vs; + vs.vertex = UnityObjectToClipPos(vertex); + vs.uv = uv; + return vs; + } + + float4 pixel_shader (custom_type ps) : SV_TARGET + { + float2 uv = ps.uv.xy; + int id =number; + float3 s = tex2D(_source, uv).xyz; + float3 d = tex2D(_destination, uv).xyz; + float3 c = blend(s,d,id); + return float4(c,1.0); + } + ENDCG + } + } +} \ No newline at end of file diff --git a/Assets/Shaders/2D/Sprites/Photoshop Blends/photoshop_blends.shader.meta b/Assets/Shaders/2D/Sprites/Photoshop Blends/photoshop_blends.shader.meta new file mode 100644 index 0000000..9359641 --- /dev/null +++ b/Assets/Shaders/2D/Sprites/Photoshop Blends/photoshop_blends.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 773b7ccd460934140a59c74848880b4d +timeCreated: 1512025692 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/2D/Sprites/Pixelation.shader b/Assets/Shaders/2D/Sprites/Pixelation.shader new file mode 100644 index 0000000..517675e --- /dev/null +++ b/Assets/Shaders/2D/Sprites/Pixelation.shader @@ -0,0 +1,41 @@ +Shader "UnityCommunity/Sprites/Pixelation" +{ + Properties + { + _MainTex ("Texture", 2D) = "white" {} + size ("Pixel size",Range(1.0,1000.0)) = 100.0 + } + Subshader + { + Pass + { + CGPROGRAM + #pragma vertex vertex_shader + #pragma fragment pixel_shader + #pragma target 2.0 + + sampler2D _MainTex; + float size; + + struct custom_type + { + float4 vertex : SV_POSITION; + float2 uv : TEXCOORD0; + }; + + custom_type vertex_shader (float4 vertex:POSITION, float2 uv:TEXCOORD0) + { + custom_type vs; + vs.vertex = UnityObjectToClipPos (vertex); + vs.uv = uv; + return vs; + } + + float4 pixel_shader (custom_type ps) : COLOR + { + return tex2D(_MainTex,ceil(ps.uv.xy*size)/size); + } + ENDCG + } + } +} \ No newline at end of file diff --git a/Assets/Shaders/2D/Sprites/Pixelation.shader.meta b/Assets/Shaders/2D/Sprites/Pixelation.shader.meta new file mode 100644 index 0000000..7a751bc --- /dev/null +++ b/Assets/Shaders/2D/Sprites/Pixelation.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 329439a225731b7449c7ac9a8cedb612 +timeCreated: 1512026085 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/2D/Sprites/SpriteHDRBloom.shader b/Assets/Shaders/2D/Sprites/SpriteHDRBloom.shader index fd18ac7..b397f54 100644 --- a/Assets/Shaders/2D/Sprites/SpriteHDRBloom.shader +++ b/Assets/Shaders/2D/Sprites/SpriteHDRBloom.shader @@ -2,7 +2,7 @@ // Camera enable [x] HDR // Add Bloom cinematic image effect to Camera, with Threshold 1.1 (so only values over 1.1 will get bloomy) -Shader "Sprites/HDRBloom" +Shader "UnityCommunity/Sprites/HDRBloom" { Properties { From 7ffb128c29a6638ad3fc42abe1bd750dadb96b7c Mon Sep 17 00:00:00 2001 From: smkplus Date: Fri, 1 Dec 2017 21:04:44 +0330 Subject: [PATCH 105/231] Fixing shaders Pixelation Transparent adding Unlit double sided --- Assets/Shaders/2D/Sprites/Pixelation.shader | 3 ++ .../Shaders/3D/Unlit/UnlitDoubleSided.shader | 44 +++++++++++++++++++ .../3D/Unlit/UnlitDoubleSided.shader.meta | 9 ++++ 3 files changed, 56 insertions(+) create mode 100644 Assets/Shaders/3D/Unlit/UnlitDoubleSided.shader create mode 100644 Assets/Shaders/3D/Unlit/UnlitDoubleSided.shader.meta diff --git a/Assets/Shaders/2D/Sprites/Pixelation.shader b/Assets/Shaders/2D/Sprites/Pixelation.shader index 517675e..7c77ae7 100644 --- a/Assets/Shaders/2D/Sprites/Pixelation.shader +++ b/Assets/Shaders/2D/Sprites/Pixelation.shader @@ -7,6 +7,9 @@ } Subshader { + Tags {"Queue"="Transparent" "IgnoreProjector"="true" "RenderType"="Transparent"} + ZWrite Off Blend SrcAlpha OneMinusSrcAlpha Cull Off + Pass { CGPROGRAM diff --git a/Assets/Shaders/3D/Unlit/UnlitDoubleSided.shader b/Assets/Shaders/3D/Unlit/UnlitDoubleSided.shader new file mode 100644 index 0000000..4baf055 --- /dev/null +++ b/Assets/Shaders/3D/Unlit/UnlitDoubleSided.shader @@ -0,0 +1,44 @@ +Shader "UnityCommunity/Unlit/Double Sided" +{ + Properties + { + _MainTex ("Texture", 2D) = "white" {} + } + Subshader + { + Tags {"Queue"="Transparent" "IgnoreProjector"="true" "RenderType"="Transparent"} + ZWrite Off Blend SrcAlpha OneMinusSrcAlpha Cull Off + + Pass + { + Cull Off + CGPROGRAM + #pragma vertex vertex_shader + #pragma fragment pixel_shader + #pragma target 3.0 + + sampler2D _MainTex; + + struct custom_type + { + float4 clip_space_vertex : SV_POSITION; + float2 uv : TEXCOORD0; + }; + + custom_type vertex_shader (float4 object_space_vertex : POSITION, float2 uv : TEXCOORD0) + { + custom_type vs; + vs.clip_space_vertex = UnityObjectToClipPos (object_space_vertex); + vs.uv=uv; + return vs; + } + + float4 pixel_shader (custom_type ps) : SV_TARGET + { + return tex2D (_MainTex,ps.uv.xy); + } + + ENDCG + } + } +} \ No newline at end of file diff --git a/Assets/Shaders/3D/Unlit/UnlitDoubleSided.shader.meta b/Assets/Shaders/3D/Unlit/UnlitDoubleSided.shader.meta new file mode 100644 index 0000000..3525df8 --- /dev/null +++ b/Assets/Shaders/3D/Unlit/UnlitDoubleSided.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 82111366e9d1d0c4fb0aee75e08ca0c3 +timeCreated: 1512149105 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: From 4579f39115d7d7f752500c153b469867eb94892e Mon Sep 17 00:00:00 2001 From: mika Date: Sat, 9 Dec 2017 14:33:20 +0800 Subject: [PATCH 106/231] Create MeshExample.cs --- Assets/Scripts/Docs/Mesh/MeshExample.cs | 53 +++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 Assets/Scripts/Docs/Mesh/MeshExample.cs diff --git a/Assets/Scripts/Docs/Mesh/MeshExample.cs b/Assets/Scripts/Docs/Mesh/MeshExample.cs new file mode 100644 index 0000000..03e2799 --- /dev/null +++ b/Assets/Scripts/Docs/Mesh/MeshExample.cs @@ -0,0 +1,53 @@ +using UnityEngine; + +/// +/// Build single triangle mesh from script, with vertex colors, normals, uvs. +/// Usage: Assign this script into empty gameobject in the scene, press play. Optional: Add point light to scene for testing lights +/// + +namespace UnityLibrary +{ + public class MeshExample : MonoBehaviour + { + + void Start() + { + // create empty gameobject with meshrenderer and meshfilter + var mr = gameObject.AddComponent(); + var mf = gameObject.AddComponent(); + + // build new mesh + Mesh mesh = new Mesh(); + // assign to meshfilter + mf.mesh = mesh; + + // create one triangle face + // 3 vertices + var vertices = new Vector3[] { new Vector3(0, 0, 0), new Vector3(0, 0, 1), new Vector3(1, 0, 1) }; + // connect vertices to build triangle face + var triangles = new int[] { 0, 1, 2 }; + // assign UV per vertex + var uvs = new Vector2[] { new Vector2(0, 0), new Vector2(0, 1), new Vector2(1, 1) }; + // assign normal direction per vertex + var normals = new Vector3[] { Vector3.up, Vector3.up, Vector3.up }; + // assign color per vertex + var colors = new Color[] { Color.red, Color.green, Color.blue }; + + // assign values to mesh + mesh.vertices = vertices; + mesh.uv = uvs; + mesh.triangles = triangles; + mesh.normals = normals; + mesh.colors = colors; + + // if have issues of disappearing mesh, uncomment next line + //mesh.RecalculateBounds(); + + // assign sprite diffuce shader material to see vertex colors and lights + var shader = Shader.Find("Sprites/Diffuse"); + var material = new Material(shader); + mr.material = material; + } + + } +} From 3319fac01fc049e390c5efe595085eae319a2497 Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Sat, 13 Jan 2018 11:01:34 +0330 Subject: [PATCH 107/231] Create ColorPickerWindow.cs --- .../Scripts/Editor/Tools/ColorPickerWindow.cs | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 Assets/Scripts/Editor/Tools/ColorPickerWindow.cs diff --git a/Assets/Scripts/Editor/Tools/ColorPickerWindow.cs b/Assets/Scripts/Editor/Tools/ColorPickerWindow.cs new file mode 100644 index 0000000..3290be2 --- /dev/null +++ b/Assets/Scripts/Editor/Tools/ColorPickerWindow.cs @@ -0,0 +1,60 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; + +public class ColorPickerWindow : EditorWindow +{ + + protected Color color = Color.white; + protected Color32 color32 = new Color32 ( 255, 255, 255, 255 ); + protected string hexCode = "FFFFFF"; + + [MenuItem ( "Tools/Color Picker" )] + public static void Init () + { + var window = EditorWindow.GetWindow ( "Color Picker" ); + window.Show (); + } + + protected virtual void OnGUI () + { + this.color = EditorGUILayout.ColorField ( "Color", this.color ); + if ( GUI.changed ) + { + this.color32 = this.color; + this.hexCode = ColorUtility.ToHtmlStringRGB ( this.color ); + } + this.hexCode = EditorGUILayout.TextField ( "Hex Code", this.hexCode ); + if ( GUI.changed ) + { + ColorUtility.TryParseHtmlString ( this.hexCode, out this.color ); + } + this.color32.r = ( byte )EditorGUILayout.IntSlider ( "Red", this.color32.r, 0, 255 ); + this.color32.g = ( byte )EditorGUILayout.IntSlider ( "Green", this.color32.g, 0, 255 ); + this.color32.b = ( byte )EditorGUILayout.IntSlider ( "Blue", this.color32.b, 0, 255 ); + this.color32.a = ( byte )EditorGUILayout.IntSlider ( "Alpha", this.color32.a, 0, 255 ); + if ( GUI.changed ) + { + this.color = this.color32; + this.hexCode = ColorUtility.ToHtmlStringRGB ( this.color ); + } + EditorGUILayout.TextField ( + "Color Code", + string.Format ( + "new Color ( {0}f, {1}f, {2}f, {3}f )", + this.color.r, + this.color.g, + this.color.b, + this.color.a ) ); + EditorGUILayout.TextField ( + "Color32 Code", + string.Format ( + "new Color32 ( {0}, {1}, {2}, {3} )", + this.color32.r, + this.color32.g, + this.color32.b, + this.color32.a ) ); + } + +} From c929594a094744b5d5c7a704da5e7b41cd0d15b1 Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Tue, 16 Jan 2018 10:33:00 +0330 Subject: [PATCH 108/231] Create SceneManagerWindow.cs --- .../Editor/Tools/SceneManagerWindow.cs | 363 ++++++++++++++++++ 1 file changed, 363 insertions(+) create mode 100644 Assets/Scripts/Editor/Tools/SceneManagerWindow.cs diff --git a/Assets/Scripts/Editor/Tools/SceneManagerWindow.cs b/Assets/Scripts/Editor/Tools/SceneManagerWindow.cs new file mode 100644 index 0000000..1814f36 --- /dev/null +++ b/Assets/Scripts/Editor/Tools/SceneManagerWindow.cs @@ -0,0 +1,363 @@ + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.SceneManagement; +using UnityEditor; +using UnityEditor.SceneManagement; + +public class SceneManagerWindow : EditorWindow +{ + + protected Vector2 scrollPosition; + protected NewSceneSetup newSceneSetup = NewSceneSetup.DefaultGameObjects; + protected NewSceneMode newSceneMode = NewSceneMode.Single; + protected OpenSceneMode openSceneMode = OpenSceneMode.Single; + protected bool showPath = false; + protected bool showAddToBuild = true; + protected bool askBeforeDelete = true; + protected bool [] selectedScenes; + protected string [] guids; + + [MenuItem ( "Tools/Scene Manager" )] + public static void Init () + { + var window = EditorWindow.GetWindow ( "Scene Manager" ); + window.Show (); + } + + protected virtual void OnGUI () + { + List buildScenes = new List ( EditorBuildSettings.scenes ); + GUILayout.Label ( "Scenes", EditorStyles.boldLabel ); + this.guids = AssetDatabase.FindAssets ( "t:Scene" ); + if ( this.selectedScenes == null || this.selectedScenes.Length != guids.Length ) + { + this.selectedScenes = new bool[guids.Length]; + } + this.scrollPosition = EditorGUILayout.BeginScrollView ( this.scrollPosition ); + EditorGUILayout.BeginVertical (); + for ( int i = 0; i < guids.Length; i++ ) + { + string path = AssetDatabase.GUIDToAssetPath ( guids [ i ] ); + SceneAsset sceneAsset = AssetDatabase.LoadAssetAtPath ( path ); + EditorBuildSettingsScene buildScene = buildScenes.Find ( (editorBuildScene ) => + { + return editorBuildScene.path == path; + } ); + Scene scene = SceneManager.GetSceneByPath ( path ); + bool isOpen = scene.IsValid () && scene.isLoaded; + EditorGUILayout.BeginHorizontal (); + this.selectedScenes [ i ] = EditorGUILayout.Toggle ( this.selectedScenes [ i ], GUILayout.Width ( 15 ) ); + if ( isOpen ) + { + GUILayout.Label ( sceneAsset.name, EditorStyles.whiteLabel ); + } + else + { + GUILayout.Label ( sceneAsset.name, EditorStyles.wordWrappedLabel ); + } + if ( this.showPath ) + { + GUILayout.Label ( path, EditorStyles.wordWrappedLabel ); + } + if ( buildScene == null ) + { + if ( this.showAddToBuild ) + { + if ( GUILayout.Button ( "Add to Build" ) ) + { + AddToBuild ( path ); + } + } + } + if ( GUILayout.Button ( isOpen ? "Close" : "Open", GUILayout.Width ( 50 ) ) ) + { + if ( isOpen ) + { + EditorSceneManager.CloseScene ( scene, true ); + } + else + { + Open ( path ); + } + } + if ( GUILayout.Button ( "Delete", GUILayout.Width ( 50 ) ) ) + { + Delete ( path ); + } + EditorGUILayout.EndHorizontal (); + } + if ( GUILayout.Button ( "Create New Scene" ) ) + { + Scene newScene = EditorSceneManager.NewScene ( this.newSceneSetup, this.newSceneMode ); + EditorSceneManager.SaveScene ( newScene ); + } + EditorGUILayout.EndVertical (); + EditorGUILayout.EndScrollView (); + GUILayout.Label ( "Bulk Actions", EditorStyles.boldLabel ); + bool anySelected = false; + for ( int i = 0; i < this.selectedScenes.Length; i++ ) + { + anySelected |= this.selectedScenes [ i ]; + } + GUI.enabled = anySelected; + EditorGUILayout.BeginHorizontal (); + if ( GUILayout.Button ( "Delete" ) ) + { + for ( int i = 0; i < this.selectedScenes.Length; i++ ) + { + if ( this.selectedScenes [ i ] ) + { + Delete ( AssetDatabase.GUIDToAssetPath ( this.guids [ i ] ) ); + } + } + } + if ( GUILayout.Button ( "Open Additive" ) ) + { + OpenSceneMode openMode = this.openSceneMode; + this.openSceneMode = OpenSceneMode.Additive; + for ( int i = 0; i < this.selectedScenes.Length; i++ ) + { + if ( this.selectedScenes [ i ] ) + { + Open ( AssetDatabase.GUIDToAssetPath ( this.guids [ i ] ) ); + } + } + this.openSceneMode = openMode; + } + EditorGUILayout.EndHorizontal (); + GUI.enabled = true; + GUILayout.Label ( "Actions", EditorStyles.boldLabel ); + EditorGUILayout.BeginHorizontal (); + if ( GUILayout.Button ( "Save Modified Scenes" ) ) + { + EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo (); + } + if ( GUILayout.Button ( "Save Open Scenes" ) ) + { + EditorSceneManager.SaveOpenScenes (); + } + EditorGUILayout.EndHorizontal (); + GUILayout.Label ( "Settings", EditorStyles.boldLabel ); + this.newSceneSetup = ( NewSceneSetup )EditorGUILayout.EnumPopup ( "New Scene Setup", this.newSceneSetup ); + this.newSceneMode = ( NewSceneMode )EditorGUILayout.EnumPopup ( "New Scene Mode", this.newSceneMode ); + this.openSceneMode = ( OpenSceneMode )EditorGUILayout.EnumPopup ( "Open Scene Mode", this.openSceneMode ); + this.showPath = EditorGUILayout.Toggle ( "Show Path", this.showPath ); + this.showAddToBuild = EditorGUILayout.Toggle ( "Show Add To Build", this.showAddToBuild ); + this.askBeforeDelete = EditorGUILayout.Toggle ( "Ask Before Delete", this.askBeforeDelete ); + } + + public virtual void Open ( string path ) + { + if ( EditorSceneManager.EnsureUntitledSceneHasBeenSaved ( "You don't have saved the Untitled Scene, Do you want to leave?" ) ) + { + EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo (); + EditorSceneManager.OpenScene ( path, this.openSceneMode ); + } + } + + public virtual void Delete ( string path ) + { + if ( !askBeforeDelete || EditorUtility.DisplayDialog ( + "Delete Scene", + string.Format ( + "Are you sure you want to delete the below scene: {0}", + path ), + "Delete", + "Cancel" ) ) + { + AssetDatabase.DeleteAsset ( path ); + AssetDatabase.Refresh (); + } + } + + public virtual void AddToBuild ( string path ) + { + List scenes = new List ( EditorBuildSettings.scenes ); + scenes.Add ( new EditorBuildSettingsScene ( path, true ) ); + EditorBuildSettings.scenes = scenes.ToArray (); + } + +} From 0e5df3783eeae7ba25ee926601a94fa21317d113 Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Tue, 16 Jan 2018 10:33:24 +0330 Subject: [PATCH 109/231] Create SceneSwitcherWindow.cs --- .../Editor/Tools/SceneSwitcherWindow.cs | 171 ++++++++++++++++++ 1 file changed, 171 insertions(+) create mode 100644 Assets/Scripts/Editor/Tools/SceneSwitcherWindow.cs diff --git a/Assets/Scripts/Editor/Tools/SceneSwitcherWindow.cs b/Assets/Scripts/Editor/Tools/SceneSwitcherWindow.cs new file mode 100644 index 0000000..397852b --- /dev/null +++ b/Assets/Scripts/Editor/Tools/SceneSwitcherWindow.cs @@ -0,0 +1,171 @@ + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.SceneManagement; +using UnityEditor; +using UnityEditor.SceneManagement; + +public class SceneSwitcherWindow : EditorWindow +{ + + public enum ScenesSource + { + Assets, + BuildSettings + } + + protected Vector2 scrollPosition; + protected ScenesSource scenesSource = ScenesSource.Assets; + protected OpenSceneMode openSceneMode = OpenSceneMode.Single; + + [MenuItem ( "Tools/Scene Switcher" )] + public static void Init () + { + var window = EditorWindow.GetWindow ( "Scene Switcher" ); + window.Show (); + } + + protected virtual void OnGUI () + { + List buildScenes = new List ( EditorBuildSettings.scenes ); + this.scenesSource = ( ScenesSource )EditorGUILayout.EnumPopup ( "Scenes Source", this.scenesSource ); + this.openSceneMode = ( OpenSceneMode )EditorGUILayout.EnumPopup ( "Open Scene Mode", this.openSceneMode ); + GUILayout.Label ( "Scenes", EditorStyles.boldLabel ); + string [] guids = AssetDatabase.FindAssets ( "t:Scene" ); + this.scrollPosition = EditorGUILayout.BeginScrollView ( this.scrollPosition ); + EditorGUILayout.BeginVertical (); + for ( int i = 0; i < guids.Length; i++ ) + { + string path = AssetDatabase.GUIDToAssetPath ( guids [ i ] ); + SceneAsset sceneAsset = AssetDatabase.LoadAssetAtPath ( path ); + EditorBuildSettingsScene buildScene = buildScenes.Find ( (editorBuildScene ) => + { + return editorBuildScene.path == path; + } ); + Scene scene = SceneManager.GetSceneByPath ( path ); + bool isOpen = scene.IsValid () && scene.isLoaded; + GUI.enabled = !isOpen; + if ( this.scenesSource == ScenesSource.Assets ) + { + if ( GUILayout.Button ( sceneAsset.name ) ) + { + Open ( path ); + } + } + else + { + if ( buildScene != null ) + { + if ( GUILayout.Button ( sceneAsset.name ) ) + { + Open ( path ); + } + } + } + GUI.enabled = true; + } + if ( GUILayout.Button ( "Create New Scene" ) ) + { + Scene newScene = EditorSceneManager.NewScene ( NewSceneSetup.DefaultGameObjects, NewSceneMode.Single ); + EditorSceneManager.SaveScene ( newScene ); + } + EditorGUILayout.EndVertical (); + EditorGUILayout.EndScrollView (); + } + + public virtual void Open ( string path ) + { + if ( EditorSceneManager.EnsureUntitledSceneHasBeenSaved ( "You don't have saved the Untitled Scene, Do you want to leave?" ) ) + { + EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo (); + EditorSceneManager.OpenScene ( path, this.openSceneMode ); + } + } + +} From 9e4fa1c760dc7d45694e21145a4ce990204232f5 Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Tue, 16 Jan 2018 10:34:57 +0330 Subject: [PATCH 110/231] Update SceneManagerWindow.cs --- .../Editor/Tools/SceneManagerWindow.cs | 526 ++++++------------ 1 file changed, 172 insertions(+), 354 deletions(-) diff --git a/Assets/Scripts/Editor/Tools/SceneManagerWindow.cs b/Assets/Scripts/Editor/Tools/SceneManagerWindow.cs index 1814f36..6543586 100644 --- a/Assets/Scripts/Editor/Tools/SceneManagerWindow.cs +++ b/Assets/Scripts/Editor/Tools/SceneManagerWindow.cs @@ -1,363 +1,181 @@ - -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; using UnityEditor; using UnityEditor.SceneManagement; - + public class SceneManagerWindow : EditorWindow { - - protected Vector2 scrollPosition; - protected NewSceneSetup newSceneSetup = NewSceneSetup.DefaultGameObjects; - protected NewSceneMode newSceneMode = NewSceneMode.Single; - protected OpenSceneMode openSceneMode = OpenSceneMode.Single; - protected bool showPath = false; - protected bool showAddToBuild = true; - protected bool askBeforeDelete = true; - protected bool [] selectedScenes; - protected string [] guids; - - [MenuItem ( "Tools/Scene Manager" )] - public static void Init () - { - var window = EditorWindow.GetWindow ( "Scene Manager" ); - window.Show (); - } - - protected virtual void OnGUI () - { - List buildScenes = new List ( EditorBuildSettings.scenes ); - GUILayout.Label ( "Scenes", EditorStyles.boldLabel ); - this.guids = AssetDatabase.FindAssets ( "t:Scene" ); - if ( this.selectedScenes == null || this.selectedScenes.Length != guids.Length ) - { - this.selectedScenes = new bool[guids.Length]; - } - this.scrollPosition = EditorGUILayout.BeginScrollView ( this.scrollPosition ); - EditorGUILayout.BeginVertical (); - for ( int i = 0; i < guids.Length; i++ ) - { - string path = AssetDatabase.GUIDToAssetPath ( guids [ i ] ); - SceneAsset sceneAsset = AssetDatabase.LoadAssetAtPath ( path ); - EditorBuildSettingsScene buildScene = buildScenes.Find ( (editorBuildScene ) => - { - return editorBuildScene.path == path; - } ); - Scene scene = SceneManager.GetSceneByPath ( path ); - bool isOpen = scene.IsValid () && scene.isLoaded; - EditorGUILayout.BeginHorizontal (); - this.selectedScenes [ i ] = EditorGUILayout.Toggle ( this.selectedScenes [ i ], GUILayout.Width ( 15 ) ); - if ( isOpen ) - { - GUILayout.Label ( sceneAsset.name, EditorStyles.whiteLabel ); - } - else - { - GUILayout.Label ( sceneAsset.name, EditorStyles.wordWrappedLabel ); - } - if ( this.showPath ) - { - GUILayout.Label ( path, EditorStyles.wordWrappedLabel ); - } - if ( buildScene == null ) - { - if ( this.showAddToBuild ) - { - if ( GUILayout.Button ( "Add to Build" ) ) - { - AddToBuild ( path ); - } - } - } - if ( GUILayout.Button ( isOpen ? "Close" : "Open", GUILayout.Width ( 50 ) ) ) - { - if ( isOpen ) - { - EditorSceneManager.CloseScene ( scene, true ); - } - else - { - Open ( path ); - } - } - if ( GUILayout.Button ( "Delete", GUILayout.Width ( 50 ) ) ) - { - Delete ( path ); - } - EditorGUILayout.EndHorizontal (); - } - if ( GUILayout.Button ( "Create New Scene" ) ) - { - Scene newScene = EditorSceneManager.NewScene ( this.newSceneSetup, this.newSceneMode ); - EditorSceneManager.SaveScene ( newScene ); - } - EditorGUILayout.EndVertical (); - EditorGUILayout.EndScrollView (); - GUILayout.Label ( "Bulk Actions", EditorStyles.boldLabel ); - bool anySelected = false; - for ( int i = 0; i < this.selectedScenes.Length; i++ ) - { - anySelected |= this.selectedScenes [ i ]; - } - GUI.enabled = anySelected; - EditorGUILayout.BeginHorizontal (); - if ( GUILayout.Button ( "Delete" ) ) - { - for ( int i = 0; i < this.selectedScenes.Length; i++ ) - { - if ( this.selectedScenes [ i ] ) - { - Delete ( AssetDatabase.GUIDToAssetPath ( this.guids [ i ] ) ); - } - } - } - if ( GUILayout.Button ( "Open Additive" ) ) - { - OpenSceneMode openMode = this.openSceneMode; - this.openSceneMode = OpenSceneMode.Additive; - for ( int i = 0; i < this.selectedScenes.Length; i++ ) - { - if ( this.selectedScenes [ i ] ) - { - Open ( AssetDatabase.GUIDToAssetPath ( this.guids [ i ] ) ); - } - } - this.openSceneMode = openMode; - } - EditorGUILayout.EndHorizontal (); - GUI.enabled = true; - GUILayout.Label ( "Actions", EditorStyles.boldLabel ); - EditorGUILayout.BeginHorizontal (); - if ( GUILayout.Button ( "Save Modified Scenes" ) ) - { - EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo (); - } - if ( GUILayout.Button ( "Save Open Scenes" ) ) - { - EditorSceneManager.SaveOpenScenes (); - } - EditorGUILayout.EndHorizontal (); - GUILayout.Label ( "Settings", EditorStyles.boldLabel ); - this.newSceneSetup = ( NewSceneSetup )EditorGUILayout.EnumPopup ( "New Scene Setup", this.newSceneSetup ); - this.newSceneMode = ( NewSceneMode )EditorGUILayout.EnumPopup ( "New Scene Mode", this.newSceneMode ); - this.openSceneMode = ( OpenSceneMode )EditorGUILayout.EnumPopup ( "Open Scene Mode", this.openSceneMode ); - this.showPath = EditorGUILayout.Toggle ( "Show Path", this.showPath ); - this.showAddToBuild = EditorGUILayout.Toggle ( "Show Add To Build", this.showAddToBuild ); - this.askBeforeDelete = EditorGUILayout.Toggle ( "Ask Before Delete", this.askBeforeDelete ); - } - - public virtual void Open ( string path ) - { - if ( EditorSceneManager.EnsureUntitledSceneHasBeenSaved ( "You don't have saved the Untitled Scene, Do you want to leave?" ) ) - { - EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo (); - EditorSceneManager.OpenScene ( path, this.openSceneMode ); - } - } - - public virtual void Delete ( string path ) - { - if ( !askBeforeDelete || EditorUtility.DisplayDialog ( - "Delete Scene", - string.Format ( - "Are you sure you want to delete the below scene: {0}", - path ), - "Delete", - "Cancel" ) ) - { - AssetDatabase.DeleteAsset ( path ); - AssetDatabase.Refresh (); - } - } - - public virtual void AddToBuild ( string path ) - { - List scenes = new List ( EditorBuildSettings.scenes ); - scenes.Add ( new EditorBuildSettingsScene ( path, true ) ); - EditorBuildSettings.scenes = scenes.ToArray (); - } - + + protected Vector2 scrollPosition; + protected NewSceneSetup newSceneSetup = NewSceneSetup.DefaultGameObjects; + protected NewSceneMode newSceneMode = NewSceneMode.Single; + protected OpenSceneMode openSceneMode = OpenSceneMode.Single; + protected bool showPath = false; + protected bool showAddToBuild = true; + protected bool askBeforeDelete = true; + protected bool [] selectedScenes; + protected string [] guids; + + [MenuItem ( "Tools/Scene Manager" )] + public static void Init () + { + var window = EditorWindow.GetWindow ( "Scene Manager" ); + window.Show (); + } + + protected virtual void OnGUI () + { + List buildScenes = new List ( EditorBuildSettings.scenes ); + GUILayout.Label ( "Scenes", EditorStyles.boldLabel ); + this.guids = AssetDatabase.FindAssets ( "t:Scene" ); + if ( this.selectedScenes == null || this.selectedScenes.Length != guids.Length ) + { + this.selectedScenes = new bool[guids.Length]; + } + this.scrollPosition = EditorGUILayout.BeginScrollView ( this.scrollPosition ); + EditorGUILayout.BeginVertical (); + for ( int i = 0; i < guids.Length; i++ ) + { + string path = AssetDatabase.GUIDToAssetPath ( guids [ i ] ); + SceneAsset sceneAsset = AssetDatabase.LoadAssetAtPath ( path ); + EditorBuildSettingsScene buildScene = buildScenes.Find ( (editorBuildScene ) => + { + return editorBuildScene.path == path; + } ); + Scene scene = SceneManager.GetSceneByPath ( path ); + bool isOpen = scene.IsValid () && scene.isLoaded; + EditorGUILayout.BeginHorizontal (); + this.selectedScenes [ i ] = EditorGUILayout.Toggle ( this.selectedScenes [ i ], GUILayout.Width ( 15 ) ); + if ( isOpen ) + { + GUILayout.Label ( sceneAsset.name, EditorStyles.whiteLabel ); + } + else + { + GUILayout.Label ( sceneAsset.name, EditorStyles.wordWrappedLabel ); + } + if ( this.showPath ) + { + GUILayout.Label ( path, EditorStyles.wordWrappedLabel ); + } + if ( buildScene == null ) + { + if ( this.showAddToBuild ) + { + if ( GUILayout.Button ( "Add to Build" ) ) + { + AddToBuild ( path ); + } + } + } + if ( GUILayout.Button ( isOpen ? "Close" : "Open", GUILayout.Width ( 50 ) ) ) + { + if ( isOpen ) + { + EditorSceneManager.CloseScene ( scene, true ); + } + else + { + Open ( path ); + } + } + if ( GUILayout.Button ( "Delete", GUILayout.Width ( 50 ) ) ) + { + Delete ( path ); + } + EditorGUILayout.EndHorizontal (); + } + if ( GUILayout.Button ( "Create New Scene" ) ) + { + Scene newScene = EditorSceneManager.NewScene ( this.newSceneSetup, this.newSceneMode ); + EditorSceneManager.SaveScene ( newScene ); + } + EditorGUILayout.EndVertical (); + EditorGUILayout.EndScrollView (); + GUILayout.Label ( "Bulk Actions", EditorStyles.boldLabel ); + bool anySelected = false; + for ( int i = 0; i < this.selectedScenes.Length; i++ ) + { + anySelected |= this.selectedScenes [ i ]; + } + GUI.enabled = anySelected; + EditorGUILayout.BeginHorizontal (); + if ( GUILayout.Button ( "Delete" ) ) + { + for ( int i = 0; i < this.selectedScenes.Length; i++ ) + { + if ( this.selectedScenes [ i ] ) + { + Delete ( AssetDatabase.GUIDToAssetPath ( this.guids [ i ] ) ); + } + } + } + if ( GUILayout.Button ( "Open Additive" ) ) + { + OpenSceneMode openMode = this.openSceneMode; + this.openSceneMode = OpenSceneMode.Additive; + for ( int i = 0; i < this.selectedScenes.Length; i++ ) + { + if ( this.selectedScenes [ i ] ) + { + Open ( AssetDatabase.GUIDToAssetPath ( this.guids [ i ] ) ); + } + } + this.openSceneMode = openMode; + } + EditorGUILayout.EndHorizontal (); + GUI.enabled = true; + GUILayout.Label ( "Actions", EditorStyles.boldLabel ); + EditorGUILayout.BeginHorizontal (); + if ( GUILayout.Button ( "Save Modified Scenes" ) ) + { + EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo (); + } + if ( GUILayout.Button ( "Save Open Scenes" ) ) + { + EditorSceneManager.SaveOpenScenes (); + } + EditorGUILayout.EndHorizontal (); + GUILayout.Label ( "Settings", EditorStyles.boldLabel ); + this.newSceneSetup = ( NewSceneSetup )EditorGUILayout.EnumPopup ( "New Scene Setup", this.newSceneSetup ); + this.newSceneMode = ( NewSceneMode )EditorGUILayout.EnumPopup ( "New Scene Mode", this.newSceneMode ); + this.openSceneMode = ( OpenSceneMode )EditorGUILayout.EnumPopup ( "Open Scene Mode", this.openSceneMode ); + this.showPath = EditorGUILayout.Toggle ( "Show Path", this.showPath ); + this.showAddToBuild = EditorGUILayout.Toggle ( "Show Add To Build", this.showAddToBuild ); + this.askBeforeDelete = EditorGUILayout.Toggle ( "Ask Before Delete", this.askBeforeDelete ); + } + + public virtual void Open ( string path ) + { + if ( EditorSceneManager.EnsureUntitledSceneHasBeenSaved ( "You don't have saved the Untitled Scene, Do you want to leave?" ) ) + { + EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo (); + EditorSceneManager.OpenScene ( path, this.openSceneMode ); + } + } + + public virtual void Delete ( string path ) + { + if ( !askBeforeDelete || EditorUtility.DisplayDialog ( + "Delete Scene", + string.Format ( + "Are you sure you want to delete the below scene: {0}", + path ), + "Delete", + "Cancel" ) ) + { + AssetDatabase.DeleteAsset ( path ); + AssetDatabase.Refresh (); + } + } + + public virtual void AddToBuild ( string path ) + { + List scenes = new List ( EditorBuildSettings.scenes ); + scenes.Add ( new EditorBuildSettingsScene ( path, true ) ); + EditorBuildSettings.scenes = scenes.ToArray (); + } + } From e6b3657e0a636a53e3968ae5a2b92999d2056302 Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Tue, 16 Jan 2018 10:35:13 +0330 Subject: [PATCH 111/231] Update SceneSwitcherWindow.cs --- .../Editor/Tools/SceneSwitcherWindow.cs | 238 ++++++------------ 1 file changed, 76 insertions(+), 162 deletions(-) diff --git a/Assets/Scripts/Editor/Tools/SceneSwitcherWindow.cs b/Assets/Scripts/Editor/Tools/SceneSwitcherWindow.cs index 397852b..e78a0bd 100644 --- a/Assets/Scripts/Editor/Tools/SceneSwitcherWindow.cs +++ b/Assets/Scripts/Editor/Tools/SceneSwitcherWindow.cs @@ -1,171 +1,85 @@ - -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; using UnityEditor; using UnityEditor.SceneManagement; - + public class SceneSwitcherWindow : EditorWindow { - - public enum ScenesSource - { - Assets, - BuildSettings - } - - protected Vector2 scrollPosition; - protected ScenesSource scenesSource = ScenesSource.Assets; - protected OpenSceneMode openSceneMode = OpenSceneMode.Single; - - [MenuItem ( "Tools/Scene Switcher" )] - public static void Init () - { - var window = EditorWindow.GetWindow ( "Scene Switcher" ); - window.Show (); - } - - protected virtual void OnGUI () - { - List buildScenes = new List ( EditorBuildSettings.scenes ); - this.scenesSource = ( ScenesSource )EditorGUILayout.EnumPopup ( "Scenes Source", this.scenesSource ); - this.openSceneMode = ( OpenSceneMode )EditorGUILayout.EnumPopup ( "Open Scene Mode", this.openSceneMode ); - GUILayout.Label ( "Scenes", EditorStyles.boldLabel ); - string [] guids = AssetDatabase.FindAssets ( "t:Scene" ); - this.scrollPosition = EditorGUILayout.BeginScrollView ( this.scrollPosition ); - EditorGUILayout.BeginVertical (); - for ( int i = 0; i < guids.Length; i++ ) - { - string path = AssetDatabase.GUIDToAssetPath ( guids [ i ] ); - SceneAsset sceneAsset = AssetDatabase.LoadAssetAtPath ( path ); - EditorBuildSettingsScene buildScene = buildScenes.Find ( (editorBuildScene ) => - { - return editorBuildScene.path == path; - } ); - Scene scene = SceneManager.GetSceneByPath ( path ); - bool isOpen = scene.IsValid () && scene.isLoaded; - GUI.enabled = !isOpen; - if ( this.scenesSource == ScenesSource.Assets ) - { - if ( GUILayout.Button ( sceneAsset.name ) ) - { - Open ( path ); - } - } - else - { - if ( buildScene != null ) - { - if ( GUILayout.Button ( sceneAsset.name ) ) - { - Open ( path ); - } - } - } - GUI.enabled = true; - } - if ( GUILayout.Button ( "Create New Scene" ) ) - { - Scene newScene = EditorSceneManager.NewScene ( NewSceneSetup.DefaultGameObjects, NewSceneMode.Single ); - EditorSceneManager.SaveScene ( newScene ); - } - EditorGUILayout.EndVertical (); - EditorGUILayout.EndScrollView (); - } - - public virtual void Open ( string path ) - { - if ( EditorSceneManager.EnsureUntitledSceneHasBeenSaved ( "You don't have saved the Untitled Scene, Do you want to leave?" ) ) - { - EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo (); - EditorSceneManager.OpenScene ( path, this.openSceneMode ); - } - } - + + public enum ScenesSource + { + Assets, + BuildSettings + } + + protected Vector2 scrollPosition; + protected ScenesSource scenesSource = ScenesSource.Assets; + protected OpenSceneMode openSceneMode = OpenSceneMode.Single; + + [MenuItem ( "Tools/Scene Switcher" )] + public static void Init () + { + var window = EditorWindow.GetWindow ( "Scene Switcher" ); + window.Show (); + } + + protected virtual void OnGUI () + { + List buildScenes = new List ( EditorBuildSettings.scenes ); + this.scenesSource = ( ScenesSource )EditorGUILayout.EnumPopup ( "Scenes Source", this.scenesSource ); + this.openSceneMode = ( OpenSceneMode )EditorGUILayout.EnumPopup ( "Open Scene Mode", this.openSceneMode ); + GUILayout.Label ( "Scenes", EditorStyles.boldLabel ); + string [] guids = AssetDatabase.FindAssets ( "t:Scene" ); + this.scrollPosition = EditorGUILayout.BeginScrollView ( this.scrollPosition ); + EditorGUILayout.BeginVertical (); + for ( int i = 0; i < guids.Length; i++ ) + { + string path = AssetDatabase.GUIDToAssetPath ( guids [ i ] ); + SceneAsset sceneAsset = AssetDatabase.LoadAssetAtPath ( path ); + EditorBuildSettingsScene buildScene = buildScenes.Find ( (editorBuildScene ) => + { + return editorBuildScene.path == path; + } ); + Scene scene = SceneManager.GetSceneByPath ( path ); + bool isOpen = scene.IsValid () && scene.isLoaded; + GUI.enabled = !isOpen; + if ( this.scenesSource == ScenesSource.Assets ) + { + if ( GUILayout.Button ( sceneAsset.name ) ) + { + Open ( path ); + } + } + else + { + if ( buildScene != null ) + { + if ( GUILayout.Button ( sceneAsset.name ) ) + { + Open ( path ); + } + } + } + GUI.enabled = true; + } + if ( GUILayout.Button ( "Create New Scene" ) ) + { + Scene newScene = EditorSceneManager.NewScene ( NewSceneSetup.DefaultGameObjects, NewSceneMode.Single ); + EditorSceneManager.SaveScene ( newScene ); + } + EditorGUILayout.EndVertical (); + EditorGUILayout.EndScrollView (); + } + + public virtual void Open ( string path ) + { + if ( EditorSceneManager.EnsureUntitledSceneHasBeenSaved ( "You don't have saved the Untitled Scene, Do you want to leave?" ) ) + { + EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo (); + EditorSceneManager.OpenScene ( path, this.openSceneMode ); + } + } + } From beef9405b2f85ac85f835251145e663605df9324 Mon Sep 17 00:00:00 2001 From: mika Date: Mon, 26 Feb 2018 13:33:40 +0800 Subject: [PATCH 112/231] Create UnparentMe.cs --- Assets/Scripts/Editor/Hierarchy/UnparentMe.cs | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 Assets/Scripts/Editor/Hierarchy/UnparentMe.cs diff --git a/Assets/Scripts/Editor/Hierarchy/UnparentMe.cs b/Assets/Scripts/Editor/Hierarchy/UnparentMe.cs new file mode 100644 index 0000000..18e75b1 --- /dev/null +++ b/Assets/Scripts/Editor/Hierarchy/UnparentMe.cs @@ -0,0 +1,21 @@ +// unparents selected gameobject in hierarchy (by moving to grandparents if available) + +using UnityEditor; + +namespace UnityLibrary +{ + public class UnparentMe + { + // https://docs.unity3d.com/ScriptReference/MenuItem.html + // shift U shortcut key + [MenuItem("GameObject/Unparent #u")] + static void UnParent() + { + // TODO: add undo + if (Selection.activeGameObject != null && Selection.activeGameObject.transform.parent != null) + { + Selection.activeGameObject.transform.parent = Selection.activeGameObject.transform.parent.parent; + } + } + } +} From 31cfac5243cf5478f6934783f716a8f2fd5c6fd5 Mon Sep 17 00:00:00 2001 From: mika Date: Fri, 19 Oct 2018 22:43:34 +0800 Subject: [PATCH 113/231] Create HSVDebugger.shader --- Assets/Shaders/2D/Debug/HSVDebugger.shader | 135 +++++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 Assets/Shaders/2D/Debug/HSVDebugger.shader diff --git a/Assets/Shaders/2D/Debug/HSVDebugger.shader b/Assets/Shaders/2D/Debug/HSVDebugger.shader new file mode 100644 index 0000000..63f3e20 --- /dev/null +++ b/Assets/Shaders/2D/Debug/HSVDebugger.shader @@ -0,0 +1,135 @@ +// HSV Debugger Shader by UnityCoder.com - https://unitycoder.com/blog/2018/10/19/hsv-debugging-shader/ + +Shader "UnityLibrary/Debug/HSVDebugger" +{ + Properties + { + _MainTex ("Texture", 2D) = "white" {} + _TargetColor ("Target Color", Color) = (1, 0, 0, 1) + _HueThreshold ("Hue Threshold", Float) = 0.1 + _SatThreshold ("Saturation Threshold", Float) = 0.1 + _ValThreshold ("Value Threshold", Float) = 0.1 + [KeywordEnum(None, Hue, Saturation, Value, HueDistance, SaturationDistance, ValueDistance, ColorMatch, RemapHue)] _Mode ("Draw Mode",float) = 1 + _HueTex ("Hue Gradient Texture", 2D) = "white" {} + } + + SubShader + { + Tags { "RenderType"="Opaque" } + LOD 100 + + Pass + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma multi_compile _MODE_NONE _MODE_HUE _MODE_SATURATION _MODE_VALUE _MODE_HUEDISTANCE _MODE_SATURATIONDISTANCE _MODE_VALUEDISTANCE _MODE_COLORMATCH _MODE_REMAPHUE + + #include "UnityCG.cginc" + + struct appdata + { + float4 vertex : POSITION; + float2 uv : TEXCOORD0; + }; + + struct v2f + { + float2 uv : TEXCOORD0; + float4 vertex : SV_POSITION; + }; + + sampler2D _MainTex; + sampler2D _HueTex; + + float4 _MainTex_ST; + float _HueThreshold; + float _SatThreshold; + float _ValThreshold; + float4 _TargetColor; + + // http://lolengine.net/blog/2013/07/27/rgb-to-hsv-in-glsl + float3 rgb2hsv(float3 c) + { + float4 K = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + float4 p = lerp(float4(c.bg, K.wz), float4(c.gb, K.xy), step(c.b, c.g)); + float4 q = lerp(float4(p.xyw, c.r), float4(c.r, p.yzx), step(p.x, c.r)); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + } + + v2f vert (appdata v) + { + v2f o; + o.vertex = UnityObjectToClipPos(v.vertex); + o.uv = TRANSFORM_TEX(v.uv, _MainTex); + return o; + } + + fixed4 frag (v2f i) : SV_Target + { + // read main texture + fixed4 tex = tex2D(_MainTex, i.uv); + + // convert colors + float3 sourceHSV = rgb2hsv(tex.rgb); + float3 targetHSV = rgb2hsv(_TargetColor.rbg); + + // get distances to our target color + float hueDist = abs(sourceHSV.x - (1-targetHSV.x)); // why -1? + float satDist = abs(sourceHSV.y - targetHSV.y); + float valDist = abs(sourceHSV.z - targetHSV.z); + + float4 results = tex; + + // select results, based on enum dropdowm + #ifdef _MODE_HUE + results.rgb = sourceHSV.x; + #endif + + #ifdef _MODE_SATURATION + results.rgb = sourceHSV.y; + #endif + + #ifdef _MODE_VALUE + results.rgb = sourceHSV.z; + #endif + + #ifdef _MODE_HUEDISTANCE + results.rgb = hueDist; + #endif + + #ifdef _MODE_SATURATIONDISTANCE + results.rgb = satDist; + #endif + + #ifdef _MODE_VALUEDISTANCE + results.rgb = valDist; + #endif + + #ifdef _MODE_REMAPHUE + results.rgb = tex2D(_HueTex, float2(sourceHSV.x,0.5)).rgb; + #endif + + #ifdef _MODE_COLORMATCH + if (hueDist < _HueThreshold) + { + if (satDist < _SatThreshold) + { + if (valDist < _ValThreshold) + { + // display inverted color for matching area + results.rgb = 1-results.rgb; + } + } + } + #endif + + // draw + return results; + } + ENDCG + } // pass + } // subshader +} // shader From 52e3b4714e850d5602a496df88467f51356ed519 Mon Sep 17 00:00:00 2001 From: mika Date: Wed, 31 Oct 2018 15:26:24 +0800 Subject: [PATCH 114/231] Create CullingGroupExample.cs --- .../Docs/UnityEngine/CullingGroupExample.cs | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 Assets/Scripts/Docs/UnityEngine/CullingGroupExample.cs diff --git a/Assets/Scripts/Docs/UnityEngine/CullingGroupExample.cs b/Assets/Scripts/Docs/UnityEngine/CullingGroupExample.cs new file mode 100644 index 0000000..2f27c2e --- /dev/null +++ b/Assets/Scripts/Docs/UnityEngine/CullingGroupExample.cs @@ -0,0 +1,85 @@ +// gets nearby objects using CullingGroup +// Assign this script to some gameobject, that the distance is measured from + +using UnityEngine; + +namespace UnityLibrary +{ + public class CullingGroupExample : MonoBehaviour + { + // just some dummy prefab to spawn (use default sphere for example) + public GameObject prefab; + + // distance to search objects from + public float searchDistance = 3; + + int objectCount = 5000; + + // collection of objects + Renderer[] objects; + CullingGroup cullGroup; + BoundingSphere[] bounds; + + void Start() + { + // create culling group + cullGroup = new CullingGroup(); + cullGroup.targetCamera = Camera.main; + + // measure distance to our transform + cullGroup.SetDistanceReferencePoint(transform); + + // search distance "bands" starts from 0, so index=0 is from 0 to searchDistance + cullGroup.SetBoundingDistances(new float[] { searchDistance, float.PositiveInfinity }); + + bounds = new BoundingSphere[objectCount]; + + // spam random objects + objects = new Renderer[objectCount]; + for (int i = 0; i < objectCount; i++) + { + var pos = Random.insideUnitCircle * 30; + var go = Instantiate(prefab, pos, Quaternion.identity); + objects[i] = go.GetComponent(); + + // collect bounds for objects + var b = new BoundingSphere(); + b.position = go.transform.position; + + // get simple radius..works for our sphere + b.radius = go.GetComponent().mesh.bounds.extents.x; + bounds[i] = b; + } + + // set bounds that we track + cullGroup.SetBoundingSpheres(bounds); + cullGroup.SetBoundingSphereCount(objects.Length); + + // subscribe to event + cullGroup.onStateChanged += StateChanged; + } + + // object state has changed in culling group + void StateChanged(CullingGroupEvent e) + { + // if we are in distance band index 0, that is between 0 to searchDistance + if (e.currentDistance == 0) + { + objects[e.index].material.color = Color.green; + } + else // too far, set color to red + { + objects[e.index].material.color = Color.red; + } + } + + // cleanup + private void OnDestroy() + { + cullGroup.onStateChanged -= StateChanged; + cullGroup.Dispose(); + cullGroup = null; + } + + } +} From 844352b4cfbef22bbef4072eab7d9ab3a5e2a356 Mon Sep 17 00:00:00 2001 From: mika Date: Wed, 31 Oct 2018 21:59:17 +0800 Subject: [PATCH 115/231] Update CullingGroupExample.cs --- Assets/Scripts/Docs/UnityEngine/CullingGroupExample.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Assets/Scripts/Docs/UnityEngine/CullingGroupExample.cs b/Assets/Scripts/Docs/UnityEngine/CullingGroupExample.cs index 2f27c2e..2a5f505 100644 --- a/Assets/Scripts/Docs/UnityEngine/CullingGroupExample.cs +++ b/Assets/Scripts/Docs/UnityEngine/CullingGroupExample.cs @@ -13,6 +13,8 @@ public class CullingGroupExample : MonoBehaviour // distance to search objects from public float searchDistance = 3; + public bool colorInvisibleObjects = false; + int objectCount = 5000; // collection of objects @@ -62,6 +64,12 @@ void Start() // object state has changed in culling group void StateChanged(CullingGroupEvent e) { + if (colorInvisibleObjects == true && e.isVisible == false) + { + objects[e.index].material.color = Color.gray; + return; + } + // if we are in distance band index 0, that is between 0 to searchDistance if (e.currentDistance == 0) { From 74ba6e8fdf412304b133956aa65563d07781777e Mon Sep 17 00:00:00 2001 From: mika Date: Sat, 10 Nov 2018 21:01:04 +0800 Subject: [PATCH 116/231] add discord chat button --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index fffe7a5..7f6ecea 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,9 @@ # Unity Library + +
:tada: Welcome to Unity Library :tada: Useful scripts, snippets and shaders here it is gathered for free. From 3f140695956bf96c7613fc75fd2a60709cc96fc6 Mon Sep 17 00:00:00 2001 From: mika Date: Thu, 29 Nov 2018 19:24:12 +0200 Subject: [PATCH 117/231] Create FlipBook.shader --- Assets/Shaders/2D/Sprites/FlipBook.shader | 93 +++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 Assets/Shaders/2D/Sprites/FlipBook.shader diff --git a/Assets/Shaders/2D/Sprites/FlipBook.shader b/Assets/Shaders/2D/Sprites/FlipBook.shader new file mode 100644 index 0000000..d548f03 --- /dev/null +++ b/Assets/Shaders/2D/Sprites/FlipBook.shader @@ -0,0 +1,93 @@ +// https://unitycoder.com/blog/2018/11/30/sprite-sheet-flip-book-shader/ + +Shader "UnityLibrary/Sprites/FlipBook (AlphaTest)" +{ + Properties + { + [Header(Texture Sheet)] + _MainTex ("Texture", 2D) = "white" {} + _Cutoff("Alpha Cutoff", Range(0,1)) = 0.15 + [Header(Settings)] + _ColumnsX("Columns (X)", int) = 1 + _RowsY("Rows (Y)", int) = 1 + _AnimationSpeed("Frames Per Seconds", float) = 10 + } + SubShader + { + Tags { + "Queue" = "AlphaTest" + "IgnoreProjector" = "True" + "PreviewType" = "Plane" + "RenderType" = "TransparentCutout" + "DisableBatching" = "True" + } + + LOD 100 + + Pass + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #include "UnityCG.cginc" + + struct appdata + { + float4 vertex : POSITION; + float2 uv : TEXCOORD0; + }; + + struct v2f + { + float2 uv : TEXCOORD0; + float4 vertex : SV_POSITION; + }; + + float _Cutoff; + sampler2D _MainTex; + float4 _MainTex_ST; + int _ColumnsX; + int _RowsY; + float _AnimationSpeed; + + v2f vert (appdata v) + { + v2f o; + o.vertex = UnityObjectToClipPos(v.vertex); + + // based on http://wiki.unity3d.com/index.php?title=Animating_Tiled_texture + + // Calculate index + float index = floor(_Time.y*_AnimationSpeed); + + // repeat when exhausting all frames + index = index % (_ColumnsX * _RowsY); + + // Size of tile + float2 size = float2(1.0f / _ColumnsX, 1.0f / _RowsY); + + // split into horizontal and vertical index + float uIndex = floor(index % _ColumnsX); + float vIndex = floor(index / _RowsY); + + // build offset + // v coordinate is the bottom of the image in opengl so we need to invert. + float2 offset = float2(uIndex * size.x, 1.0f - size.y - vIndex * size.y); + + o.uv = v.uv*size + offset; + return o; + } + + fixed4 frag (v2f i) : SV_Target + { + fixed4 col = tex2D(_MainTex, i.uv); + + // cutout + clip(col.a - _Cutoff); + + return col; + } + ENDCG + } + } +} From 370e5a43f3ec90156368fec71b0be53f390e6879 Mon Sep 17 00:00:00 2001 From: mika Date: Fri, 30 Nov 2018 15:49:22 +0200 Subject: [PATCH 118/231] fix flipbook shader --- Assets/Shaders/2D/Sprites/FlipBook.shader | 45 ++++++++++++----------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/Assets/Shaders/2D/Sprites/FlipBook.shader b/Assets/Shaders/2D/Sprites/FlipBook.shader index d548f03..90027e0 100644 --- a/Assets/Shaders/2D/Sprites/FlipBook.shader +++ b/Assets/Shaders/2D/Sprites/FlipBook.shader @@ -1,11 +1,11 @@ // https://unitycoder.com/blog/2018/11/30/sprite-sheet-flip-book-shader/ -Shader "UnityLibrary/Sprites/FlipBook (AlphaTest)" +Shader "UnityLibrary/Sprites/FlipBook (Cutout)" { Properties { [Header(Texture Sheet)] - _MainTex ("Texture", 2D) = "white" {} + _MainTex("Texture", 2D) = "white" {} _Cutoff("Alpha Cutoff", Range(0,1)) = 0.15 [Header(Settings)] _ColumnsX("Columns (X)", int) = 1 @@ -46,39 +46,40 @@ Shader "UnityLibrary/Sprites/FlipBook (AlphaTest)" float _Cutoff; sampler2D _MainTex; float4 _MainTex_ST; - int _ColumnsX; - int _RowsY; + uint _ColumnsX; + uint _RowsY; float _AnimationSpeed; - v2f vert (appdata v) + v2f vert(appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); - // based on http://wiki.unity3d.com/index.php?title=Animating_Tiled_texture + // get single sprite size + float2 size = float2(1.0f / _ColumnsX, 1.0f / _RowsY); + uint totalFrames = _ColumnsX * _RowsY; - // Calculate index - float index = floor(_Time.y*_AnimationSpeed); + // use timer to increment index + uint index = _Time.y*_AnimationSpeed; - // repeat when exhausting all frames - index = index % (_ColumnsX * _RowsY); + // wrap x and y indexes + uint indexX = index % _ColumnsX; + uint indexY = floor((index % totalFrames) / _ColumnsX); - // Size of tile - float2 size = float2(1.0f / _ColumnsX, 1.0f / _RowsY); + // get offsets to our sprite index + float2 offset = float2(size.x*indexX,-size.y*indexY); - // split into horizontal and vertical index - float uIndex = floor(index % _ColumnsX); - float vIndex = floor(index / _RowsY); + // get single sprite UV + float2 newUV = v.uv*size; - // build offset - // v coordinate is the bottom of the image in opengl so we need to invert. - float2 offset = float2(uIndex * size.x, 1.0f - size.y - vIndex * size.y); + // flip Y (to start 0 from top) + newUV.y = newUV.y + size.y*(_RowsY - 1); - o.uv = v.uv*size + offset; + o.uv = newUV + offset; return o; } - - fixed4 frag (v2f i) : SV_Target + + fixed4 frag(v2f i) : SV_Target { fixed4 col = tex2D(_MainTex, i.uv); @@ -87,7 +88,7 @@ Shader "UnityLibrary/Sprites/FlipBook (AlphaTest)" return col; } - ENDCG + ENDCG } } } From 9cecf7ef734f50c9999c6493b3adcdefcbec7724 Mon Sep 17 00:00:00 2001 From: mika Date: Fri, 21 Dec 2018 11:29:37 +0200 Subject: [PATCH 119/231] Create ResetTransform.cs --- .../Editor/GameObject/ResetTransform.cs | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 Assets/Scripts/Editor/GameObject/ResetTransform.cs diff --git a/Assets/Scripts/Editor/GameObject/ResetTransform.cs b/Assets/Scripts/Editor/GameObject/ResetTransform.cs new file mode 100644 index 0000000..8726d41 --- /dev/null +++ b/Assets/Scripts/Editor/GameObject/ResetTransform.cs @@ -0,0 +1,25 @@ +using UnityEngine; +using UnityEditor; + +// reset transform position, rotation and scale + +namespace UnityLibrary +{ + public class ResetTransform : ScriptableObject + { + [MenuItem("GameObject/Reset Transform #r")] + static public void MoveSceneViewCamera() + { + // TODO add multiple object support + var go = Selection.activeGameObject; + if (go != null) + { + // TODO: add undo + go.transform.position = Vector3.zero; + go.transform.rotation = Quaternion.identity; + go.transform.localScale = Vector3.one; + } + } + + } // class +} // namespace From a653b061d6576255c8992f82d74a19ae48f399cd Mon Sep 17 00:00:00 2001 From: Sacristan Date: Thu, 27 Dec 2018 18:20:17 +0200 Subject: [PATCH 120/231] add TerrainTreeReplacer --- Assets/Scripts/Tools/TerrainTreeReplacer.cs | 101 ++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 Assets/Scripts/Tools/TerrainTreeReplacer.cs diff --git a/Assets/Scripts/Tools/TerrainTreeReplacer.cs b/Assets/Scripts/Tools/TerrainTreeReplacer.cs new file mode 100644 index 0000000..dc0b3a2 --- /dev/null +++ b/Assets/Scripts/Tools/TerrainTreeReplacer.cs @@ -0,0 +1,101 @@ +using UnityEngine; +using UnityEditor; +using System.Collections; +using System.Collections.Generic; + +public class TerrainTreeReplacer : EditorWindow +{ + private const string RootObjectName = "TREES_CONVERTED"; + + [MenuItem("Window/Tools/Terrain Tree Replacer")] + public static void ShowWindow() + { + EditorWindow.GetWindow(typeof(TerrainTreeReplacer)); + } + + private Terrain terrain; + + private bool disableDrawTreesAndFoliage = false; + private int treeDivisions = 0; + + private bool DivideTreesIntoGroups { get { return treeDivisions > 0; } } + + void OnGUI() + { + GUILayout.Label("Replace Terrain Trees with Objects", EditorStyles.boldLabel); + + terrain = EditorGUILayout.ObjectField("Terrain:", terrain, typeof(Terrain), true) as Terrain; + disableDrawTreesAndFoliage = EditorGUILayout.ToggleLeft("Disable Drawing Trees and Foliage", disableDrawTreesAndFoliage); + + GUILayout.Label("Tree Division groups: " + treeDivisions); + treeDivisions = (int)GUILayout.HorizontalSlider(treeDivisions, 0, 10); + + if (GUILayout.Button("Replace Terrain trees to Objects!")) Replace(); + if (GUILayout.Button("Clear generated trees!")) Clear(); + } + + public void Replace() + { + if (terrain == null) + { + Debug.LogError("Please Assign Terrain"); + return; + } + + Clear(); + + GameObject treeParent = new GameObject(RootObjectName); + + List> treegroups = new List>(); + + if (DivideTreesIntoGroups) + { + for (int i = 0; i < treeDivisions; i++) + { + treegroups.Add(new List()); + for (int j = 0; j < treeDivisions; j++) + { + GameObject treeGroup = new GameObject("TreeGroup_" + i + "_" + j); + treeGroup.transform.parent = treeParent.transform; + treegroups[i].Add(treeGroup.transform); + } + } + } + + TerrainData terrainData = terrain.terrainData; + + float xDiv = terrainData.size.x / (float)treeDivisions; + float zDiv = terrainData.size.z / (float)treeDivisions; + + foreach (TreeInstance tree in terrainData.treeInstances) + { + GameObject treePrefab = terrainData.treePrototypes[tree.prototypeIndex].prefab; + + Vector3 position = Vector3.Scale(tree.position, terrainData.size); + int xGroup = (int)(position.x / xDiv); + int zGroup = (int)(position.z / zDiv); + + position += terrain.transform.position; + + Vector2 lookRotationVector = new Vector2(Mathf.Cos(tree.rotation - Mathf.PI), Mathf.Sin(tree.rotation - Mathf.PI)); + Quaternion rotation = Quaternion.LookRotation(new Vector3(lookRotationVector.x, 0, lookRotationVector.y), Vector3.up); + + Vector3 scale = new Vector3(tree.widthScale, tree.heightScale, tree.widthScale); + + GameObject spawnedTree = Instantiate(treePrefab, position, rotation) as GameObject; + spawnedTree.name = treePrefab.name; + + spawnedTree.transform.localScale = scale; + + if (DivideTreesIntoGroups) spawnedTree.transform.SetParent(treegroups[xGroup][zGroup]); + else spawnedTree.transform.SetParent(treeParent.transform); + } + + if (disableDrawTreesAndFoliage) terrain.drawTreesAndFoliage = false; + } + + public void Clear() + { + DestroyImmediate(GameObject.Find(RootObjectName)); + } +} \ No newline at end of file From 6239e1ad54f1069c7e0462db1c7587c7b4985a00 Mon Sep 17 00:00:00 2001 From: Sacristan Date: Thu, 27 Dec 2018 18:21:37 +0200 Subject: [PATCH 121/231] cleaned up .vscode cache and add to gitignore --- .gitignore | 1 + .vscode/settings.json | 56 ------------------------------------------- 2 files changed, 1 insertion(+), 56 deletions(-) delete mode 100644 .vscode/settings.json diff --git a/.gitignore b/.gitignore index bc36673..b0055c5 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ # Visual Studio 2015 cache directory /.vs/ +/.vscode/ # Autogenerated VS/MD/Consulo solution and project files ExportedObj/ diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 4edd970..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "files.exclude": - { - "**/.DS_Store":true, - "**/.git":true, - "**/.gitignore":true, - "**/.gitmodules":true, - "**/*.booproj":true, - "**/*.pidb":true, - "**/*.suo":true, - "**/*.user":true, - "**/*.userprefs":true, - "**/*.unityproj":true, - "**/*.dll":true, - "**/*.exe":true, - "**/*.pdf":true, - "**/*.mid":true, - "**/*.midi":true, - "**/*.wav":true, - "**/*.gif":true, - "**/*.ico":true, - "**/*.jpg":true, - "**/*.jpeg":true, - "**/*.png":true, - "**/*.psd":true, - "**/*.tga":true, - "**/*.tif":true, - "**/*.tiff":true, - "**/*.3ds":true, - "**/*.3DS":true, - "**/*.fbx":true, - "**/*.FBX":true, - "**/*.lxo":true, - "**/*.LXO":true, - "**/*.ma":true, - "**/*.MA":true, - "**/*.obj":true, - "**/*.OBJ":true, - "**/*.asset":true, - "**/*.cubemap":true, - "**/*.flare":true, - "**/*.mat":true, - "**/*.meta":true, - "**/*.prefab":true, - "**/*.unity":true, - "build/":true, - "Build/":true, - "Library/":true, - "library/":true, - "obj/":true, - "Obj/":true, - "ProjectSettings/":true, - "temp/":true, - "Temp/":true - } -} \ No newline at end of file From 923d458f3413e5c82df32f32078997087eaa8fed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=A2irts=20=C4=B6esteris?= Date: Thu, 27 Dec 2018 18:45:35 +0200 Subject: [PATCH 122/231] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7f6ecea..6c51035 100644 --- a/README.md +++ b/README.md @@ -85,7 +85,7 @@ Feel free to [:postbox: Post your ideas/comments/improvements/recommendations](h - [Lootheo (Manuel Otheo)](https://github.com/Lootheo) (Member) - [igorrafael (Igor Rafael de Sousa)](https://github.com/igorrafael) (Member) - [nrlnd](https://github.com/nrlnd) (Member) -- [Sacristan (Ģirts Ķesteris)](https://github.com/nrlnd) (Member) +- [Sacristan (Ģirts Ķesteris)](https://github.com/Sacristan) (Member) - [:sparkles: Join the team](#join-the-community) [:mag: Check out Unity Community People](https://github.com/orgs/UnityCommunity/people) From 57b272041a5308bfc62c4c355a3273f69805db5d Mon Sep 17 00:00:00 2001 From: Sacristan Date: Wed, 2 Jan 2019 11:23:25 +0200 Subject: [PATCH 123/231] add monobehaviour extensions --- .../Example/MonoBehaviorExtensionsExample.cs | 21 +++++++++++ .../MonoBehaviourExtensions.cs | 36 +++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 Assets/Scripts/Extensions/MonoBehaviourExtensions/Example/MonoBehaviorExtensionsExample.cs create mode 100644 Assets/Scripts/Extensions/MonoBehaviourExtensions/MonoBehaviourExtensions.cs diff --git a/Assets/Scripts/Extensions/MonoBehaviourExtensions/Example/MonoBehaviorExtensionsExample.cs b/Assets/Scripts/Extensions/MonoBehaviourExtensions/Example/MonoBehaviorExtensionsExample.cs new file mode 100644 index 0000000..20d47a7 --- /dev/null +++ b/Assets/Scripts/Extensions/MonoBehaviourExtensions/Example/MonoBehaviorExtensionsExample.cs @@ -0,0 +1,21 @@ +using UnityEngine; +using Sacristan.Utils.Extensions; + +public class MonoBehaviorExtensionsTest : MonoBehaviour +{ + private void Start() + { + this.InvokeRepeatingSafe(Tick, 1f, 1f); + this.InvokeSafe(Tock, 2f); + } + + private void Tick() + { + Debug.Log("Tick"); + } + + private void Tock() + { + Debug.Log("Tock"); + } +} diff --git a/Assets/Scripts/Extensions/MonoBehaviourExtensions/MonoBehaviourExtensions.cs b/Assets/Scripts/Extensions/MonoBehaviourExtensions/MonoBehaviourExtensions.cs new file mode 100644 index 0000000..652e071 --- /dev/null +++ b/Assets/Scripts/Extensions/MonoBehaviourExtensions/MonoBehaviourExtensions.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections; +using UnityEngine; + +namespace Sacristan.Utils.Extensions +{ + public static class MonoBehaviourExtensions + { + public static void InvokeSafe(this MonoBehaviour behavior, System.Action method, float delayInSeconds) + { + behavior.StartCoroutine(InvokeSafeRoutine(method, delayInSeconds)); + } + + public static void InvokeRepeatingSafe(this MonoBehaviour behavior, System.Action method, float delayInSeconds, float repeatRateInSeconds) + { + behavior.StartCoroutine(InvokeSafeRepeatingRoutine(method, delayInSeconds, repeatRateInSeconds)); + } + + private static IEnumerator InvokeSafeRepeatingRoutine(System.Action method, float delayInSeconds, float repeatRateInSeconds) + { + yield return new WaitForSeconds(delayInSeconds); + + while (true) + { + if (method != null) method.Invoke(); + yield return new WaitForSeconds(repeatRateInSeconds); + } + } + + private static IEnumerator InvokeSafeRoutine(System.Action method, float delayInSeconds) + { + yield return new WaitForSeconds(delayInSeconds); + if (method != null) method.Invoke(); + } + } +} From 5a3bec2ce2a75eeca5e2db2f5965c96f00fe4d64 Mon Sep 17 00:00:00 2001 From: mika Date: Sat, 2 Mar 2019 11:12:42 +0200 Subject: [PATCH 124/231] Create GradientTextureMaker.cs --- .../Scripts/Texture/GradientTextureMaker.cs | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 Assets/Scripts/Texture/GradientTextureMaker.cs diff --git a/Assets/Scripts/Texture/GradientTextureMaker.cs b/Assets/Scripts/Texture/GradientTextureMaker.cs new file mode 100644 index 0000000..2db2887 --- /dev/null +++ b/Assets/Scripts/Texture/GradientTextureMaker.cs @@ -0,0 +1,61 @@ +// returns gradient Texture2D (size=256x1) + +using UnityEngine; + +namespace UnityLibrary +{ + public static class GradientTextureMaker + { + const int width = 256; + const int height = 1; + + public static Texture2D Create(Color[] colors, TextureWrapMode textureWrapMode = TextureWrapMode.Clamp, FilterMode filterMode = FilterMode.Point, bool isLinear = false, bool hasMipMap = false) + { + if (colors == null || colors.Length == 0) + { + Debug.LogError("No colors assigned"); + return null; + } + + int length = colors.Length; + if (colors.Length > 8) + { + Debug.LogWarning("Too many colors! maximum is 8, assigned: " + colors.Length); + length = 8; + } + + // build gradient from colors + var colorKeys = new GradientColorKey[length]; + var alphaKeys = new GradientAlphaKey[length]; + + float steps = length - 1f; + for (int i = 0; i < length; i++) + { + float step = i / steps; + colorKeys[i].color = colors[i]; + colorKeys[i].time = step; + alphaKeys[i].alpha = colors[i].a; + alphaKeys[i].time = step; + } + + // create gradient + Gradient gradient = new Gradient(); + gradient.SetKeys(colorKeys, alphaKeys); + + // create texture + Texture2D outputTex = new Texture2D(width, height, TextureFormat.ARGB32, false, isLinear); + outputTex.wrapMode = textureWrapMode; + outputTex.filterMode = filterMode; + + // draw texture + for (int i = 0; i < width; i++) + { + outputTex.SetPixel(i, 0, gradient.Evaluate((float)i / (float)width)); + } + outputTex.Apply(false); + + return outputTex; + } // BuildGradientTexture + + } // class +} // namespcae From 41fa0d32c71299ca67bbf15423527aa67ef882c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Garc=C3=ADa=20Le=C3=B3n?= Date: Tue, 7 May 2019 13:35:30 +0200 Subject: [PATCH 125/231] Updated main communication channel to Discord. Added myself to members in credits section. --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 6c51035..e1add6a 100644 --- a/README.md +++ b/README.md @@ -69,9 +69,9 @@ Send your GitHub id to one of the below ways: Our communities: +- [See](https://discordapp.com/channels/337579253866692608/337579253866692608) | [Join](https://discord.gg/cXT97hU) our Discord Channel (Main) - [See](https://unitylibrary.slack.com/) | [Join](https://join.slack.com/t/unitylibrary/shared_invite/MjE1MDA2NzExNDEwLTE1MDA0OTE5NzktOGJmYTI0ZDlkNA) our Slack Channel - [See](https://gitter.im/UnityCommunity/Lobby) | [Join](https://gitter.im/UnityCommunity/Lobby?utm_source=share-link&utm_medium=link&utm_campaign=share-link) our Gitter Channel -- [See](https://discordapp.com/channels/337579253866692608/337579253866692608) | [Join](https://discord.gg/cXT97hU) our Discord Channel - [See](https://trello.com/b/1sOcvQzd) | [Join](https://trello.com/invite/unitycommunity/239a9f3cdaf3c54cf7efc2540c304279) our Trello Development Board ## Improvements/Ideas/Feedback @@ -86,6 +86,7 @@ Feel free to [:postbox: Post your ideas/comments/improvements/recommendations](h - [igorrafael (Igor Rafael de Sousa)](https://github.com/igorrafael) (Member) - [nrlnd](https://github.com/nrlnd) (Member) - [Sacristan (Ģirts Ķesteris)](https://github.com/Sacristan) (Member) +- [Agarcialeon (Álvaro García León)](https://github.com/agarcialeon) (Member) - [:sparkles: Join the team](#join-the-community) [:mag: Check out Unity Community People](https://github.com/orgs/UnityCommunity/people) From ddb602fe308ec4af930c1208abc6491018fa052f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Garc=C3=ADa=20Le=C3=B3n?= Date: Wed, 8 May 2019 13:16:54 +0200 Subject: [PATCH 126/231] Update README.md Moved Discord chat badget next to link to access it. Removed initial separator. --- README.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/README.md b/README.md index e1add6a..d5b8e6a 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,5 @@ # Unity Library -
- -
-
:tada: Welcome to Unity Library :tada: Useful scripts, snippets and shaders here it is gathered for free. @@ -69,7 +65,7 @@ Send your GitHub id to one of the below ways: Our communities: -- [See](https://discordapp.com/channels/337579253866692608/337579253866692608) | [Join](https://discord.gg/cXT97hU) our Discord Channel (Main) +- [See](https://discordapp.com/channels/337579253866692608/337579253866692608) | [Join](https://discord.gg/cXT97hU) our Discord Channel (Main) - [See](https://unitylibrary.slack.com/) | [Join](https://join.slack.com/t/unitylibrary/shared_invite/MjE1MDA2NzExNDEwLTE1MDA0OTE5NzktOGJmYTI0ZDlkNA) our Slack Channel - [See](https://gitter.im/UnityCommunity/Lobby) | [Join](https://gitter.im/UnityCommunity/Lobby?utm_source=share-link&utm_medium=link&utm_campaign=share-link) our Gitter Channel - [See](https://trello.com/b/1sOcvQzd) | [Join](https://trello.com/invite/unitycommunity/239a9f3cdaf3c54cf7efc2540c304279) our Trello Development Board From 49bf5d2a430e20d352bb4673d5d026c19deefe70 Mon Sep 17 00:00:00 2001 From: mika Date: Wed, 29 May 2019 00:52:55 +0300 Subject: [PATCH 127/231] Create RendererBoundsGizmo.cs --- .../Editor/Gizmos/RendererBoundsGizmo.cs | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 Assets/Scripts/Editor/Gizmos/RendererBoundsGizmo.cs diff --git a/Assets/Scripts/Editor/Gizmos/RendererBoundsGizmo.cs b/Assets/Scripts/Editor/Gizmos/RendererBoundsGizmo.cs new file mode 100644 index 0000000..1f11866 --- /dev/null +++ b/Assets/Scripts/Editor/Gizmos/RendererBoundsGizmo.cs @@ -0,0 +1,24 @@ +// attach this to mesh, draws renderer bounds when gameobject is selected +// original source: http://answers.unity.com/answers/137475/view.html + +using UnityEngine; + +namespace UnityLibrary +{ + public class RendererBoundsGizmo : MonoBehaviour + { + void OnDrawGizmos() + { + OnDrawGizmosSelected(); + } + + void OnDrawGizmosSelected() + { + Gizmos.color = Color.yellow; + //center sphere + //Gizmos.DrawSphere(transform.position, 0.1f); + var r = transform.GetComponent(); + if (r != null) Gizmos.DrawWireCube(transform.position, r.bounds.size); + } + } +} From be2ea7de3fc2d28a5b1dbfdbba350a8068b38799 Mon Sep 17 00:00:00 2001 From: mika Date: Wed, 29 May 2019 00:57:58 +0300 Subject: [PATCH 128/231] Update RendererBoundsGizmo.cs --- Assets/Scripts/Editor/Gizmos/RendererBoundsGizmo.cs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/Assets/Scripts/Editor/Gizmos/RendererBoundsGizmo.cs b/Assets/Scripts/Editor/Gizmos/RendererBoundsGizmo.cs index 1f11866..084224f 100644 --- a/Assets/Scripts/Editor/Gizmos/RendererBoundsGizmo.cs +++ b/Assets/Scripts/Editor/Gizmos/RendererBoundsGizmo.cs @@ -7,11 +7,6 @@ namespace UnityLibrary { public class RendererBoundsGizmo : MonoBehaviour { - void OnDrawGizmos() - { - OnDrawGizmosSelected(); - } - void OnDrawGizmosSelected() { Gizmos.color = Color.yellow; From 1543589205584b248b0c2051a4f7337d8527b4b3 Mon Sep 17 00:00:00 2001 From: mika Date: Fri, 7 Jun 2019 11:55:23 +0300 Subject: [PATCH 129/231] Create GetVideoAspectRatioEditor.cs --- .../ContextMenu/GetVideoAspectRatioEditor.cs | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 Assets/Scripts/Editor/ContextMenu/GetVideoAspectRatioEditor.cs diff --git a/Assets/Scripts/Editor/ContextMenu/GetVideoAspectRatioEditor.cs b/Assets/Scripts/Editor/ContextMenu/GetVideoAspectRatioEditor.cs new file mode 100644 index 0000000..4bee101 --- /dev/null +++ b/Assets/Scripts/Editor/ContextMenu/GetVideoAspectRatioEditor.cs @@ -0,0 +1,31 @@ +// Custom Contect menu for VideoPlayer component +// used for scaling quad mesh transform localscale.y to match videoplayer aspect ratio + +using UnityEngine; +using UnityEditor; +using UnityEngine.Video; + +namespace UnityLibrary +{ + public class GetVideoAspectRatioEditor : MonoBehaviour + { + [MenuItem("CONTEXT/VideoPlayer/Get Aspect Ratio for Mesh")] + static void DoubleMass(MenuCommand command) + { + // get aspect ratio + VideoPlayer v = (VideoPlayer)command.context; + if (v.clip == null) + { + Debug.LogError("No videoclip assigned.."); + return; + } + float aspectRatioY = v.height / (float)v.width; + + // scale mesh + Vector3 scale = v.transform.localScale; + // fix only height + scale.y *= aspectRatioY; + v.transform.localScale = scale; + } + } +} From adda230bff5608b59e4807b195f24d241e7cdb6e Mon Sep 17 00:00:00 2001 From: mika Date: Fri, 7 Jun 2019 12:59:36 +0300 Subject: [PATCH 130/231] Create CreateOutlineForPanelEditor.cs --- .../CreateOutlineForPanelEditor.cs | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 Assets/Scripts/Editor/ContextMenu/CreateOutlineForPanelEditor.cs diff --git a/Assets/Scripts/Editor/ContextMenu/CreateOutlineForPanelEditor.cs b/Assets/Scripts/Editor/ContextMenu/CreateOutlineForPanelEditor.cs new file mode 100644 index 0000000..539fbfa --- /dev/null +++ b/Assets/Scripts/Editor/ContextMenu/CreateOutlineForPanelEditor.cs @@ -0,0 +1,59 @@ +// Custom Contect menu for UI Image component (in WorldSpace UI canvas) +// used for creating outline for panel (image) using LineRenderer + +using UnityEngine; +using UnityEditor; +using UnityEngine.UI; + +namespace UnityLibrary +{ + public class CreateOutlineForPanelEditor : MonoBehaviour + { + [MenuItem("CONTEXT/Image/Create Outline For Panel")] + static void DoubleMass(MenuCommand command) + { + // get reference + Image comp = (Image)command.context; + if (comp == null) + { + Debug.LogError("No Image component found.."); + return; + } + + // TODO check that its worlspace canvas + + // get worldspace borders, FIXME get root canvas, instead of parent + var canvasRect = comp.transform.parent.GetComponent().GetComponent(); + Vector3[] corners = new Vector3[4]; + canvasRect.GetWorldCorners(corners); + + var line = comp.transform.GetComponent(); + if (line == null) + { + Debug.LogError("Missing LineRenderer component"); + return; + } + + if (line.useWorldSpace == true) + { + Debug.LogWarning("LineRenderer has worlspace enabled, disabling it"); + line.useWorldSpace = false; + } + + // set line points + line.positionCount = corners.Length + 1; + line.SetPositions(corners); + // connect last and first + line.SetPosition(line.positionCount - 1, corners[0]); + + // convert worldspace to localspace + for (int i = 0, len = line.positionCount; i < len; i++) + { + var worldPos = line.GetPosition(i); + var localPos = canvasRect.transform.InverseTransformPoint(worldPos); + line.SetPosition(i, localPos); + } + + } + } +} From b1d607c5526a26567a7a84a3dd476af7f39cb0f5 Mon Sep 17 00:00:00 2001 From: mika Date: Sat, 8 Jun 2019 18:09:18 +0300 Subject: [PATCH 131/231] Update GetVideoAspectRatioEditor.cs add undo to GetVideoAspectRatioEditor.cs --- Assets/Scripts/Editor/ContextMenu/GetVideoAspectRatioEditor.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Assets/Scripts/Editor/ContextMenu/GetVideoAspectRatioEditor.cs b/Assets/Scripts/Editor/ContextMenu/GetVideoAspectRatioEditor.cs index 4bee101..23c6600 100644 --- a/Assets/Scripts/Editor/ContextMenu/GetVideoAspectRatioEditor.cs +++ b/Assets/Scripts/Editor/ContextMenu/GetVideoAspectRatioEditor.cs @@ -21,6 +21,9 @@ static void DoubleMass(MenuCommand command) } float aspectRatioY = v.height / (float)v.width; + // record undo + Undo.RecordObject(v.transform, "Set scale"); + // scale mesh Vector3 scale = v.transform.localScale; // fix only height From ce83de8144ced357d8f36f0c21667a30fb32a14f Mon Sep 17 00:00:00 2001 From: lmckamey Date: Fri, 9 Aug 2019 09:00:45 -0600 Subject: [PATCH 132/231] Added files and working on the sample scene Added UI animation Scripts. Also added a sample scene that is inteded to show off the animations --- Assets/Scenes/UI_Animation_Sample.unity | 296 ++++++++++++++++++ Assets/Scripts/UI/UI Animation/GrowEffect.cs | 69 ++++ .../UI/UI Animation/HelicopterGrowEffect.cs | 50 +++ Assets/Scripts/UI/UI Animation/ImageFade.cs | 150 +++++++++ .../Scripts/UI/UI Animation/LerpFromOffset.cs | 104 ++++++ 5 files changed, 669 insertions(+) create mode 100644 Assets/Scenes/UI_Animation_Sample.unity create mode 100644 Assets/Scripts/UI/UI Animation/GrowEffect.cs create mode 100644 Assets/Scripts/UI/UI Animation/HelicopterGrowEffect.cs create mode 100644 Assets/Scripts/UI/UI Animation/ImageFade.cs create mode 100644 Assets/Scripts/UI/UI Animation/LerpFromOffset.cs diff --git a/Assets/Scenes/UI_Animation_Sample.unity b/Assets/Scenes/UI_Animation_Sample.unity new file mode 100644 index 0000000..0804034 --- /dev/null +++ b/Assets/Scenes/UI_Animation_Sample.unity @@ -0,0 +1,296 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 11 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 1 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 1 + m_PVRDenoiserTypeIndirect: 1 + m_PVRDenoiserTypeAO: 1 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightingDataAsset: {fileID: 0} + m_UseShadowmask: 1 +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &922358087 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 922358089} + - component: {fileID: 922358088} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &922358088 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 922358087} + m_Enabled: 1 + serializedVersion: 9 + m_Type: 1 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &922358089 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 922358087} + m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1 &1953608471 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1953608474} + - component: {fileID: 1953608473} + - component: {fileID: 1953608472} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &1953608472 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1953608471} + m_Enabled: 1 +--- !u!20 &1953608473 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1953608471} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &1953608474 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1953608471} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} diff --git a/Assets/Scripts/UI/UI Animation/GrowEffect.cs b/Assets/Scripts/UI/UI Animation/GrowEffect.cs new file mode 100644 index 0000000..2eaf8ef --- /dev/null +++ b/Assets/Scripts/UI/UI Animation/GrowEffect.cs @@ -0,0 +1,69 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +/// +/// Script that when attached to an object will cause it to grow until it reaches the desired Scale +/// +public class GrowEffect : MonoBehaviour +{ + private enum Effect + { + BOUNCE_IN_OUT, + ELASTIC_IN_OUT, + LINEAR, + CIRCULAR_IN_OUT + } + + [Header("Configuration")] + [Tooltip("The desired scale to grow to")] + [SerializeField] float m_desiredScale = 1.0f; + [Tooltip("How much time it will take to reach the desired scale")] + [SerializeField] float m_timeToReachDesiredScale = 1.0f; + [Tooltip("How much time it takes before the grow effect starts")] + [SerializeField] float m_timeToDelayStart = 0.0f; + [Tooltip("Effect on the grow animation")] + [SerializeField] Effect m_interpolationEffect = Effect.ELASTIC_IN_OUT; + + //private member variables + private float m_currentTime = 0.0f; + + private void Awake() + { + //set the local scale to zero so it can grow + transform.localScale = Vector3.zero; + } + + void Update() + { + if (m_timeToDelayStart <= 0.0) + { + //increment current time by DT + m_currentTime += Time.deltaTime; + + if (!(m_currentTime > m_timeToReachDesiredScale)) + { + //Switch as to which effect will happen + switch (m_interpolationEffect) + { + case Effect.BOUNCE_IN_OUT: + gameObject.transform.localScale = (Vector3.one * Mathf.LerpUnclamped(0, m_desiredScale, Interpolation.BounceInOut(m_currentTime / m_timeToReachDesiredScale))); + break; + case Effect.ELASTIC_IN_OUT: + gameObject.transform.localScale = (Vector3.one * Mathf.LerpUnclamped(0, m_desiredScale, Interpolation.ElasticInOut(m_currentTime / m_timeToReachDesiredScale))); + break; + case Effect.LINEAR: + gameObject.transform.localScale = (Vector3.one * Mathf.LerpUnclamped(0, m_desiredScale, Interpolation.Linear(m_currentTime / m_timeToReachDesiredScale))); + break; + case Effect.CIRCULAR_IN_OUT: + gameObject.transform.localScale = (Vector3.one * Mathf.LerpUnclamped(0, m_desiredScale, Interpolation.CircularInOut(m_currentTime / m_timeToReachDesiredScale))); + break; + } + } + } + else + { + //reduce the delay start by DT + m_timeToDelayStart -= Time.deltaTime; + } + } +} diff --git a/Assets/Scripts/UI/UI Animation/HelicopterGrowEffect.cs b/Assets/Scripts/UI/UI Animation/HelicopterGrowEffect.cs new file mode 100644 index 0000000..cbbe432 --- /dev/null +++ b/Assets/Scripts/UI/UI Animation/HelicopterGrowEffect.cs @@ -0,0 +1,50 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class HelicopterGrowEffect : MonoBehaviour +{ + [Header("Configuration")] + [Tooltip("The desired Scale to reach")] + [SerializeField] float m_desiredScale = 1.0f; + [Tooltip("How much time it will take to reach the desired scale")] + [SerializeField] float m_timeToReachDesiredScale = 1.0f; + [Tooltip("How fast the helicopter effect will spin")] + [SerializeField] float m_rotationSpeed = 2.0f; + [Tooltip("the angle of rotation per frame")] + [SerializeField] float m_rotationAngle = 10.0f; + + //private member variables + private float m_currentTime = 0.0f; + private Quaternion startingRotation = Quaternion.identity; + + private void Awake() + { + //set the base transform to 0 so it can grow + transform.localScale = Vector3.zero; + //set the staring rotation variable to the current rotation + startingRotation = transform.rotation; + } + + void Update() + { + //increment current time by delta time + m_currentTime += Time.deltaTime; + if (m_currentTime <= m_timeToReachDesiredScale) + { + //rotate the object by the rotation angle and rotation speed + gameObject.transform.Rotate(Vector3.forward, (m_rotationAngle * (m_rotationSpeed * Time.deltaTime))); + //lerp the scale to the desired scale + gameObject.transform.localScale = (Vector3.one * Mathf.LerpUnclamped(0, m_desiredScale, Interpolation.ElasticInOut(m_currentTime/m_timeToReachDesiredScale))); + //leave the function + return; + } + else + { + //when the lerping is done set the rotation to the starting rotation + gameObject.transform.rotation = startingRotation; + //set the scale to the desired scale + gameObject.transform.localScale = Vector3.one * m_desiredScale; + } + } +} diff --git a/Assets/Scripts/UI/UI Animation/ImageFade.cs b/Assets/Scripts/UI/UI Animation/ImageFade.cs new file mode 100644 index 0000000..edca0c0 --- /dev/null +++ b/Assets/Scripts/UI/UI Animation/ImageFade.cs @@ -0,0 +1,150 @@ +using System.Collections; +using System.Collections.Generic; +using TMPro; +using UnityEngine; +using UnityEngine.UI; +/// +/// Component that when attached to an Image will fade in or out based on isFadingIn +/// +[RequireComponent(typeof(Image))] +public class ImageFade : MonoBehaviour +{ + [Header("Configuration")] + [Tooltip("The Time it takes for the object to fade")] + [SerializeField] float m_timeToFade = 1.5f; + [Tooltip("The Time it takes before the object begins its fading")] + [SerializeField] float m_delayTimeToStart = 1.5f; + [Tooltip("Boolean to determing if the image is fading in or out")] + [SerializeField] bool m_isFadingIn = true; + [Tooltip("Boolean to determing if the image is a button or out")] + [SerializeField] bool m_doesHaveChildText = false; + + //Sibling Components + private Image m_image; + private TextMeshProUGUI m_text; + + //Member variables + private Color m_startColor; + private Color m_buttonTextStartColor; + private Color m_desiredEndColor; + private float m_timeElapsed = 0.0f; + + private void Awake() + { + GetSiblingComponents(); + //set the starting color to the color of the object + SetStartingColor(); + //Start the Fade Coroutine + StartCoroutine(Fade()); + } + + //Function that sets the image color value determined on if you want to fade in or out + private void SetStartingColor() + { + //start color is set to the images current color + m_startColor = m_image.color; + //create new varibles to be messed with later + Color modifiedColor = m_startColor; + Color modifiedTextColor = default; + if (m_doesHaveChildText) + { + //if this had childed text component buttonTextStartcolor is set to the text's current color + m_buttonTextStartColor = m_text.color; + modifiedTextColor = m_buttonTextStartColor; + } + //sets the starting colors alpha values + if (m_isFadingIn) + { + //if it is fading in set alpha values to 0 + modifiedColor.a = 0.0f; + modifiedTextColor.a = 0.0f; + } + //Set the current colors to be the modified colors for fading + m_image.color = modifiedColor; + if (m_doesHaveChildText) + { + m_text.color = modifiedTextColor; + } + } + + /// + /// Gets the Required Sibling components + /// + private void GetSiblingComponents() + { + m_image = GetComponent(); + if (m_doesHaveChildText) + { + m_text = GetComponentInChildren(); + } + } + + /// + /// Coroutine that fades the Image by lerping the alpha from either 1-0 or 0-1 + /// + IEnumerator Fade() + { + //Wait for the delay + yield return new WaitForSeconds(m_delayTimeToStart); + //create new color + Color newColor = m_startColor; + Color newTextColor = default; + if (m_doesHaveChildText) + { + newTextColor = m_text.color; + } + while (m_timeElapsed < m_timeToFade) + { + float time = m_timeElapsed / m_timeToFade; + if (m_isFadingIn) + { + //set new colors alpha to the lerp value of time + newColor.a = Mathf.Lerp(0, m_startColor.a, time); + if (m_doesHaveChildText) + { + newTextColor.a = Mathf.Lerp(0, m_buttonTextStartColor.a, time); + } + } + else + { + //set new colors alpha to the lerp value of time + newColor.a = Mathf.Lerp(m_startColor.a, 0, time); + if (m_doesHaveChildText) + { + newTextColor.a = Mathf.Lerp(m_buttonTextStartColor.a, 0, time); + } + } + //set image color to the new color + if (m_doesHaveChildText) + { + m_text.color = newTextColor; + } + m_image.color = newColor; + //add deltaTime to time elapsed + m_timeElapsed += Time.deltaTime; + yield return null; + } + //when the loop finishes set the colors to be what they are supposed to be + if (m_isFadingIn) + { + m_image.color = m_startColor; + if (m_doesHaveChildText) + { + m_text.color = m_buttonTextStartColor; + } + } + else + { + //if not is fading in set the alpha values to 0 + Color desiredColor = m_startColor; + desiredColor.a = 0.0f; + m_image.color = desiredColor; + if(m_doesHaveChildText) + { + desiredColor = m_buttonTextStartColor; + desiredColor.a = 0.0f; + m_text.color = desiredColor; + } + } + } +} diff --git a/Assets/Scripts/UI/UI Animation/LerpFromOffset.cs b/Assets/Scripts/UI/UI Animation/LerpFromOffset.cs new file mode 100644 index 0000000..33172b6 --- /dev/null +++ b/Assets/Scripts/UI/UI Animation/LerpFromOffset.cs @@ -0,0 +1,104 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class LerpFromOffset : MonoBehaviour +{ + /// + /// Effect Enum only to be used by this class, for chossing which interpolation effect to use + /// + private enum Effect + { + BOUNCE_OUT, + ELASTIC_OUT, + LINEAR, + CIRCULAR_OUT, + CIRCULAR_IN, + CIRCULAR_IN_OUT, + INVERSE_CIRCULAR_IN_OUT + } + + [Header("Configuration")] + [Tooltip("The The Effect you would like to happen")] + [SerializeField] Effect m_effect = default; + [Tooltip("The direction you want the object to lerp from")] + [SerializeField] Vector3 m_offsetDirection = default; + [Tooltip("The the distnace you want to multiply the direction by")] + [SerializeField] float m_offsetDistance = 1.0f; + [Tooltip("How much time it will take for the object to reach its original position")] + [SerializeField] float m_timeToReachPosition = 1.5f; + [Tooltip("How much time it will take to start moving")] + [SerializeField] float m_delayStart = 1.5f; + + + //Memeber variables + private Vector3 m_offset = Vector3.zero; + private Vector3 m_desiredPos = Vector3.zero; + private float m_currentTime = 0.0f; + + void Awake() + { + Setup(); + } + /// + /// Method that sets up all of the needed things and places the object at the calcuated offset + /// + void Setup() + { + //calculate offset position + m_offset = m_offsetDirection.normalized * m_offsetDistance; + //set the desired position to the current position + m_desiredPos = transform.position; + //move the object to the offset position to begin lerping + transform.position = m_desiredPos + m_offset; + } + + void Update() + { + if (m_delayStart <= 0.0f) + { + //add deltaTime to the current time + m_currentTime += Time.deltaTime; + if (m_currentTime < m_timeToReachPosition) + { + //based on which effect is selected this will lerp from the curretn position to the desired position + switch (m_effect) + { + //Lerps using the BouceOut Interpolation + case Effect.BOUNCE_OUT: + transform.position = Vector3.LerpUnclamped(m_desiredPos + m_offset, m_desiredPos, Interpolation.BounceOut(m_currentTime / m_timeToReachPosition)); + break; + //Lerps using the ElasticOut Interpolation + case Effect.ELASTIC_OUT: + transform.position = Vector3.LerpUnclamped(m_desiredPos + m_offset, m_desiredPos, Interpolation.ElasticOut(m_currentTime / m_timeToReachPosition)); + break; + //Lerps using the Linear Interpolation + case Effect.LINEAR: + transform.position = Vector3.LerpUnclamped(m_desiredPos + m_offset, m_desiredPos, Interpolation.Linear(m_currentTime / m_timeToReachPosition)); + break; + //Lerps using the CircularOut Interpolation + case Effect.CIRCULAR_OUT: + transform.position = Vector3.LerpUnclamped(m_desiredPos + m_offset, m_desiredPos, Interpolation.CircularOut(m_currentTime / m_timeToReachPosition)); + break; + //Lerps using the CircularInOut Interpolation + case Effect.CIRCULAR_IN_OUT: + transform.position = Vector3.LerpUnclamped(m_desiredPos + m_offset, m_desiredPos, Interpolation.CircularInOut(m_currentTime / m_timeToReachPosition)); + break; + //Lerps using the CircularIn Interpolation + case Effect.CIRCULAR_IN: + transform.position = Vector3.LerpUnclamped(m_desiredPos + m_offset, m_desiredPos, Interpolation.SineIn(m_currentTime / m_timeToReachPosition)); + break; + } + + return; + } + //set the current position to the desired position + transform.position = m_desiredPos; + } + else + { + //remove Deltatime from the m_delayStart + m_delayStart -= Time.deltaTime; + } + } +} From 32a7a854da6a6261657056d828340e776289f779 Mon Sep 17 00:00:00 2001 From: lmckamey Date: Fri, 9 Aug 2019 09:25:25 -0600 Subject: [PATCH 133/231] Revert "Added files and working on the sample scene" This reverts commit ce83de8144ced357d8f36f0c21667a30fb32a14f. --- Assets/Scenes/UI_Animation_Sample.unity | 296 ------------------ Assets/Scripts/UI/UI Animation/GrowEffect.cs | 69 ---- .../UI/UI Animation/HelicopterGrowEffect.cs | 50 --- Assets/Scripts/UI/UI Animation/ImageFade.cs | 150 --------- .../Scripts/UI/UI Animation/LerpFromOffset.cs | 104 ------ 5 files changed, 669 deletions(-) delete mode 100644 Assets/Scenes/UI_Animation_Sample.unity delete mode 100644 Assets/Scripts/UI/UI Animation/GrowEffect.cs delete mode 100644 Assets/Scripts/UI/UI Animation/HelicopterGrowEffect.cs delete mode 100644 Assets/Scripts/UI/UI Animation/ImageFade.cs delete mode 100644 Assets/Scripts/UI/UI Animation/LerpFromOffset.cs diff --git a/Assets/Scenes/UI_Animation_Sample.unity b/Assets/Scenes/UI_Animation_Sample.unity deleted file mode 100644 index 0804034..0000000 --- a/Assets/Scenes/UI_Animation_Sample.unity +++ /dev/null @@ -1,296 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!29 &1 -OcclusionCullingSettings: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_OcclusionBakeSettings: - smallestOccluder: 5 - smallestHole: 0.25 - backfaceThreshold: 100 - m_SceneGUID: 00000000000000000000000000000000 - m_OcclusionCullingData: {fileID: 0} ---- !u!104 &2 -RenderSettings: - m_ObjectHideFlags: 0 - serializedVersion: 9 - m_Fog: 0 - m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} - m_FogMode: 3 - m_FogDensity: 0.01 - m_LinearFogStart: 0 - m_LinearFogEnd: 300 - m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} - m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} - m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} - m_AmbientIntensity: 1 - m_AmbientMode: 0 - m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} - m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} - m_HaloStrength: 0.5 - m_FlareStrength: 1 - m_FlareFadeSpeed: 3 - m_HaloTexture: {fileID: 0} - m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} - m_DefaultReflectionMode: 0 - m_DefaultReflectionResolution: 128 - m_ReflectionBounces: 1 - m_ReflectionIntensity: 1 - m_CustomReflection: {fileID: 0} - m_Sun: {fileID: 0} - m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} - m_UseRadianceAmbientProbe: 0 ---- !u!157 &3 -LightmapSettings: - m_ObjectHideFlags: 0 - serializedVersion: 11 - m_GIWorkflowMode: 1 - m_GISettings: - serializedVersion: 2 - m_BounceScale: 1 - m_IndirectOutputScale: 1 - m_AlbedoBoost: 1 - m_EnvironmentLightingMode: 0 - m_EnableBakedLightmaps: 1 - m_EnableRealtimeLightmaps: 1 - m_LightmapEditorSettings: - serializedVersion: 12 - m_Resolution: 2 - m_BakeResolution: 40 - m_AtlasSize: 1024 - m_AO: 0 - m_AOMaxDistance: 1 - m_CompAOExponent: 1 - m_CompAOExponentDirect: 0 - m_ExtractAmbientOcclusion: 0 - m_Padding: 2 - m_LightmapParameters: {fileID: 0} - m_LightmapsBakeMode: 1 - m_TextureCompression: 1 - m_FinalGather: 0 - m_FinalGatherFiltering: 1 - m_FinalGatherRayCount: 256 - m_ReflectionCompression: 2 - m_MixedBakeMode: 2 - m_BakeBackend: 1 - m_PVRSampling: 1 - m_PVRDirectSampleCount: 32 - m_PVRSampleCount: 512 - m_PVRBounces: 2 - m_PVREnvironmentSampleCount: 256 - m_PVREnvironmentReferencePointCount: 2048 - m_PVRFilteringMode: 1 - m_PVRDenoiserTypeDirect: 1 - m_PVRDenoiserTypeIndirect: 1 - m_PVRDenoiserTypeAO: 1 - m_PVRFilterTypeDirect: 0 - m_PVRFilterTypeIndirect: 0 - m_PVRFilterTypeAO: 0 - m_PVREnvironmentMIS: 1 - m_PVRCulling: 1 - m_PVRFilteringGaussRadiusDirect: 1 - m_PVRFilteringGaussRadiusIndirect: 5 - m_PVRFilteringGaussRadiusAO: 2 - m_PVRFilteringAtrousPositionSigmaDirect: 0.5 - m_PVRFilteringAtrousPositionSigmaIndirect: 2 - m_PVRFilteringAtrousPositionSigmaAO: 1 - m_ExportTrainingData: 0 - m_TrainingDataDestination: TrainingData - m_LightingDataAsset: {fileID: 0} - m_UseShadowmask: 1 ---- !u!196 &4 -NavMeshSettings: - serializedVersion: 2 - m_ObjectHideFlags: 0 - m_BuildSettings: - serializedVersion: 2 - agentTypeID: 0 - agentRadius: 0.5 - agentHeight: 2 - agentSlope: 45 - agentClimb: 0.4 - ledgeDropHeight: 0 - maxJumpAcrossDistance: 0 - minRegionArea: 2 - manualCellSize: 0 - cellSize: 0.16666667 - manualTileSize: 0 - tileSize: 256 - accuratePlacement: 0 - debug: - m_Flags: 0 - m_NavMeshData: {fileID: 0} ---- !u!1 &922358087 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 922358089} - - component: {fileID: 922358088} - m_Layer: 0 - m_Name: Directional Light - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!108 &922358088 -Light: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 922358087} - m_Enabled: 1 - serializedVersion: 9 - m_Type: 1 - m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} - m_Intensity: 1 - m_Range: 10 - m_SpotAngle: 30 - m_InnerSpotAngle: 21.80208 - m_CookieSize: 10 - m_Shadows: - m_Type: 2 - m_Resolution: -1 - m_CustomResolution: -1 - m_Strength: 1 - m_Bias: 0.05 - m_NormalBias: 0.4 - m_NearPlane: 0.2 - m_CullingMatrixOverride: - e00: 1 - e01: 0 - e02: 0 - e03: 0 - e10: 0 - e11: 1 - e12: 0 - e13: 0 - e20: 0 - e21: 0 - e22: 1 - e23: 0 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - m_UseCullingMatrixOverride: 0 - m_Cookie: {fileID: 0} - m_DrawHalo: 0 - m_Flare: {fileID: 0} - m_RenderMode: 0 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_RenderingLayerMask: 1 - m_Lightmapping: 4 - m_LightShadowCasterMode: 0 - m_AreaSize: {x: 1, y: 1} - m_BounceIntensity: 1 - m_ColorTemperature: 6570 - m_UseColorTemperature: 0 - m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} - m_UseBoundingSphereOverride: 0 - m_ShadowRadius: 0 - m_ShadowAngle: 0 ---- !u!4 &922358089 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 922358087} - m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} - m_LocalPosition: {x: 0, y: 3, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} ---- !u!1 &1953608471 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1953608474} - - component: {fileID: 1953608473} - - component: {fileID: 1953608472} - m_Layer: 0 - m_Name: Main Camera - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!81 &1953608472 -AudioListener: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1953608471} - m_Enabled: 1 ---- !u!20 &1953608473 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1953608471} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 1 - m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} - m_projectionMatrixMode: 1 - m_GateFitMode: 2 - m_FOVAxisMode: 0 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.3 - far clip plane: 1000 - field of view: 60 - orthographic: 0 - orthographic size: 5 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_RenderingPath: -1 - m_TargetTexture: {fileID: 0} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 1 - m_AllowMSAA: 1 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 1 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &1953608474 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1953608471} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 1, z: -10} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} diff --git a/Assets/Scripts/UI/UI Animation/GrowEffect.cs b/Assets/Scripts/UI/UI Animation/GrowEffect.cs deleted file mode 100644 index 2eaf8ef..0000000 --- a/Assets/Scripts/UI/UI Animation/GrowEffect.cs +++ /dev/null @@ -1,69 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using UnityEngine; -/// -/// Script that when attached to an object will cause it to grow until it reaches the desired Scale -/// -public class GrowEffect : MonoBehaviour -{ - private enum Effect - { - BOUNCE_IN_OUT, - ELASTIC_IN_OUT, - LINEAR, - CIRCULAR_IN_OUT - } - - [Header("Configuration")] - [Tooltip("The desired scale to grow to")] - [SerializeField] float m_desiredScale = 1.0f; - [Tooltip("How much time it will take to reach the desired scale")] - [SerializeField] float m_timeToReachDesiredScale = 1.0f; - [Tooltip("How much time it takes before the grow effect starts")] - [SerializeField] float m_timeToDelayStart = 0.0f; - [Tooltip("Effect on the grow animation")] - [SerializeField] Effect m_interpolationEffect = Effect.ELASTIC_IN_OUT; - - //private member variables - private float m_currentTime = 0.0f; - - private void Awake() - { - //set the local scale to zero so it can grow - transform.localScale = Vector3.zero; - } - - void Update() - { - if (m_timeToDelayStart <= 0.0) - { - //increment current time by DT - m_currentTime += Time.deltaTime; - - if (!(m_currentTime > m_timeToReachDesiredScale)) - { - //Switch as to which effect will happen - switch (m_interpolationEffect) - { - case Effect.BOUNCE_IN_OUT: - gameObject.transform.localScale = (Vector3.one * Mathf.LerpUnclamped(0, m_desiredScale, Interpolation.BounceInOut(m_currentTime / m_timeToReachDesiredScale))); - break; - case Effect.ELASTIC_IN_OUT: - gameObject.transform.localScale = (Vector3.one * Mathf.LerpUnclamped(0, m_desiredScale, Interpolation.ElasticInOut(m_currentTime / m_timeToReachDesiredScale))); - break; - case Effect.LINEAR: - gameObject.transform.localScale = (Vector3.one * Mathf.LerpUnclamped(0, m_desiredScale, Interpolation.Linear(m_currentTime / m_timeToReachDesiredScale))); - break; - case Effect.CIRCULAR_IN_OUT: - gameObject.transform.localScale = (Vector3.one * Mathf.LerpUnclamped(0, m_desiredScale, Interpolation.CircularInOut(m_currentTime / m_timeToReachDesiredScale))); - break; - } - } - } - else - { - //reduce the delay start by DT - m_timeToDelayStart -= Time.deltaTime; - } - } -} diff --git a/Assets/Scripts/UI/UI Animation/HelicopterGrowEffect.cs b/Assets/Scripts/UI/UI Animation/HelicopterGrowEffect.cs deleted file mode 100644 index cbbe432..0000000 --- a/Assets/Scripts/UI/UI Animation/HelicopterGrowEffect.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using UnityEngine; - -public class HelicopterGrowEffect : MonoBehaviour -{ - [Header("Configuration")] - [Tooltip("The desired Scale to reach")] - [SerializeField] float m_desiredScale = 1.0f; - [Tooltip("How much time it will take to reach the desired scale")] - [SerializeField] float m_timeToReachDesiredScale = 1.0f; - [Tooltip("How fast the helicopter effect will spin")] - [SerializeField] float m_rotationSpeed = 2.0f; - [Tooltip("the angle of rotation per frame")] - [SerializeField] float m_rotationAngle = 10.0f; - - //private member variables - private float m_currentTime = 0.0f; - private Quaternion startingRotation = Quaternion.identity; - - private void Awake() - { - //set the base transform to 0 so it can grow - transform.localScale = Vector3.zero; - //set the staring rotation variable to the current rotation - startingRotation = transform.rotation; - } - - void Update() - { - //increment current time by delta time - m_currentTime += Time.deltaTime; - if (m_currentTime <= m_timeToReachDesiredScale) - { - //rotate the object by the rotation angle and rotation speed - gameObject.transform.Rotate(Vector3.forward, (m_rotationAngle * (m_rotationSpeed * Time.deltaTime))); - //lerp the scale to the desired scale - gameObject.transform.localScale = (Vector3.one * Mathf.LerpUnclamped(0, m_desiredScale, Interpolation.ElasticInOut(m_currentTime/m_timeToReachDesiredScale))); - //leave the function - return; - } - else - { - //when the lerping is done set the rotation to the starting rotation - gameObject.transform.rotation = startingRotation; - //set the scale to the desired scale - gameObject.transform.localScale = Vector3.one * m_desiredScale; - } - } -} diff --git a/Assets/Scripts/UI/UI Animation/ImageFade.cs b/Assets/Scripts/UI/UI Animation/ImageFade.cs deleted file mode 100644 index edca0c0..0000000 --- a/Assets/Scripts/UI/UI Animation/ImageFade.cs +++ /dev/null @@ -1,150 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using TMPro; -using UnityEngine; -using UnityEngine.UI; -/// -/// Component that when attached to an Image will fade in or out based on isFadingIn -/// -[RequireComponent(typeof(Image))] -public class ImageFade : MonoBehaviour -{ - [Header("Configuration")] - [Tooltip("The Time it takes for the object to fade")] - [SerializeField] float m_timeToFade = 1.5f; - [Tooltip("The Time it takes before the object begins its fading")] - [SerializeField] float m_delayTimeToStart = 1.5f; - [Tooltip("Boolean to determing if the image is fading in or out")] - [SerializeField] bool m_isFadingIn = true; - [Tooltip("Boolean to determing if the image is a button or out")] - [SerializeField] bool m_doesHaveChildText = false; - - //Sibling Components - private Image m_image; - private TextMeshProUGUI m_text; - - //Member variables - private Color m_startColor; - private Color m_buttonTextStartColor; - private Color m_desiredEndColor; - private float m_timeElapsed = 0.0f; - - private void Awake() - { - GetSiblingComponents(); - //set the starting color to the color of the object - SetStartingColor(); - //Start the Fade Coroutine - StartCoroutine(Fade()); - } - - //Function that sets the image color value determined on if you want to fade in or out - private void SetStartingColor() - { - //start color is set to the images current color - m_startColor = m_image.color; - //create new varibles to be messed with later - Color modifiedColor = m_startColor; - Color modifiedTextColor = default; - if (m_doesHaveChildText) - { - //if this had childed text component buttonTextStartcolor is set to the text's current color - m_buttonTextStartColor = m_text.color; - modifiedTextColor = m_buttonTextStartColor; - } - //sets the starting colors alpha values - if (m_isFadingIn) - { - //if it is fading in set alpha values to 0 - modifiedColor.a = 0.0f; - modifiedTextColor.a = 0.0f; - } - //Set the current colors to be the modified colors for fading - m_image.color = modifiedColor; - if (m_doesHaveChildText) - { - m_text.color = modifiedTextColor; - } - } - - /// - /// Gets the Required Sibling components - /// - private void GetSiblingComponents() - { - m_image = GetComponent(); - if (m_doesHaveChildText) - { - m_text = GetComponentInChildren(); - } - } - - /// - /// Coroutine that fades the Image by lerping the alpha from either 1-0 or 0-1 - /// - IEnumerator Fade() - { - //Wait for the delay - yield return new WaitForSeconds(m_delayTimeToStart); - //create new color - Color newColor = m_startColor; - Color newTextColor = default; - if (m_doesHaveChildText) - { - newTextColor = m_text.color; - } - while (m_timeElapsed < m_timeToFade) - { - float time = m_timeElapsed / m_timeToFade; - if (m_isFadingIn) - { - //set new colors alpha to the lerp value of time - newColor.a = Mathf.Lerp(0, m_startColor.a, time); - if (m_doesHaveChildText) - { - newTextColor.a = Mathf.Lerp(0, m_buttonTextStartColor.a, time); - } - } - else - { - //set new colors alpha to the lerp value of time - newColor.a = Mathf.Lerp(m_startColor.a, 0, time); - if (m_doesHaveChildText) - { - newTextColor.a = Mathf.Lerp(m_buttonTextStartColor.a, 0, time); - } - } - //set image color to the new color - if (m_doesHaveChildText) - { - m_text.color = newTextColor; - } - m_image.color = newColor; - //add deltaTime to time elapsed - m_timeElapsed += Time.deltaTime; - yield return null; - } - //when the loop finishes set the colors to be what they are supposed to be - if (m_isFadingIn) - { - m_image.color = m_startColor; - if (m_doesHaveChildText) - { - m_text.color = m_buttonTextStartColor; - } - } - else - { - //if not is fading in set the alpha values to 0 - Color desiredColor = m_startColor; - desiredColor.a = 0.0f; - m_image.color = desiredColor; - if(m_doesHaveChildText) - { - desiredColor = m_buttonTextStartColor; - desiredColor.a = 0.0f; - m_text.color = desiredColor; - } - } - } -} diff --git a/Assets/Scripts/UI/UI Animation/LerpFromOffset.cs b/Assets/Scripts/UI/UI Animation/LerpFromOffset.cs deleted file mode 100644 index 33172b6..0000000 --- a/Assets/Scripts/UI/UI Animation/LerpFromOffset.cs +++ /dev/null @@ -1,104 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using UnityEngine; - -public class LerpFromOffset : MonoBehaviour -{ - /// - /// Effect Enum only to be used by this class, for chossing which interpolation effect to use - /// - private enum Effect - { - BOUNCE_OUT, - ELASTIC_OUT, - LINEAR, - CIRCULAR_OUT, - CIRCULAR_IN, - CIRCULAR_IN_OUT, - INVERSE_CIRCULAR_IN_OUT - } - - [Header("Configuration")] - [Tooltip("The The Effect you would like to happen")] - [SerializeField] Effect m_effect = default; - [Tooltip("The direction you want the object to lerp from")] - [SerializeField] Vector3 m_offsetDirection = default; - [Tooltip("The the distnace you want to multiply the direction by")] - [SerializeField] float m_offsetDistance = 1.0f; - [Tooltip("How much time it will take for the object to reach its original position")] - [SerializeField] float m_timeToReachPosition = 1.5f; - [Tooltip("How much time it will take to start moving")] - [SerializeField] float m_delayStart = 1.5f; - - - //Memeber variables - private Vector3 m_offset = Vector3.zero; - private Vector3 m_desiredPos = Vector3.zero; - private float m_currentTime = 0.0f; - - void Awake() - { - Setup(); - } - /// - /// Method that sets up all of the needed things and places the object at the calcuated offset - /// - void Setup() - { - //calculate offset position - m_offset = m_offsetDirection.normalized * m_offsetDistance; - //set the desired position to the current position - m_desiredPos = transform.position; - //move the object to the offset position to begin lerping - transform.position = m_desiredPos + m_offset; - } - - void Update() - { - if (m_delayStart <= 0.0f) - { - //add deltaTime to the current time - m_currentTime += Time.deltaTime; - if (m_currentTime < m_timeToReachPosition) - { - //based on which effect is selected this will lerp from the curretn position to the desired position - switch (m_effect) - { - //Lerps using the BouceOut Interpolation - case Effect.BOUNCE_OUT: - transform.position = Vector3.LerpUnclamped(m_desiredPos + m_offset, m_desiredPos, Interpolation.BounceOut(m_currentTime / m_timeToReachPosition)); - break; - //Lerps using the ElasticOut Interpolation - case Effect.ELASTIC_OUT: - transform.position = Vector3.LerpUnclamped(m_desiredPos + m_offset, m_desiredPos, Interpolation.ElasticOut(m_currentTime / m_timeToReachPosition)); - break; - //Lerps using the Linear Interpolation - case Effect.LINEAR: - transform.position = Vector3.LerpUnclamped(m_desiredPos + m_offset, m_desiredPos, Interpolation.Linear(m_currentTime / m_timeToReachPosition)); - break; - //Lerps using the CircularOut Interpolation - case Effect.CIRCULAR_OUT: - transform.position = Vector3.LerpUnclamped(m_desiredPos + m_offset, m_desiredPos, Interpolation.CircularOut(m_currentTime / m_timeToReachPosition)); - break; - //Lerps using the CircularInOut Interpolation - case Effect.CIRCULAR_IN_OUT: - transform.position = Vector3.LerpUnclamped(m_desiredPos + m_offset, m_desiredPos, Interpolation.CircularInOut(m_currentTime / m_timeToReachPosition)); - break; - //Lerps using the CircularIn Interpolation - case Effect.CIRCULAR_IN: - transform.position = Vector3.LerpUnclamped(m_desiredPos + m_offset, m_desiredPos, Interpolation.SineIn(m_currentTime / m_timeToReachPosition)); - break; - } - - return; - } - //set the current position to the desired position - transform.position = m_desiredPos; - } - else - { - //remove Deltatime from the m_delayStart - m_delayStart -= Time.deltaTime; - } - } -} From 611127380aa0fc23f70daefc92103d92ee35f038 Mon Sep 17 00:00:00 2001 From: lmckamey Date: Fri, 9 Aug 2019 10:10:51 -0600 Subject: [PATCH 134/231] Added Animation Scripts and Sample Scene Added a few mathmatical Animation Scripts for UI elements, along with a sample scene to show how they work --- Assets/Scenes/ui animation Sample Scene.unity | 1712 +++++++++++++++++ Assets/Scripts/UI/Animation/GrowEffect.cs | 70 + .../UI/Animation/HelicopterGrowEffect.cs | 52 + Assets/Scripts/UI/Animation/ImageFade.cs | 150 ++ Assets/Scripts/UI/Animation/LerpFromOffset.cs | 108 ++ .../UI/Animation/Shared/Interpolation.cs | 220 +++ 6 files changed, 2312 insertions(+) create mode 100644 Assets/Scenes/ui animation Sample Scene.unity create mode 100644 Assets/Scripts/UI/Animation/GrowEffect.cs create mode 100644 Assets/Scripts/UI/Animation/HelicopterGrowEffect.cs create mode 100644 Assets/Scripts/UI/Animation/ImageFade.cs create mode 100644 Assets/Scripts/UI/Animation/LerpFromOffset.cs create mode 100644 Assets/Scripts/UI/Animation/Shared/Interpolation.cs diff --git a/Assets/Scenes/ui animation Sample Scene.unity b/Assets/Scenes/ui animation Sample Scene.unity new file mode 100644 index 0000000..45734bf --- /dev/null +++ b/Assets/Scenes/ui animation Sample Scene.unity @@ -0,0 +1,1712 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 8 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 11 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_TemporalCoherenceThreshold: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 1 + m_LightmapEditorSettings: + serializedVersion: 9 + m_Resolution: 2 + m_BakeResolution: 40 + m_TextureWidth: 1024 + m_TextureHeight: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 0 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVRBounces: 2 + m_PVRFiltering: 0 + m_PVRFilteringMode: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousColorSigma: 1 + m_PVRFilteringAtrousNormalSigma: 1 + m_PVRFilteringAtrousPositionSigma: 1 + m_LightingDataAsset: {fileID: 0} + m_UseShadowmask: 1 +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &60103456 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 60103457} + - component: {fileID: 60103461} + - component: {fileID: 60103460} + - component: {fileID: 60103458} + m_Layer: 5 + m_Name: Helicopter grow effect + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &60103457 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 60103456} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 65850448} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 600, y: 250} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &60103458 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 60103456} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 494ccccf65c01594b87c46d7e6a1f966, type: 3} + m_Name: + m_EditorClassIdentifier: + m_desiredScale: 1 + m_timeToReachDesiredScale: 2 + m_rotationSpeed: 5 + m_rotationAngle: 35 +--- !u!114 &60103460 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 60103456} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 100 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 1 + m_MaxSize: 100 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Helicopter Grow Effect +--- !u!222 &60103461 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 60103456} +--- !u!1 &65850444 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 65850448} + - component: {fileID: 65850447} + - component: {fileID: 65850446} + - component: {fileID: 65850445} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &65850445 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 65850444} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1301386320, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &65850446 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 65850444} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1980459831, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 +--- !u!223 &65850447 +Canvas: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 65850444} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &65850448 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 65850444} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_Children: + - {fileID: 1549637274} + - {fileID: 60103457} + - {fileID: 1326669243} + - {fileID: 647913274} + - {fileID: 1105015894} + - {fileID: 1170391614} + - {fileID: 862420478} + - {fileID: 1669247682} + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!1 &523868528 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 523868533} + - component: {fileID: 523868532} + - component: {fileID: 523868531} + - component: {fileID: 523868530} + - component: {fileID: 523868529} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &523868529 +AudioListener: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 523868528} + m_Enabled: 1 +--- !u!124 &523868530 +Behaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 523868528} + m_Enabled: 1 +--- !u!92 &523868531 +Behaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 523868528} + m_Enabled: 1 +--- !u!20 &523868532 +Camera: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 523868528} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 + m_StereoMirrorMode: 0 +--- !u!4 &523868533 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 523868528} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &588481442 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 588481443} + - component: {fileID: 588481445} + - component: {fileID: 588481444} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &588481443 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 588481442} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1669247682} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &588481444 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 588481442} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Next +--- !u!222 &588481445 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 588481442} +--- !u!1 &647913273 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 647913274} + - component: {fileID: 647913277} + - component: {fileID: 647913276} + - component: {fileID: 647913275} + m_Layer: 5 + m_Name: Lerp From Offset + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &647913274 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 647913273} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 65850448} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 600, y: 250} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &647913275 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 647913273} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 8a8c268e33662234199c5b926b7dfd5b, type: 3} + m_Name: + m_EditorClassIdentifier: + m_effect: 4 + m_offsetDirection: {x: 100, y: 100, z: 0} + m_offsetDistance: 100 + m_timeToReachPosition: 1.5 + m_delayStart: 0 +--- !u!114 &647913276 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 647913273} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 100 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 1 + m_MaxSize: 100 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Lerp From Offset +--- !u!222 &647913277 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 647913273} +--- !u!1 &764075908 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 764075909} + - component: {fileID: 764075911} + - component: {fileID: 764075910} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &764075909 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 764075908} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1105015894} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &764075910 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 764075908} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Next +--- !u!222 &764075911 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 764075908} +--- !u!1 &862420474 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 862420478} + - component: {fileID: 862420477} + - component: {fileID: 862420476} + - component: {fileID: 862420475} + m_Layer: 5 + m_Name: ImageFadeToLerp + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!114 &862420475 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 862420474} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1392445389, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 862420476} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1326669242} + m_MethodName: SetActive + m_Mode: 6 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + - m_Target: {fileID: 647913273} + m_MethodName: SetActive + m_Mode: 6 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 1 + m_CallState: 2 + - m_Target: {fileID: 862420474} + m_MethodName: SetActive + m_Mode: 6 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + - m_Target: {fileID: 1669247681} + m_MethodName: SetActive + m_Mode: 6 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 1 + m_CallState: 2 + m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0, + Culture=neutral, PublicKeyToken=null +--- !u!114 &862420476 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 862420474} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &862420477 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 862420474} +--- !u!224 &862420478 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 862420474} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1392838399} + m_Father: {fileID: 65850448} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 200, y: -200} + m_SizeDelta: {x: 200, y: 50} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1105015893 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1105015894} + - component: {fileID: 1105015897} + - component: {fileID: 1105015896} + - component: {fileID: 1105015895} + m_Layer: 5 + m_Name: GrowEffectToHelicopter + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1105015894 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1105015893} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 764075909} + m_Father: {fileID: 65850448} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 200, y: -200} + m_SizeDelta: {x: 200, y: 50} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1105015895 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1105015893} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1392445389, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1105015896} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1549637273} + m_MethodName: SetActive + m_Mode: 6 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + - m_Target: {fileID: 60103456} + m_MethodName: SetActive + m_Mode: 6 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 1 + m_CallState: 2 + - m_Target: {fileID: 1170391613} + m_MethodName: SetActive + m_Mode: 6 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 1 + m_CallState: 2 + - m_Target: {fileID: 1105015893} + m_MethodName: SetActive + m_Mode: 6 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0, + Culture=neutral, PublicKeyToken=null +--- !u!114 &1105015896 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1105015893} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &1105015897 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1105015893} +--- !u!1 &1170391613 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1170391614} + - component: {fileID: 1170391617} + - component: {fileID: 1170391616} + - component: {fileID: 1170391615} + m_Layer: 5 + m_Name: HelicopterToImageFade + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &1170391614 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1170391613} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1851853257} + m_Father: {fileID: 65850448} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 200, y: -200} + m_SizeDelta: {x: 200, y: 50} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1170391615 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1170391613} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1392445389, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1170391616} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 60103456} + m_MethodName: SetActive + m_Mode: 6 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + - m_Target: {fileID: 1326669242} + m_MethodName: SetActive + m_Mode: 6 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 1 + m_CallState: 2 + - m_Target: {fileID: 1170391613} + m_MethodName: SetActive + m_Mode: 6 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + - m_Target: {fileID: 862420474} + m_MethodName: SetActive + m_Mode: 6 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 1 + m_CallState: 2 + m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0, + Culture=neutral, PublicKeyToken=null +--- !u!114 &1170391616 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1170391613} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &1170391617 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1170391613} +--- !u!1 &1326669242 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1326669243} + - component: {fileID: 1326669246} + - component: {fileID: 1326669245} + - component: {fileID: 1326669244} + m_Layer: 5 + m_Name: Image Fade + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &1326669243 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1326669242} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 65850448} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 100, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1326669244 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1326669242} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9b6641416af12354c82ba88e2c919780, type: 3} + m_Name: + m_EditorClassIdentifier: + m_timeToFade: 1.5 + m_delayTimeToStart: 0 + m_isFadingIn: 1 + m_doesHaveChildText: 0 +--- !u!114 &1326669245 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1326669242} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &1326669246 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1326669242} +--- !u!1 &1392838398 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1392838399} + - component: {fileID: 1392838401} + - component: {fileID: 1392838400} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1392838399 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1392838398} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 862420478} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1392838400 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1392838398} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Next +--- !u!222 &1392838401 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1392838398} +--- !u!1 &1453411760 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1453411762} + - component: {fileID: 1453411761} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &1453411761 +Light: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1453411760} + m_Enabled: 1 + serializedVersion: 8 + m_Type: 1 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_Lightmapping: 4 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_FalloffTable: + m_Table[0]: 0 + m_Table[1]: 0 + m_Table[2]: 0 + m_Table[3]: 0 + m_Table[4]: 0 + m_Table[5]: 0 + m_Table[6]: 0 + m_Table[7]: 0 + m_Table[8]: 0 + m_Table[9]: 0 + m_Table[10]: 0 + m_Table[11]: 0 + m_Table[12]: 0 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &1453411762 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1453411760} + m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1 &1549637273 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1549637274} + - component: {fileID: 1549637277} + - component: {fileID: 1549637276} + - component: {fileID: 1549637275} + m_Layer: 5 + m_Name: Grow Effect + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1549637274 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1549637273} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 65850448} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 600, y: 250} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1549637275 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1549637273} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 130f33757f672504992a0c2e741afbba, type: 3} + m_Name: + m_EditorClassIdentifier: + m_desiredScale: 1 + m_timeToReachDesiredScale: 2 + m_timeToDelayStart: 0 + m_interpolationEffect: 1 +--- !u!114 &1549637276 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1549637273} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 100 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 1 + m_MaxSize: 100 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Grow Effect +--- !u!222 &1549637277 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1549637273} +--- !u!1 &1560749332 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1560749335} + - component: {fileID: 1560749334} + - component: {fileID: 1560749333} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1560749333 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1560749332} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1077351063, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalAxis: Horizontal + m_VerticalAxis: Vertical + m_SubmitButton: Submit + m_CancelButton: Cancel + m_InputActionsPerSecond: 10 + m_RepeatDelay: 0.5 + m_ForceModuleActive: 0 +--- !u!114 &1560749334 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1560749332} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -619905303, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 5 +--- !u!4 &1560749335 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1560749332} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1669247681 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1669247682} + - component: {fileID: 1669247685} + - component: {fileID: 1669247684} + - component: {fileID: 1669247683} + m_Layer: 5 + m_Name: LerpToGrow + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &1669247682 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1669247681} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 588481443} + m_Father: {fileID: 65850448} + m_RootOrder: 7 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 200, y: -200} + m_SizeDelta: {x: 200, y: 50} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1669247683 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1669247681} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1392445389, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1669247684} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 647913273} + m_MethodName: SetActive + m_Mode: 6 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + - m_Target: {fileID: 1549637273} + m_MethodName: SetActive + m_Mode: 6 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 1 + m_CallState: 2 + - m_Target: {fileID: 1669247681} + m_MethodName: SetActive + m_Mode: 6 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + - m_Target: {fileID: 1105015893} + m_MethodName: SetActive + m_Mode: 6 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 1 + m_CallState: 2 + m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0, + Culture=neutral, PublicKeyToken=null +--- !u!114 &1669247684 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1669247681} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 +--- !u!222 &1669247685 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1669247681} +--- !u!1 &1851853256 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1851853257} + - component: {fileID: 1851853259} + - component: {fileID: 1851853258} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1851853257 +RectTransform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1851853256} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1170391614} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1851853258 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1851853256} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, + Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Next +--- !u!222 &1851853259 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1851853256} diff --git a/Assets/Scripts/UI/Animation/GrowEffect.cs b/Assets/Scripts/UI/Animation/GrowEffect.cs new file mode 100644 index 0000000..1f02171 --- /dev/null +++ b/Assets/Scripts/UI/Animation/GrowEffect.cs @@ -0,0 +1,70 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +/// +/// Script that when attached to an object will cause it to grow until it reaches the desired Scale +/// +public class GrowEffect : MonoBehaviour +{ + private enum Effect + { + BOUNCE_IN_OUT, + ELASTIC_IN_OUT, + LINEAR, + CIRCULAR_IN_OUT + } + + [Header("Configuration")] + [Tooltip("The desired scale to grow to")] + [SerializeField] float m_desiredScale = 1.0f; + [Tooltip("How much time it will take to reach the desired scale")] + [SerializeField] float m_timeToReachDesiredScale = 1.0f; + [Tooltip("How much time it takes before the grow effect starts")] + [SerializeField] float m_timeToDelayStart = 0.0f; + [Tooltip("Effect on the grow animation")] + [SerializeField] Effect m_interpolationEffect = Effect.ELASTIC_IN_OUT; + + //private member variables + private float m_currentTime = 0.0f; + + private void OnEnable() + { + //set the local scale to zero so it can grow + transform.localScale = Vector3.zero; + m_currentTime = 0.0f; + } + + void Update() + { + if (m_timeToDelayStart <= 0.0) + { + //increment current time by DT + m_currentTime += Time.deltaTime; + + if (!(m_currentTime > m_timeToReachDesiredScale)) + { + //Switch as to which effect will happen + switch (m_interpolationEffect) + { + case Effect.BOUNCE_IN_OUT: + gameObject.transform.localScale = (Vector3.one * Mathf.LerpUnclamped(0, m_desiredScale, Interpolation.BounceInOut(m_currentTime / m_timeToReachDesiredScale))); + break; + case Effect.ELASTIC_IN_OUT: + gameObject.transform.localScale = (Vector3.one * Mathf.LerpUnclamped(0, m_desiredScale, Interpolation.ElasticInOut(m_currentTime / m_timeToReachDesiredScale))); + break; + case Effect.LINEAR: + gameObject.transform.localScale = (Vector3.one * Mathf.LerpUnclamped(0, m_desiredScale, Interpolation.Linear(m_currentTime / m_timeToReachDesiredScale))); + break; + case Effect.CIRCULAR_IN_OUT: + gameObject.transform.localScale = (Vector3.one * Mathf.LerpUnclamped(0, m_desiredScale, Interpolation.CircularInOut(m_currentTime / m_timeToReachDesiredScale))); + break; + } + } + } + else + { + //reduce the delay start by DT + m_timeToDelayStart -= Time.deltaTime; + } + } +} diff --git a/Assets/Scripts/UI/Animation/HelicopterGrowEffect.cs b/Assets/Scripts/UI/Animation/HelicopterGrowEffect.cs new file mode 100644 index 0000000..07b1323 --- /dev/null +++ b/Assets/Scripts/UI/Animation/HelicopterGrowEffect.cs @@ -0,0 +1,52 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class HelicopterGrowEffect : MonoBehaviour +{ + [Header("Configuration")] + [Tooltip("The desired Scale to reach")] + [SerializeField] float m_desiredScale = 1.0f; + [Tooltip("How much time it will take to reach the desired scale")] + [SerializeField] float m_timeToReachDesiredScale = 1.0f; + [Tooltip("How fast the helicopter effect will spin")] + [SerializeField] float m_rotationSpeed = 2.0f; + [Tooltip("the angle of rotation per frame")] + [SerializeField] float m_rotationAngle = 10.0f; + + //private member variables + private float m_currentTime = 0.0f; + private Quaternion startingRotation = Quaternion.identity; + + private void OnEnable() + { + m_currentTime = 0.0f; + //set the base transform to 0 so it can grow + transform.localScale = Vector3.zero; + //set the staring rotation variable to the current rotation + startingRotation = transform.rotation; + + } + + void Update() + { + //increment current time by delta time + m_currentTime += Time.deltaTime; + if (m_currentTime <= m_timeToReachDesiredScale) + { + //rotate the object by the rotation angle and rotation speed + gameObject.transform.Rotate(Vector3.forward, (m_rotationAngle * (m_rotationSpeed * Time.deltaTime))); + //lerp the scale to the desired scale + gameObject.transform.localScale = (Vector3.one * Mathf.LerpUnclamped(0, m_desiredScale, Interpolation.ElasticInOut(m_currentTime/m_timeToReachDesiredScale))); + //leave the function + return; + } + else + { + //when the lerping is done set the rotation to the starting rotation + gameObject.transform.rotation = startingRotation; + //set the scale to the desired scale + gameObject.transform.localScale = Vector3.one * m_desiredScale; + } + } +} diff --git a/Assets/Scripts/UI/Animation/ImageFade.cs b/Assets/Scripts/UI/Animation/ImageFade.cs new file mode 100644 index 0000000..ee1a2ff --- /dev/null +++ b/Assets/Scripts/UI/Animation/ImageFade.cs @@ -0,0 +1,150 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.UI; +/// +/// Component that when attached to an Image will fade in or out based on isFadingIn +/// +[RequireComponent(typeof(Image))] +public class ImageFade : MonoBehaviour +{ + [Header("Configuration")] + [Tooltip("The Time it takes for the object to fade")] + [SerializeField] float m_timeToFade = 1.5f; + [Tooltip("The Time it takes before the object begins its fading")] + [SerializeField] float m_delayTimeToStart = 1.5f; + [Tooltip("Boolean to determing if the image is fading in or out")] + [SerializeField] bool m_isFadingIn = true; + [Tooltip("Boolean to determing if the image is a button or out")] + [SerializeField] bool m_doesHaveChildText = false; + + //Sibling Components + private Image m_image; + private Text m_text; + + //Member variables + private Color m_startColor; + private Color m_buttonTextStartColor; + private Color m_desiredEndColor; + private float m_timeElapsed = 0.0f; + + private void OnEnable() + { + m_timeElapsed = 0.0f; + GetSiblingComponents(); + //set the starting color to the color of the object + SetStartingColor(); + //Start the Fade Coroutine + StartCoroutine(Fade()); + } + + //Function that sets the image color value determined on if you want to fade in or out + private void SetStartingColor() + { + //start color is set to the images current color + m_startColor = m_image.color; + //create new varibles to be messed with later + Color modifiedColor = m_startColor; + Color modifiedTextColor = new Color(); + if (m_doesHaveChildText) + { + //if this had childed text component buttonTextStartcolor is set to the text's current color + m_buttonTextStartColor = m_text.color; + modifiedTextColor = m_buttonTextStartColor; + } + //sets the starting colors alpha values + if (m_isFadingIn) + { + //if it is fading in set alpha values to 0 + modifiedColor.a = 0.0f; + modifiedTextColor.a = 0.0f; + } + //Set the current colors to be the modified colors for fading + m_image.color = modifiedColor; + if (m_doesHaveChildText) + { + m_text.color = modifiedTextColor; + } + } + + /// + /// Gets the Required Sibling components + /// + private void GetSiblingComponents() + { + m_image = GetComponent(); + if (m_doesHaveChildText) + { + m_text = GetComponentInChildren(); + } + } + + /// + /// Coroutine that fades the Image by lerping the alpha from either 1-0 or 0-1 + /// + IEnumerator Fade() + { + //Wait for the delay + yield return new WaitForSeconds(m_delayTimeToStart); + //create new color + Color newColor = m_startColor; + Color newTextColor = new Color(); + if (m_doesHaveChildText) + { + newTextColor = m_text.color; + } + while (m_timeElapsed < m_timeToFade) + { + float time = m_timeElapsed / m_timeToFade; + if (m_isFadingIn) + { + //set new colors alpha to the lerp value of time + newColor.a = Mathf.Lerp(0, m_startColor.a, time); + if (m_doesHaveChildText) + { + newTextColor.a = Mathf.Lerp(0, m_buttonTextStartColor.a, time); + } + } + else + { + //set new colors alpha to the lerp value of time + newColor.a = Mathf.Lerp(m_startColor.a, 0, time); + if (m_doesHaveChildText) + { + newTextColor.a = Mathf.Lerp(m_buttonTextStartColor.a, 0, time); + } + } + //set image color to the new color + if (m_doesHaveChildText) + { + m_text.color = newTextColor; + } + m_image.color = newColor; + //add deltaTime to time elapsed + m_timeElapsed += Time.deltaTime; + yield return null; + } + //when the loop finishes set the colors to be what they are supposed to be + if (m_isFadingIn) + { + m_image.color = m_startColor; + if (m_doesHaveChildText) + { + m_text.color = m_buttonTextStartColor; + } + } + else + { + //if not is fading in set the alpha values to 0 + Color desiredColor = m_startColor; + desiredColor.a = 0.0f; + m_image.color = desiredColor; + if(m_doesHaveChildText) + { + desiredColor = m_buttonTextStartColor; + desiredColor.a = 0.0f; + m_text.color = desiredColor; + } + } + } +} diff --git a/Assets/Scripts/UI/Animation/LerpFromOffset.cs b/Assets/Scripts/UI/Animation/LerpFromOffset.cs new file mode 100644 index 0000000..80d74de --- /dev/null +++ b/Assets/Scripts/UI/Animation/LerpFromOffset.cs @@ -0,0 +1,108 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class LerpFromOffset : MonoBehaviour +{ + /// + /// Effect Enum only to be used by this class, for chossing which interpolation effect to use + /// + private enum Effect + { + BOUNCE_OUT, + ELASTIC_OUT, + LINEAR, + CIRCULAR_OUT, + CIRCULAR_IN, + CIRCULAR_IN_OUT, + INVERSE_CIRCULAR_IN_OUT + } + + [Header("Configuration")] + [Tooltip("The The Effect you would like to happen")] + [SerializeField] Effect m_effect = Effect.LINEAR; + [Tooltip("The direction you want the object to lerp from")] + [SerializeField] Vector3 m_offsetDirection = Vector3.zero; + [Tooltip("The the distnace you want to multiply the direction by")] + [SerializeField] float m_offsetDistance = 1.0f; + [Tooltip("How much time it will take for the object to reach its original position")] + [SerializeField] float m_timeToReachPosition = 1.5f; + [Tooltip("How much time it will take to start moving")] + [SerializeField] float m_delayStart = 1.5f; + + + //Memeber variables + private Vector3 m_offset = Vector3.zero; + private Vector3 m_desiredPos = Vector3.zero; + private float m_currentTime = 0.0f; + + void OnEnable() + { + m_offset = Vector3.zero; + m_desiredPos = Vector3.zero; + m_currentTime = 0.0f; + + Setup(); + } + /// + /// Method that sets up all of the needed things and places the object at the calcuated offset + /// + void Setup() + { + //calculate offset position + m_offset = m_offsetDirection.normalized * m_offsetDistance; + //set the desired position to the current position + m_desiredPos = transform.position; + //move the object to the offset position to begin lerping + transform.position = m_desiredPos + m_offset; + } + + void Update() + { + if (m_delayStart <= 0.0f) + { + //add deltaTime to the current time + m_currentTime += Time.deltaTime; + if (m_currentTime < m_timeToReachPosition) + { + //based on which effect is selected this will lerp from the curretn position to the desired position + switch (m_effect) + { + //Lerps using the BouceOut Interpolation + case Effect.BOUNCE_OUT: + transform.position = Vector3.LerpUnclamped(m_desiredPos + m_offset, m_desiredPos, Interpolation.BounceOut(m_currentTime / m_timeToReachPosition)); + break; + //Lerps using the ElasticOut Interpolation + case Effect.ELASTIC_OUT: + transform.position = Vector3.LerpUnclamped(m_desiredPos + m_offset, m_desiredPos, Interpolation.ElasticOut(m_currentTime / m_timeToReachPosition)); + break; + //Lerps using the Linear Interpolation + case Effect.LINEAR: + transform.position = Vector3.LerpUnclamped(m_desiredPos + m_offset, m_desiredPos, Interpolation.Linear(m_currentTime / m_timeToReachPosition)); + break; + //Lerps using the CircularOut Interpolation + case Effect.CIRCULAR_OUT: + transform.position = Vector3.LerpUnclamped(m_desiredPos + m_offset, m_desiredPos, Interpolation.CircularOut(m_currentTime / m_timeToReachPosition)); + break; + //Lerps using the CircularInOut Interpolation + case Effect.CIRCULAR_IN_OUT: + transform.position = Vector3.LerpUnclamped(m_desiredPos + m_offset, m_desiredPos, Interpolation.CircularInOut(m_currentTime / m_timeToReachPosition)); + break; + //Lerps using the CircularIn Interpolation + case Effect.CIRCULAR_IN: + transform.position = Vector3.LerpUnclamped(m_desiredPos + m_offset, m_desiredPos, Interpolation.SineIn(m_currentTime / m_timeToReachPosition)); + break; + } + + return; + } + //set the current position to the desired position + transform.position = m_desiredPos; + } + else + { + //remove Deltatime from the m_delayStart + m_delayStart -= Time.deltaTime; + } + } +} diff --git a/Assets/Scripts/UI/Animation/Shared/Interpolation.cs b/Assets/Scripts/UI/Animation/Shared/Interpolation.cs new file mode 100644 index 0000000..e441366 --- /dev/null +++ b/Assets/Scripts/UI/Animation/Shared/Interpolation.cs @@ -0,0 +1,220 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +/// +/// Methods that make LERPs nice +/// +static public class Interpolation +{ + + static public float Linear(float t) + { + return t; + } + + static public float SmoothStep(float t) + { + return t * t * (3.0f - 2.0f * t); + } + + static public float SmootherStep(float t) + { + return t * t * t * (t * (6.0f * t - 15.0f) + 10.0f); + } + + static public float SineIn(float t) + { + return Mathf.Sin((t - 1.0f) * Mathf.PI * 0.5f) + 1.0f; + } + + static public float SineOut(float t) + { + return Mathf.Sin(t * Mathf.PI * 0.5f); + } + + static public float SineInOut(float t) + { + return (1.0f - Mathf.Cos(t * Mathf.PI)) * 0.5f; + } + + static public float QuadraticIn(float t) + { + return t * t; + } + + static public float QuadraticOut(float t) + { + return -(t * (t - 2.0f)); + } + + static public float QuadraticInOut(float t) + { + return (t < 0.5f) ? 2.0f * (t * t) : (-2.0f * t * t) + (4 * t) - 1; + } + + static public float CubicIn(float t) + { + return Mathf.Pow(t, 3); + } + + static public float CubicOut(float t) + { + return 1.0f - Mathf.Pow(1.0f - t, 3); + } + + static public float CubicInOut(float t) + { + return (t < 0.5f) ? Mathf.Pow(t * 2.0f, 3) * 0.5f : 1.0f - Mathf.Pow((1.0f - t) * 2.0f, 3) * 0.5f; + } + + static public float QuarticIn(float t) + { + return Mathf.Pow(t, 4); + } + + static public float QuarticOut(float t) + { + return 1.0f - Mathf.Pow(1.0f - t, 4); + } + + static public float QuarticInOut(float t) + { + return (t < 0.5f) ? Mathf.Pow(t * 2.0f, 4) * 0.5f : 1.0f - Mathf.Pow((1.0f - t) * 2.0f, 4) * 0.5f; + } + + static public float QuinticIn(float t) + { + return Mathf.Pow(t, 5); + } + + static public float QuinticOut(float t) + { + return 1.0f - Mathf.Pow(1.0f - t, 5); + } + + static public float QuinticInOut(float t) + { + return (t < 0.5f) ? Mathf.Pow(t * 2.0f, 5) * 0.5f : 1.0f - Mathf.Pow((1.0f - t) * 2.0f, 5) * 0.5f; + } + + static public float CircularIn(float t) + { + return 1.0f - Mathf.Sqrt(1.0f - (t * t)); + } + + static public float CircularOut(float t) + { + return Mathf.Sqrt((2.0f - t) * t); + } + + static public float CircularInOut(float t) + { + return (t < 0.5f) ? (1.0f - Mathf.Sqrt(1.0f - 4.0f * (t * t ))) * 0.5f : (Mathf.Sqrt(-((t * 2.0f) - 3.0f) * ((t * 2.0f) - 1.0f)) + 1.0f) * 0.5f; + } + + static public float ExpoIn(float t) + { + return (t == 0.0f) ? 0.0f : Mathf.Pow(2, 10.0f * (t - 1.0f)); + } + + static public float ExpoOut(float t) + { + return (t == 1.0f) ? 1.0f : 1.0f - Mathf.Pow(2, -10.0f * t); + } + + static public float ExpoInOut(float t) + { + if (t == 0.0f || t == 1.0f) return t; + + t = t * 2.0f; + if (t < 1.0f) + { + return Mathf.Pow(1024.0f, t - 1.0f) * 0.5f; + } + + return (-Mathf.Pow(2.0f, -10.0f * (t - 1.0f)) + 2.0f) * 0.5f; + } + + static public float BackIn(float t) + { + float s = 1.70158f; + + return t * t * ((s + 1.0f) * t - s); + } + + static public float BackOut(float t) + { + float s = 1.70158f; + + t = (t - 1.0f); + return t * t * ((s + 1.0f) * t + s) + 1.0f; + } + + static public float BackInOut(float t) + { + float s = 1.70158f * 1.525f; + + t = t * 2.0f; + if (t < 1.0f) + { + return (t * t * ((s + 1.0f) * t - s)) * 0.5f; + } + + t = t - 2.0f; + return (t * t * ((s + 1.0f) * t + s) + 2.0f) * 0.5f; + } + + static public float BounceIn(float t) + { + return 1.0f - BounceOut(1.0f - t); + } + + static public float BounceOut(float t) + { + if (t < (1.0f / 2.75f)) return 7.5625f * t * t; + else if (t < (2.0f / 2.75f)) return 7.5625f * (t -= (1.5f / 2.75f)) * t + 0.75f; + else if (t < (2.5f / 2.75f)) return 7.5625f * (t -= (2.25f / 2.75f)) * t + 0.9375f; + + return 7.5625f * (t -= (2.625f / 2.75f)) * t + 0.984375f; + } + + static public float BounceInOut(float t) + { + if (t < 0.5f) return BounceIn(t * 2.0f) * 0.5f; + + return BounceOut(t * 2.0f - 1.0f) * 0.5f + 0.5f; + } + + static public float ElasticIn(float t) + { + if (t == 0.0f || t == 1.0f) return t; + + return -Mathf.Pow(2.0f, 10.0f * (t - 1.0f)) * Mathf.Sin((t - 1.1f) * 5.0f * Mathf.PI); + } + + static public float ElasticOut(float t) + { + if (t == 0.0f || t == 1.0f) return t; + + return Mathf.Pow(2.0f, -10.0f * t) * Mathf.Sin((t - 0.1f) * 5.0f * Mathf.PI) + 1.0f; + } + + static public float ElasticInOut(float t) + { + if (t == 0.0f || t == 1.0f) return t; + + t = t * 2.0f; + if (t < 1.0f) + { + return Mathf.Pow(2, 10.0f * (t - 1)) * Mathf.Sin((t - 1.1f) * 5.0f * Mathf.PI) * -0.5f; + } + + return (Mathf.Pow(2.0f, -10.0f * (t - 1)) * Mathf.Sin((t - 1.1f) * 5.0f * Mathf.PI) * 0.5f) + 1.0f; + } + + static public float CatmullRom(float t, float p0, float p1, float p2, float p3) + { + return 0.5f * ((2.0f * p1) + (-p0 + p2) * t + (2.0f * p0 - 5.0f * p1 + 4.0f * p2 - p3) * t * t + (-p0 + 3.0f * p1 - 3.0f * p2 + p3) * t * t * t); + } +} From 2feb99004b2a9a734c75ddbfb80afd65647b320c Mon Sep 17 00:00:00 2001 From: mika Date: Sat, 21 Sep 2019 10:18:29 +0300 Subject: [PATCH 135/231] Create VerticalCameraDistanceFade.shader --- .../3D/Fade/VerticalCameraDistanceFade.shader | 127 ++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 Assets/Shaders/3D/Fade/VerticalCameraDistanceFade.shader diff --git a/Assets/Shaders/3D/Fade/VerticalCameraDistanceFade.shader b/Assets/Shaders/3D/Fade/VerticalCameraDistanceFade.shader new file mode 100644 index 0000000..822bf7c --- /dev/null +++ b/Assets/Shaders/3D/Fade/VerticalCameraDistanceFade.shader @@ -0,0 +1,127 @@ +// similar to height fog effect, but starts fading from camera.Y distance (with some offset) +// modified standard shader, with custom lighting pass to make faded part completely black + +Shader "UnityLibrary/Standard/Fade/VerticalCameraDistance" +{ + Properties + { + _Color("Color", Color) = (1,1,1,1) + _MainTex("Albedo (RGB)", 2D) = "white" {} + //_BumpMap("Normalmap", 2D) = "bump" {} + _Glossiness("Smoothness", Range(0,1)) = 0.5 + _Metallic("Metallic", Range(0,1)) = 0.0 + _FadeToColor("FadeToColor", Color) = (0,0,0,1) + _FadeStartY("FadeStartFromCameraY", Float) = -2 + _FadeEndY("FadeEndFromCameraY", Float) = -4 + } + + SubShader + { + Tags { "RenderType" = "Opaque" } + LOD 200 + + CGPROGRAM + +// #pragma surface surf Standard fullforwardshadows vertex:vert + #pragma surface surf Custom fullforwardshadows // vertex:vert + #include "UnityPBSLighting.cginc" + + struct appdata { + float4 vertex : POSITION; + float4 tangent : TANGENT; + float3 normal : NORMAL; + float2 texcoord : TEXCOORD0; + float2 texcoord1 : TEXCOORD1; + float2 texcoord2 : TEXCOORD2; + }; + + struct Input { + float2 uv_MainTex; + //float2 uv_BumpMap; + float3 worldPos; + }; + + // Metallic workflow + // modified from UnityPBSLighting.cginc + struct SurfaceOutputStandardCustom + { + fixed3 Albedo; // base (diffuse or specular) color + float3 Normal; // tangent space normal, if written + half3 Emission; + half Metallic; // 0=non-metal, 1=metal + half Smoothness; // 0=rough, 1=smooth + half Occlusion; // occlusion (default 1) + fixed Alpha; // alpha for transparencies + float Fader; // test + }; + + sampler2D _MainTex; + //sampler2D _BumpMap; + + half _Glossiness; + half _Metallic; + fixed4 _Color; + fixed4 _FadeToColor; + float _FadeStartY; + float _FadeEndY; + + float remap(float source, float sourceFrom, float sourceTo, float targetFrom, float targetTo) + { + return targetFrom + (source - sourceFrom)*(targetTo - targetFrom) / (sourceTo - sourceFrom); + } + + // from UnityPBSLighting.cginc + inline half4 LightingCustom(SurfaceOutputStandardCustom s, float3 viewDir, UnityGI gi) + { + s.Normal = normalize(s.Normal); + + half oneMinusReflectivity; + half3 specColor; + s.Albedo = DiffuseAndSpecularFromMetallic(s.Albedo, s.Metallic, /*out*/ specColor, /*out*/ oneMinusReflectivity); + + // shader relies on pre-multiply alpha-blend (_SrcBlend = One, _DstBlend = OneMinusSrcAlpha) + // this is necessary to handle transparency in physically correct way - only diffuse component gets affected by alpha + half outputAlpha; + s.Albedo = PreMultiplyAlpha(s.Albedo, s.Alpha, oneMinusReflectivity, /*out*/ outputAlpha); + + half4 c = UNITY_BRDF_PBS(s.Albedo, specColor, oneMinusReflectivity, s.Smoothness, s.Normal, viewDir, gi.light, gi.indirect); + c.a = outputAlpha; + + // make it black if outside range + return c*(1 - s.Fader); + } + + inline void LightingCustom_GI(SurfaceOutputStandardCustom s,UnityGIInput data,inout UnityGI gi) + { + #if defined(UNITY_PASS_DEFERRED) && UNITY_ENABLE_REFLECTION_BUFFERS + gi = UnityGlobalIllumination(data, s.Occlusion, s.Normal); + #else + Unity_GlossyEnvironmentData g = UnityGlossyEnvironmentSetup(s.Smoothness, data.worldViewDir, s.Normal, lerp(unity_ColorSpaceDielectricSpec.rgb, s.Albedo, s.Metallic)); + gi = UnityGlobalIllumination(data, s.Occlusion, s.Normal, g); + #endif + } + + void surf(Input IN, inout SurfaceOutputStandardCustom o) + { + fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color; + + // fade + float fadeStartY = _WorldSpaceCameraPos.y + _FadeStartY; + float fadeEndY = _WorldSpaceCameraPos.y + _FadeEndY; + float pixelY = clamp(IN.worldPos.y, fadeEndY, fadeStartY); + float distanceY = remap(pixelY, fadeStartY, fadeEndY, 0, 1); + c.rgb = lerp(c.rgb, _FadeToColor, distanceY); + + o.Fader = distanceY; + o.Albedo = c.rgb; + // Metallic and smoothness come from slider variables + o.Metallic = _Metallic; + o.Smoothness = _Glossiness; + //o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap)); + o.Alpha = c.a; + + } + ENDCG + } + FallBack "Diffuse" +} From f22e6caf9a46e3ec600273ac853d3b03db31a153 Mon Sep 17 00:00:00 2001 From: mika Date: Mon, 30 Sep 2019 19:03:59 +0300 Subject: [PATCH 136/231] rename Fade folder to Effects, add seethrough wall shader --- .../Effects/Standard-SeeThroughWalls.shader | 116 ++++++++++++++++++ .../VerticalCameraDistanceFade.shader | 2 +- 2 files changed, 117 insertions(+), 1 deletion(-) create mode 100644 Assets/Shaders/3D/Effects/Standard-SeeThroughWalls.shader rename Assets/Shaders/3D/{Fade => Effects}/VerticalCameraDistanceFade.shader (98%) diff --git a/Assets/Shaders/3D/Effects/Standard-SeeThroughWalls.shader b/Assets/Shaders/3D/Effects/Standard-SeeThroughWalls.shader new file mode 100644 index 0000000..e519887 --- /dev/null +++ b/Assets/Shaders/3D/Effects/Standard-SeeThroughWalls.shader @@ -0,0 +1,116 @@ +// 2 pass shader to draw object with blurry texture and slightly transparent when behind walls + +Shader "UnityLibrary/Standard/Effects/SeeThroughWalls" +{ + Properties + { + _Color("Color", Color) = (1,1,1,1) + _MainTex("Albedo (RGB)", 2D) = "white" {} + _Glossiness("Smoothness", Range(0,1)) = 0.5 + _Metallic("Metallic", Range(0,1)) = 0.0 + _BlurSize("BlurSize", float) = 10 + _SeeThroughOpacity("SeeThroughOpacityAdjust", Range(0,1)) = 0.5 + } + + SubShader + { + // Regular Pass + Tags { "RenderType" = "Opaque" } + LOD 200 + + CGPROGRAM + // Physically based Standard lighting model, and enable shadows on all light types + #pragma surface surf Standard fullforwardshadows + + // Use shader model 3.0 target, to get nicer looking lighting + #pragma target 3.0 + + sampler2D _MainTex; + + struct Input + { + float2 uv_MainTex; + }; + + half _Glossiness; + half _Metallic; + fixed4 _Color; + + // Add instancing support for this shader. You need to check 'Enable Instancing' on materials that use the shader. + // See https://docs.unity3d.com/Manual/GPUInstancing.html for more information about instancing. + // #pragma instancing_options assumeuniformscaling + UNITY_INSTANCING_BUFFER_START(Props) + // put more per-instance properties here + UNITY_INSTANCING_BUFFER_END(Props) + + void surf(Input IN, inout SurfaceOutputStandard o) + { + // Albedo comes from a texture tinted by color + fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color; + o.Albedo = c.rgb; + // Metallic and smoothness come from slider variables + o.Metallic = _Metallic; + o.Smoothness = _Glossiness; + o.Alpha = c.a; + } + ENDCG + + // see through pass + + Tags{ "Queue" = "Transparent" "RenderType" = "Transparent" } + LOD 200 +// Blend OneMinusDstColor One // Soft Additive + Blend SrcAlpha OneMinusSrcAlpha // Traditional transparency +// Blend One OneMinusSrcAlpha // Premultiplied transparency +// Blend One One // Additive +// Blend OneMinusDstColor One // Soft Additive +// Blend DstColor Zero // Multiplicative +// Blend DstColor SrcColor // 2x Multiplicative + + ZWrite Off + ZTest Greater + + CGPROGRAM + // Physically based Standard lighting model, and enable shadows on all light types + #pragma surface surf Standard alpha:fade + + // Use shader model 3.0 target, to get nicer looking lighting + #pragma target 3.0 + + sampler2D _MainTex; + float4 _MainTex_TexelSize; + float _BlurSize; + float _SeeThroughOpacity; + + struct Input + { + float2 uv_MainTex; + }; + + half _Glossiness; + half _Metallic; + fixed4 _Color; + + UNITY_INSTANCING_BUFFER_START(Props) + // put more per-instance properties here + UNITY_INSTANCING_BUFFER_END(Props) + + void surf(Input IN, inout SurfaceOutputStandard o) + { + // small blur effect on the texture + fixed4 cR = tex2D(_MainTex, float2(IN.uv_MainTex.x + _MainTex_TexelSize.x * _BlurSize,IN.uv_MainTex.y)); + fixed4 cL = tex2D(_MainTex, float2(IN.uv_MainTex.x - _MainTex_TexelSize.x * _BlurSize,IN.uv_MainTex.y)); + fixed4 cT = tex2D(_MainTex, float2(IN.uv_MainTex.x,IN.uv_MainTex.y + _MainTex_TexelSize.y * _BlurSize)); + fixed4 cB = tex2D(_MainTex, float2(IN.uv_MainTex.x,IN.uv_MainTex.y - _MainTex_TexelSize.y * _BlurSize)); + fixed4 c = (cR + cL + cT + cB) * 0.25; + o.Albedo = c; + o.Metallic = _Metallic; + o.Smoothness = _Glossiness; + // make object also bit transparent + o.Alpha = c.a* _SeeThroughOpacity; + } + ENDCG + + } // subshader + FallBack "Diffuse" +} // shader diff --git a/Assets/Shaders/3D/Fade/VerticalCameraDistanceFade.shader b/Assets/Shaders/3D/Effects/VerticalCameraDistanceFade.shader similarity index 98% rename from Assets/Shaders/3D/Fade/VerticalCameraDistanceFade.shader rename to Assets/Shaders/3D/Effects/VerticalCameraDistanceFade.shader index 822bf7c..6b8dbb7 100644 --- a/Assets/Shaders/3D/Fade/VerticalCameraDistanceFade.shader +++ b/Assets/Shaders/3D/Effects/VerticalCameraDistanceFade.shader @@ -1,7 +1,7 @@ // similar to height fog effect, but starts fading from camera.Y distance (with some offset) // modified standard shader, with custom lighting pass to make faded part completely black -Shader "UnityLibrary/Standard/Fade/VerticalCameraDistance" +Shader "UnityLibrary/Standard/Effects/VerticalCameraDistance" { Properties { From 8727b14e2b38307fb89f48e688d93ec16f7c6276 Mon Sep 17 00:00:00 2001 From: mika Date: Tue, 1 Oct 2019 17:12:14 +0300 Subject: [PATCH 137/231] Create RayMarching.shader --- Assets/Shaders/2D/Special/RayMarching.shader | 108 +++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 Assets/Shaders/2D/Special/RayMarching.shader diff --git a/Assets/Shaders/2D/Special/RayMarching.shader b/Assets/Shaders/2D/Special/RayMarching.shader new file mode 100644 index 0000000..fa70a89 --- /dev/null +++ b/Assets/Shaders/2D/Special/RayMarching.shader @@ -0,0 +1,108 @@ +// "ShaderToy Tutorial - Ray Marching for Dummies!" https://www.shadertoy.com/view/XlGBW3 +// by Martijn Steinrucken aka BigWings/CountFrolic - 2018 +// License Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License. +// This shader is part of a tutorial on YouTube https://youtu.be/PGtv-dBi2wE +// 01-10-2019 converted to unity shader (with some adjusted variable names) : unitycoder.com + +Shader "UnityLibrary/2D/Special/RayMarching" +{ + SubShader + { + Tags { "RenderType"="Opaque" } + LOD 100 + + Pass + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + #define MAX_STEPS 100 // maximum raycast loops + #define MAX_DIST 100. // ray cannot go further than this distance + #define SURF_DIST .01 // how near to surface we should raycast to + + struct appdata + { + float4 vertex : POSITION; + float2 uv : TEXCOORD0; + }; + + struct v2f + { + float4 vertex : SV_POSITION; + float2 uv : TEXCOORD0; + }; + + // returns distance to the scene objects (we have 2 objects here, sphere and ground plane) + float GetDist(float3 p) + { + float4 sphere = float4(0, 1, 6, 1); // x,y,z,radius + float sphereDist = length(p - sphere.xyz) - sphere.w; + float planeDist = p.y; + float distance = min(sphereDist, planeDist); // return closest distance + return distance; + } + + + // jump along the ray until we get close enough to some of our objects + float RayMarch(float3 rayOrigin, float3 rayDirection) + { + float distanceOrigin = 0.; + for (int i = 0; i < MAX_STEPS; i++) + { + float3 p = rayOrigin + rayDirection * distanceOrigin; + float dS = GetDist(p); + distanceOrigin += dS; + if (distanceOrigin > MAX_DIST || dS < SURF_DIST) break; + } + return distanceOrigin; + } + + float3 GetNormal(float3 p) + { + float d = GetDist(p); + float2 e = float2(.01, 0); + float3 n = d - float3(GetDist(p - e.xyy),GetDist(p - e.yxy),GetDist(p - e.yyx)); + return normalize(n); + } + + float GetLight(float3 p) + { + float3 lightPos = float3(0, 5, 6); + lightPos.xz += float2(sin(_Time.y), cos(_Time.y)) * 2.0; + float3 l = normalize(lightPos - p); + float3 n = GetNormal(p); + float dif = clamp(dot(n, l), 0.0, 1.0); + float d = RayMarch(p + n * SURF_DIST * 2.0, l); + if (d < length(lightPos - p)) dif *= 0.1; + return dif; + } + + v2f vert (appdata v) + { + v2f o; + o.vertex = UnityObjectToClipPos(v.vertex); + o.uv = v.uv; + return o; + } + + fixed4 frag(v2f i) : SV_Target + { + float2 uv = (i.uv - 0.5); + float3 col = float3(0,0,0); + + float3 rayOrigin = float3(0,1,0); + float3 rayDirection = normalize(float3(uv.x, uv.y, 1)); + + float distance = RayMarch(rayOrigin, rayDirection); + float3 p = rayOrigin + rayDirection * distance; + + float dif = GetLight(p); + col = float3(dif,dif,dif); + + return float4(col,1); + } + ENDCG + } // pass + } // subshader +} // shader From af94bc209bbdd1d8449a98f74d21b78ea13da468 Mon Sep 17 00:00:00 2001 From: Abhilash Majumder <30946547+abhilash1910@users.noreply.github.com> Date: Mon, 14 Oct 2019 21:39:12 +0530 Subject: [PATCH 138/231] Reverse Disintegration effect by Reverse transparency The unlit shader when use along with particle effects produces a Reverse disintegration effect using transparency . --- .../3D/Unlit/Reverse-DisIntegrate-Shader | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 Assets/Shaders/3D/Unlit/Reverse-DisIntegrate-Shader diff --git a/Assets/Shaders/3D/Unlit/Reverse-DisIntegrate-Shader b/Assets/Shaders/3D/Unlit/Reverse-DisIntegrate-Shader new file mode 100644 index 0000000..6bcbf0e --- /dev/null +++ b/Assets/Shaders/3D/Unlit/Reverse-DisIntegrate-Shader @@ -0,0 +1,76 @@ +Shader "Unlit/Reverse_Disintegrate" +{ + Properties + { + _MainTex ("Texture", 2D) = "white" {} + _color("Color",color)=(1,1,1,1) + _Transparent("Transparency",float)=0.0 + + } + SubShader + { + Tags {"Queue"="Transparent" "RenderType"="Transparent"} + LOD 100 + ZWrite Off + Blend SrcAlpha OneMinusSrcAlpha + + Lighting Off + ColorMask RGB + + + Pass + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + // make fog work + #pragma multi_compile_fog + + #include "UnityCG.cginc" + + struct appdata + { + float4 vertex : POSITION; + float2 uv : TEXCOORD0; + }; + +sampler2D _MainTex; +float4 _color; +float _Transparent; + struct v2f + { + float2 uv : TEXCOORD0; + UNITY_FOG_COORDS(1) + float4 vertex : SV_POSITION; + }; + + + v2f vert (appdata v) + { + v2f o; + o.vertex = UnityObjectToClipPos(v.vertex); + o.uv = v.uv; + UNITY_TRANSFER_FOG(o,o.vertex); + return o; + } + + fixed4 frag (v2f i) : SV_Target + { + // sample the texture + fixed4 col = tex2D(_MainTex, i.uv)*_color ; + + + _Transparent=_Transparent*(_Time.y*5000); + if(_Transparent<8) + { + col.a=_Transparent; + } + + // apply fog + UNITY_APPLY_FOG(i.fogCoord, col); + return col; + } + ENDCG + } + } +} From a98a9cee3b0f3b5d58add92f2cc01a9a3a88481e Mon Sep 17 00:00:00 2001 From: mika Date: Sat, 28 Dec 2019 18:21:07 +0200 Subject: [PATCH 139/231] Create MarrtsSmoothedMouseLook.cs --- .../Scripts/Camera/MarrtsSmoothedMouseLook.cs | 208 ++++++++++++++++++ 1 file changed, 208 insertions(+) create mode 100644 Assets/Scripts/Camera/MarrtsSmoothedMouseLook.cs diff --git a/Assets/Scripts/Camera/MarrtsSmoothedMouseLook.cs b/Assets/Scripts/Camera/MarrtsSmoothedMouseLook.cs new file mode 100644 index 0000000..c10daf6 --- /dev/null +++ b/Assets/Scripts/Camera/MarrtsSmoothedMouseLook.cs @@ -0,0 +1,208 @@ +using UnityEngine; + +//Marrt's simplest Mouselook for https://forum.unity.com/threads/a-free-simple-smooth-mouselook.73117/page-2#post-4652755 + +namespace UnityLibrary +{ + public class MarrtsSmoothedMouseLook : MonoBehaviour + { + [Header("CameraTransform")] + public Transform targetTrans; + [Header("On/Off & Settings")] + public bool inputActive = true; + public bool controlCursor = false; + [Header("Smoothing")] + public bool byPassSmoothing = false; + public float mLambda = 20F; //higher = less latency but also less smoothing + [Header("Sensitivity")] + public float hSens = 4F; + public float vSens = 4F; + public BufferV2 mouseBuffer = new BufferV2(); + + public enum AxisClampMode { None, Hard, Soft } + + [Header("Restricting Look")] + + public AxisClampMode pitchClamp = AxisClampMode.Soft; + [Range(-180F,180F)] public float pMin = -80F; + [Range(-180F,180F)] public float pMax = 80F; + + + [Header("Yaw should be left None, Message me if you really need this functionality")] + + public AxisClampMode yawClamp = AxisClampMode.None; + [Range(-180F,180F)] public float yMin = -140F; + [Range(-180F,180F)] public float yMax = 140F; + + + + //public bool smoothingDependence = Timescale Framerate + + void Update () + { + //if(Input.GetKeyDown(KeyCode.Space)){inputActive = !inputActive;} + if(controlCursor){ //Cursor Control + if( inputActive && Cursor.lockState != CursorLockMode.Locked) { Cursor.lockState = CursorLockMode.Locked; } + if( !inputActive && Cursor.lockState != CursorLockMode.None) { Cursor.lockState = CursorLockMode.None; } + } + if(!inputActive){ return; } //active? + + //Update input + UpdateMouseBuffer(); + targetTrans.rotation = Quaternion.Euler( mouseBuffer.curAbs ); + } + + //consider late Update for applying the rotation if your game needs it (e.g. if camera parents are rotated in Update for some reason) + void LateUpdate() {} + + private void UpdateMouseBuffer() + { + + float rawPitchDelta = vSens * -Input.GetAxisRaw("Mouse Y"); + + switch(pitchClamp){ + case AxisClampMode.None: mouseBuffer.target.x += rawPitchDelta; break; + case AxisClampMode.Hard: mouseBuffer.target.x = Mathf.Clamp(mouseBuffer.target.x +rawPitchDelta, pMin, pMax); break; + case AxisClampMode.Soft: mouseBuffer.target.x += SoftPitchClamping.DeltaMod( mouseBuffer.target.x, rawPitchDelta, Mathf.Abs(pMax*0.5F), Mathf.Abs(pMax) ); break; //symetric clamping only for now, max is used + } + + float rawYawDelta = hSens * Input.GetAxisRaw("Mouse X"); + + switch(yawClamp){ + case AxisClampMode.None: mouseBuffer.target.y += rawYawDelta; break; + case AxisClampMode.Hard: mouseBuffer.target.y = Mathf.Clamp(mouseBuffer.target.y +rawYawDelta, yMin, yMax); break; + case AxisClampMode.Soft: Debug.LogWarning("SoftYaw clamp should be implemented with Quaternions to work in every situation"); + mouseBuffer.target.y += SoftPitchClamping.DeltaMod( mouseBuffer.target.y, rawYawDelta, Mathf.Abs(yMax*0.5F), Mathf.Abs(yMax) ); + break; + } + + mouseBuffer.Update( mLambda, Time.deltaTime, byPassSmoothing ); + } + } + + + + + + #region Helpers + [System.Serializable] + public class BufferV2{ + + public BufferV2(){ + this.target = Vector2.zero; + this.buffer = Vector2.zero; + } + public BufferV2( Vector2 targetInit, Vector2 bufferInit ) { + this.target = targetInit; + this.buffer = bufferInit; + } + + /*private*/public Vector2 target; + /*private*/public Vector2 buffer; + + public Vector2 curDelta; //Delta: apply difference from lastBuffer state to current BufferState //get difference between last and new buffer + public Vector2 curAbs; //absolute + + + + /// Update Buffer By supplying new target + public void UpdateByNewTarget( Vector2 newTarget, float dampLambda, float deltaTime ){ + this.target = newTarget; + Update(dampLambda, deltaTime); + } + /// Update Buffer By supplying the rawDelta to the last target + public void UpdateByDelta( Vector2 rawDelta, float dampLambda, float deltaTime ){ + this.target = this.target +rawDelta; //update Target + Update(dampLambda, deltaTime); + } + + /// Update Buffer + public void Update( float dampLambda, float deltaTime, bool byPass = false ){ + Vector2 last = buffer; //last state of Buffer + this.buffer = byPass? target : DampToTargetLambda( buffer, this.target, dampLambda, deltaTime); //damp current to target + this.curDelta = buffer -last; + this.curAbs = buffer; + } + public static Vector2 DampToTargetLambda( Vector2 current, Vector2 target, float lambda, float dt){ + return Vector2. Lerp(current, target, 1F -Mathf.Exp( -lambda *dt) ); + } + } + + + + + public static class SoftPitchClamping{ + public static float DeltaMod( float currentPitch, float delta, float softMax = 45F, float hardMax = 85F ){ + + //doesnt work for input above 90F pitch, unity might invert roll and decrease pitch again + + //transform into -180 to 180 range (allowed input range = 0-360F ) + float wrapped = Wrap.Float( currentPitch, -180F, 180F ); + + float sign = Mathf.Sign( wrapped ); + float absolute = Mathf.Abs ( wrapped ); + + // treat current as mapped value, so unmap it via reversing + // https://rechneronline.de/function-graphs/ + // revert remap: e^((((log(x/45)+1)*45)/45)-1)*45 + // remap: (log(x/45)+1)*45 + + float remapped = absolute; + if( absolute > softMax ){ + // e^ (( (( log( x/45 )+1 )*45 ) /45 ) -1 )*45 + // remapped = Mathf.Exp(( (( Mathf.Log(remapped/softMax)+1F )*softMax ) /softMax) -1F)*softMax ; + remapped = Mathf.Exp(( remapped /softMax) -1F)*softMax ; + //x*0.5+45*0.5 + } + + //apply delta to unmapped, sign needs to be taken into consideration for delta + remapped += (delta *sign); //float raw = remapped +(delta *sign); + + //remap, only needed if exceeding softrange + if( remapped > softMax ){ + // (( log( x/45 )+1 )*45 ) + remapped = (( Mathf.Log(remapped/softMax)+1F )*softMax ); + + //x*0.5+45*0.5 + + } + + remapped *= sign; + remapped = Mathf.Clamp( remapped, -hardMax, +hardMax); + + float newDelta = ( remapped -wrapped ); + + //print( "wrapped\t"+wrapped+" (from:"+currentPitch+")"+"\nremapped\t"+remapped +" (raw :"+raw+")"); + + return newDelta; + // return delta; + } + + public static class Wrap{ + + //can be used to clamp angles from 0-360 to 0-180 by feeding (value,-180,180) + //https://stackoverflow.com/questions/1628386/normalise-orientation-between-0-and-360 + + //Normalizes any number to an arbitrary range + //by assuming the range wraps around when going below min or above max + public static float Float( float value, float start, float end ){ + float width = end - start ; // + float offsetValue = value - start ; // value relative to 0 + + return ( offsetValue - ( Mathf.Floor( offsetValue / width ) * width ) ) + start ; + // + start to reset back to start of original range + } + + //Normalizes any number to an arbitrary range + //by assuming the range wraps around when going below min or above max + public static int Int( int value, int start, int end ){ + int width = end - start ; // + int offsetValue = value - start ; // value relative to 0 + + return ( offsetValue - ( ( offsetValue / width ) * width ) ) + start ; + // + start to reset back to start of original range + } + } + } + #endregion Helpers +} From 27fac36a6e8e1a5b9ceeec6e725cde9bf01822e0 Mon Sep 17 00:00:00 2001 From: mika Date: Thu, 13 Feb 2020 10:38:43 +0200 Subject: [PATCH 140/231] Create WaterBox.shader --- Assets/Shaders/3D/Water/WaterBox.shader | 89 +++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 Assets/Shaders/3D/Water/WaterBox.shader diff --git a/Assets/Shaders/3D/Water/WaterBox.shader b/Assets/Shaders/3D/Water/WaterBox.shader new file mode 100644 index 0000000..ce38468 --- /dev/null +++ b/Assets/Shaders/3D/Water/WaterBox.shader @@ -0,0 +1,89 @@ +// water waves on a single mesh box +// single mesh approach. It's a single 64x64x1 unit box with 128x128 divisions. +// The shader is checking if the starting y for the vertex is >0.5 before it modifies the position, +// and checking the normal is facing up before modifying that +// source: @bgolus https://forum.unity.com/threads/intersect-box-with-wave-plane.826761/#post-5475174 + +Shader "Custom/WaterBox" +{ + Properties + { + _Color ("Color", Color) = (1,1,1,1) + _Color2 ("Color 2", Color) = (1,1,1,1) + _Glossiness ("Smoothness", Range(0,1)) = 0.5 + } + SubShader + { + Tags { "Queue"="Transparent" "RenderType"="Transparent" } + LOD 200 + + CGINCLUDE + struct Input + { + float h; + }; + + half _Glossiness; + fixed4 _Color, _Color2; + + void waves(inout appdata_full v, inout Input IN) + { + IN.h = 0.0; + + float s0x, c0x, s1x, c1x; + float s0y, c0y, s1y, c1y; + sincos(v.vertex.x * 0.6 + _Time.y + v.vertex.z * 0.1, s0x, c0x); + sincos(v.vertex.z * 0.5 + _Time.y * 2.0 + v.vertex.x * 0.1, s0y, c0y); + sincos(v.vertex.x * 0.3 + _Time.y - v.vertex.z * 0.1, s1x, c1x); + sincos(v.vertex.z * 0.21 + _Time.y * 2.0 - v.vertex.x * 0.1, s1y, c1y); + + float offset = (s0x + s0y) * 0.15 + (s1x + s1y) * 1.0 + 1.5; + if (v.vertex.y > 0.5) + { + v.vertex.y += offset; + IN.h = 0.0; + if (v.normal.y > 0.7) + { + v.normal = normalize(v.normal + float3(c0y * 0.15 + c1y * 0.3, 0.0, c0x * 0.15 + c1x * 0.3)); + } + } + else + { + IN.h = offset + 1.0; + } + } + + void surf (Input IN, inout SurfaceOutputStandard o) + { + fixed4 color = lerp(_Color2, _Color, smoothstep(1.5, 0.0, pow(IN.h, 0.5))); + o.Albedo = color.rgb; + o.Metallic = 0; + o.Smoothness = _Glossiness; + o.Alpha = color.a; + } + ENDCG + + Cull Front + CGPROGRAM + #pragma surface surf Standard alpha:premul vertex:vert + #pragma target 3.0 + + void vert(inout appdata_full v, out Input IN) + { + waves(v, IN); + v.normal = -v.normal; + } + ENDCG + + Cull Back + CGPROGRAM + #pragma surface surf Standard alpha:premul vertex:vert + #pragma target 3.0 + + void vert(inout appdata_full v, out Input IN) + { + waves(v, IN); + } + ENDCG + } +} From 445ced13d4f655be74047b59ee6f389b40ef16a7 Mon Sep 17 00:00:00 2001 From: mika Date: Thu, 13 Feb 2020 14:08:00 +0200 Subject: [PATCH 141/231] Create ReferenceImageViewer.cs --- .../Editor/Tools/ReferenceImageViewer.cs | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 Assets/Scripts/Editor/Tools/ReferenceImageViewer.cs diff --git a/Assets/Scripts/Editor/Tools/ReferenceImageViewer.cs b/Assets/Scripts/Editor/Tools/ReferenceImageViewer.cs new file mode 100644 index 0000000..d61518e --- /dev/null +++ b/Assets/Scripts/Editor/Tools/ReferenceImageViewer.cs @@ -0,0 +1,61 @@ +// simple image viewer inside unity editor +// use case: to keep reference image visible while working in single monitor + +using UnityEngine; +using UnityEditor; + +namespace UnityLibrary +{ + public class ReferenceImageViewer : EditorWindow + { + Texture2D tex; + bool keepAspectRatio = false; + + [MenuItem("Window/Tools/Reference Image Viewer")] + static void Init() + { + ReferenceImageViewer window = (ReferenceImageViewer)EditorWindow.GetWindow(typeof(ReferenceImageViewer)); + window.titleContent = new GUIContent("ReferenceImageViewer"); + window.Show(); + } + + void OnGUI() + { + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Image", GUILayout.Width(50)); + tex = (Texture2D)EditorGUILayout.ObjectField(tex, typeof(Texture2D), true, GUILayout.MinWidth(100)); + GUILayout.FlexibleSpace(); + keepAspectRatio = EditorGUILayout.ToggleLeft("KeepAspect", keepAspectRatio); + EditorGUILayout.EndHorizontal(); + + if (tex != null) + { + int topOffset = 20; + + // prep + var maxWidth = position.width; + var maxHeight = position.height - topOffset; + var imgWidth = (float)tex.width; + var imgHeight = (float)tex.height; + + // calc + var widthRatio = maxWidth / imgWidth; + var heightRatio = maxHeight / imgHeight; + var bestRatio = Mathf.Min(widthRatio, heightRatio); + + // output + var newWidth = imgWidth * bestRatio; + var newHeight = imgHeight * bestRatio; + + if (keepAspectRatio == true) + { + EditorGUI.DrawPreviewTexture(new Rect(0, topOffset, newWidth, newHeight), tex); + } + else + { + EditorGUI.DrawPreviewTexture(new Rect(0, topOffset, maxWidth, maxHeight), tex); + } + } + } + } +} From c4c8235d717b410a70da527b207b0730311ec0ca Mon Sep 17 00:00:00 2001 From: Eli Davis Date: Mon, 17 Feb 2020 13:46:33 -0600 Subject: [PATCH 142/231] Fix Triangle Count sharedMesh.triangles returns an array of integers that are actually triplets of indices that references different vertices of the mesh. Therefore the total tri count would be the length of the array divided by 3. --- Assets/Scripts/Editor/Tools/GetSelectedMeshInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Assets/Scripts/Editor/Tools/GetSelectedMeshInfo.cs b/Assets/Scripts/Editor/Tools/GetSelectedMeshInfo.cs index 06aba89..ad4fc24 100644 --- a/Assets/Scripts/Editor/Tools/GetSelectedMeshInfo.cs +++ b/Assets/Scripts/Editor/Tools/GetSelectedMeshInfo.cs @@ -31,7 +31,7 @@ void OnGUI() for (int i = 0, length = meshes.Length; i < length; i++) { totalVertices += meshes[i].sharedMesh.vertexCount; - totalTris += meshes[i].sharedMesh.triangles.Length; + totalTris += meshes[i].sharedMesh.triangles.Length / 3; totalMeshes++; } From e8a5cdee06342cf58b7a2f03979c3c8aa6725125 Mon Sep 17 00:00:00 2001 From: mika Date: Sat, 22 Feb 2020 22:06:15 +0200 Subject: [PATCH 143/231] Create CreatePlane.cs --- Assets/Scripts/Editor/Mesh/CreatePlane.cs | 227 ++++++++++++++++++++++ 1 file changed, 227 insertions(+) create mode 100644 Assets/Scripts/Editor/Mesh/CreatePlane.cs diff --git a/Assets/Scripts/Editor/Mesh/CreatePlane.cs b/Assets/Scripts/Editor/Mesh/CreatePlane.cs new file mode 100644 index 0000000..f2633c1 --- /dev/null +++ b/Assets/Scripts/Editor/Mesh/CreatePlane.cs @@ -0,0 +1,227 @@ +// editor tools to create mesh plane with adjustable resolution +// original : http://wiki.unity3d.com/index.php?title=CreatePlane#C.23_-_CreatePlane.cs + +using UnityEngine; +using UnityEditor; +using System.Collections; + +namespace UnityLibrary +{ + public class CreatePlane : ScriptableWizard + { + + public enum Orientation + { + Horizontal, + Vertical + } + + public enum AnchorPoint + { + TopLeft, + TopHalf, + TopRight, + RightHalf, + BottomRight, + BottomHalf, + BottomLeft, + LeftHalf, + Center + } + + public int widthSegments = 1; + public int lengthSegments = 1; + public float width = 1.0f; + public float length = 1.0f; + public Orientation orientation = Orientation.Horizontal; + public AnchorPoint anchor = AnchorPoint.Center; + public bool addCollider = false; + public bool createAtOrigin = true; + public bool flipYZ = false; + public bool twoSided = false; + public string optionalName; + + static Camera cam; + static Camera lastUsedCam; + + + [MenuItem("GameObject/Create Other/Custom Plane...")] + static void CreateWizard() + { + cam = Camera.current; + // Hack because camera.current doesn't return editor camera if scene view doesn't have focus + if (!cam) + cam = lastUsedCam; + else + lastUsedCam = cam; + ScriptableWizard.DisplayWizard("Create Plane",typeof(CreatePlane)); + } + + + void OnWizardUpdate() + { + widthSegments = Mathf.Clamp(widthSegments, 1, 254); + lengthSegments = Mathf.Clamp(lengthSegments, 1, 254); + } + + + void OnWizardCreate() + { + GameObject plane = new GameObject(); + + if (!string.IsNullOrEmpty(optionalName)) + plane.name = optionalName; + else + plane.name = "Plane"; + + if (!createAtOrigin && cam) + plane.transform.position = cam.transform.position + cam.transform.forward*5.0f; + else + plane.transform.position = Vector3.zero; + + Vector2 anchorOffset; + string anchorId; + switch (anchor) + { + case AnchorPoint.TopLeft: + anchorOffset = new Vector2(-width/2.0f,length/2.0f); + anchorId = "TL"; + break; + case AnchorPoint.TopHalf: + anchorOffset = new Vector2(0.0f,length/2.0f); + anchorId = "TH"; + break; + case AnchorPoint.TopRight: + anchorOffset = new Vector2(width/2.0f,length/2.0f); + anchorId = "TR"; + break; + case AnchorPoint.RightHalf: + anchorOffset = new Vector2(width/2.0f,0.0f); + anchorId = "RH"; + break; + case AnchorPoint.BottomRight: + anchorOffset = new Vector2(width/2.0f,-length/2.0f); + anchorId = "BR"; + break; + case AnchorPoint.BottomHalf: + anchorOffset = new Vector2(0.0f,-length/2.0f); + anchorId = "BH"; + break; + case AnchorPoint.BottomLeft: + anchorOffset = new Vector2(-width/2.0f,-length/2.0f); + anchorId = "BL"; + break; + case AnchorPoint.LeftHalf: + anchorOffset = new Vector2(-width/2.0f,0.0f); + anchorId = "LH"; + break; + case AnchorPoint.Center: + default: + anchorOffset = Vector2.zero; + anchorId = "C"; + break; + } + + MeshFilter meshFilter = (MeshFilter)plane.AddComponent(typeof(MeshFilter)); + plane.AddComponent(typeof(MeshRenderer)); + + string planeAssetName = plane.name + widthSegments + "x" + lengthSegments + "W" + width + "L" + length + (orientation == Orientation.Horizontal? "H" : "V") + anchorId + ".asset"; + Mesh m = (Mesh)AssetDatabase.LoadAssetAtPath("Assets/Editor/" + planeAssetName,typeof(Mesh)); + + if (m == null) + { + m = new Mesh(); + m.name = plane.name; + + int hCount2 = widthSegments+1; + int vCount2 = lengthSegments+1; + int numTriangles = widthSegments * lengthSegments * 6; + if (twoSided) { + numTriangles *= 2; + } + int numVertices = hCount2 * vCount2; + + Vector3[] vertices = new Vector3[numVertices]; + Vector2[] uvs = new Vector2[numVertices]; + int[] triangles = new int[numTriangles]; + + int index = 0; + float uvFactorX = 1.0f/widthSegments; + float uvFactorY = 1.0f/lengthSegments; + float scaleX = width/widthSegments; + float scaleY = length/lengthSegments; + for (float y = 0.0f; y < vCount2; y++) + { + for (float x = 0.0f; x < hCount2; x++) + { + if (orientation == Orientation.Horizontal) + { + if (flipYZ) + { + vertices[index] = new Vector3(x*scaleX - width/2f - anchorOffset.x, y*scaleY - length/2f - anchorOffset.y, 0.0f); + }else{ + vertices[index] = new Vector3(x*scaleX - width/2f - anchorOffset.x, 0.0f, y*scaleY - length/2f - anchorOffset.y); + } + } + else + { + if (flipYZ) + { + vertices[index] = new Vector3(x*scaleX - width/2f - anchorOffset.x, 0.0f, y*scaleY - length/2f - anchorOffset.y); + }else{ + vertices[index] = new Vector3(x*scaleX - width/2f - anchorOffset.x, y*scaleY - length/2f - anchorOffset.y, 0.0f); + } + } + uvs[index++] = new Vector2(x*uvFactorX, y*uvFactorY); + } + } + + index = 0; + for (int y = 0; y < lengthSegments; y++) + { + for (int x = 0; x < widthSegments; x++) + { + triangles[index] = (y * hCount2) + x; + triangles[index+1] = ((y+1) * hCount2) + x; + triangles[index+2] = (y * hCount2) + x + 1; + + triangles[index+3] = ((y+1) * hCount2) + x; + triangles[index+4] = ((y+1) * hCount2) + x + 1; + triangles[index+5] = (y * hCount2) + x + 1; + index += 6; + } + if (twoSided) { + // Same tri vertices with order reversed, so normals point in the opposite direction + for (int x = 0; x < widthSegments; x++) + { + triangles[index] = (y * hCount2) + x; + triangles[index+1] = (y * hCount2) + x + 1; + triangles[index+2] = ((y+1) * hCount2) + x; + + triangles[index+3] = ((y+1) * hCount2) + x; + triangles[index+4] = (y * hCount2) + x + 1; + triangles[index+5] = ((y+1) * hCount2) + x + 1; + index += 6; + } + } + } + + m.vertices = vertices; + m.uv = uvs; + m.triangles = triangles; + m.RecalculateNormals(); + + AssetDatabase.CreateAsset(m, "Assets/Editor/" + planeAssetName); + AssetDatabase.SaveAssets(); + } + + meshFilter.sharedMesh = m; + m.RecalculateBounds(); + + if (addCollider) + plane.AddComponent(typeof(BoxCollider)); + + Selection.activeObject = plane; + } + } + } From 7a5919d441810d9307225c59d295f2f8a5e21b54 Mon Sep 17 00:00:00 2001 From: mika Date: Thu, 27 Feb 2020 13:09:29 +0200 Subject: [PATCH 144/231] optimize GetSelectedMeshInfo (loop meshes only if selection changed), add TOP10 verts list --- .../Editor/Tools/GetSelectedMeshInfo.cs | 60 +++++++++++++++---- 1 file changed, 49 insertions(+), 11 deletions(-) diff --git a/Assets/Scripts/Editor/Tools/GetSelectedMeshInfo.cs b/Assets/Scripts/Editor/Tools/GetSelectedMeshInfo.cs index ad4fc24..6124981 100644 --- a/Assets/Scripts/Editor/Tools/GetSelectedMeshInfo.cs +++ b/Assets/Scripts/Editor/Tools/GetSelectedMeshInfo.cs @@ -1,5 +1,6 @@ // display selected gameobject mesh stats (should work on prefabs,models in project window also) +using System.Collections.Generic; using UnityEditor; using UnityEngine; @@ -7,6 +8,15 @@ namespace UnityLibrary { public class GetSelectedMeshInfo : EditorWindow { + bool selectionChanged = false; + + int totalMeshes = 0; + int totalVertices = 0; + int totalTris = 0; + + List top10 = new List(); + MeshFilter[] meshes; + [MenuItem("Tools/UnityLibrary/GetMeshInfo")] public static void ShowWindow() { @@ -17,34 +27,62 @@ public static void ShowWindow() void OnGUI() { var selection = Selection.activeGameObject; - if (selection != null) { EditorGUILayout.LabelField("Selected: " + selection.name); - int totalMeshes = 0; - int totalVertices = 0; - int totalTris = 0; - - // get all meshes - var meshes = selection.GetComponentsInChildren(); - for (int i = 0, length = meshes.Length; i < length; i++) + // update mesh info only if selection changed + if (selectionChanged == true) { - totalVertices += meshes[i].sharedMesh.vertexCount; - totalTris += meshes[i].sharedMesh.triangles.Length / 3; - totalMeshes++; + top10.Clear(); + + totalMeshes = 0; + totalVertices = 0; + totalTris = 0; + + // get all meshes + meshes = selection.GetComponentsInChildren(); + for (int i = 0, length = meshes.Length; i < length; i++) + { + int verts = meshes[i].sharedMesh.vertexCount; + totalVertices += verts; + totalTris += meshes[i].sharedMesh.triangles.Length / 3; + totalMeshes++; + top10.Add(verts); + } + selectionChanged = false; + + // sort top10 + top10.Sort(); } // display stats EditorGUILayout.LabelField("Meshes: " + totalMeshes); EditorGUILayout.LabelField("Vertices: " + totalVertices); EditorGUILayout.LabelField("Triangles: " + totalTris); + EditorGUILayout.Space(); + EditorGUILayout.LabelField("TOP 10", EditorStyles.boldLabel); + + // top 10 + if (meshes != null) + { + // start from last index + int from = meshes.Length; + // until 10 meshes or if less than 10 + int to = meshes.Length - Mathf.Min(10, from); + for (int i = from-1; i >= to; i--) + { + int percent = (int)(top10[i] / (float)totalVertices * 100f); + EditorGUILayout.LabelField(meshes[i].name + " = " + top10[i] + " (" + percent + "%)"); + } + } } } void OnSelectionChange() { + selectionChanged = true; // force redraw window Repaint(); } From 3245181b3dfb9e330e5ddff94aa7c2f815d9ee69 Mon Sep 17 00:00:00 2001 From: mika Date: Thu, 5 Mar 2020 12:41:02 +0200 Subject: [PATCH 145/231] Create CirclesPattern.shader --- .../Shaders/2D/Patterns/CirclesPattern.shader | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 Assets/Shaders/2D/Patterns/CirclesPattern.shader diff --git a/Assets/Shaders/2D/Patterns/CirclesPattern.shader b/Assets/Shaders/2D/Patterns/CirclesPattern.shader new file mode 100644 index 0000000..1ed7c16 --- /dev/null +++ b/Assets/Shaders/2D/Patterns/CirclesPattern.shader @@ -0,0 +1,68 @@ +// draws circle pattern +Shader "UnityLibrary/2D/Patterns/Circles" +{ + Properties + { + _Color ("Color", Color) = (1,1,1,1) + _CircleSize("Size", Range(0,1)) = 0.5 + _Circles("Amount", Range(1,64)) = 8 + } + + SubShader + { + Tags { "RenderType"="Opaque" } + LOD 200 + + CGPROGRAM + #pragma surface surf Standard fullforwardshadows vertex:vert + #pragma target 3.0 + + struct Input + { + float2 texcoord : TEXCOORD0; + }; + + sampler2D _MainTex; + float _Circles; + float _CircleSize; + + half _Glossiness; + half _Metallic; + fixed4 _Color; + + UNITY_INSTANCING_BUFFER_START(Props) + UNITY_INSTANCING_BUFFER_END(Props) + + // https://thebookofshaders.com/09/ + float2 tile(float2 _st, float _zoom) + { + _st *= _zoom; + return frac(_st); + } + + // https://thebookofshaders.com/07/ + float Circle(float2 _st, float _radius) + { + float2 dist = _st - float2(0.5, 0.5); + return 1. - smoothstep(_radius - (_radius * 0.01), _radius + (_radius * 0.01), dot(dist, dist) * 4.0); + } + + void vert(inout appdata_full v, out Input o) + { + UNITY_INITIALIZE_OUTPUT(Input, o); + o.texcoord = v.texcoord; + } + + void surf (Input IN, inout SurfaceOutputStandard o) + { + float2 st = IN.texcoord.xy; + float c = Circle(tile(st, round(_Circles)), _CircleSize); + o.Albedo = c.rrr* _Color; + o.Metallic = _Metallic; + o.Smoothness = _Glossiness; + o.Alpha = c.r; + } + ENDCG + } + FallBack "Diffuse" +} From 0405e0982b6fb8fed98ad96de57b66cce8bf4d3c Mon Sep 17 00:00:00 2001 From: mika Date: Sat, 7 Mar 2020 11:06:25 +0200 Subject: [PATCH 146/231] Add Metaball.cs from unity wiki --- Assets/Scripts/Mesh/Metaball.cs | 979 ++++++++++++++++++++++++++++++++ 1 file changed, 979 insertions(+) create mode 100644 Assets/Scripts/Mesh/Metaball.cs diff --git a/Assets/Scripts/Mesh/Metaball.cs b/Assets/Scripts/Mesh/Metaball.cs new file mode 100644 index 0000000..5bb330d --- /dev/null +++ b/Assets/Scripts/Mesh/Metaball.cs @@ -0,0 +1,979 @@ +// taken from http://wiki.unity3d.com/index.php?title=MetaBalls&oldid=16461 +/** + * Metaball implementation by Brian R. Cowan http://www.briancowan.net/ + * Metaball tables at http://local.wasp.uwa.edu.au/~pbourke/geometry/polygonise/ + * Examples at http://www.briancowan.net/unity/fx + * + * Code provided as-is. You agree by using this code that I am not liable for any damage + * it could possibly cause to you, your machine, or anything else. And the code is not meant + * to be used for any medical uses or to run nuclear reactors or robots or such and so. + * + * Should be easily portable to any other language, all Unity Specific code is labeled so, + * adapt it to any other environment. To use, attach the script to an empty object with a + * Mesh Renderer and Mesh Filter. The created cubes will be one unit in size in XYZ. + * Modify Update() and Start() to change the amount and movement and size of the blobs. + * + * Id love to see any project you use the code in. + * + * Mail any comments to: brian@briancowan.net (Vector or Vector426 on #otee-unity) + * + * Cheers & God bless + */ + +/** +*There is a small bug in this code that produces 1 to 4 overlapping triangles +*mostly in the centre of the mesh, sometimes on a side resulting in a white patch +*it appears in other shapes than Metaballs. +*if it's too hard to fix the code, scanning duplicate triangles is possible +*the duplicates occur in the 1st 4 triangles and anywhere after +*it seems the code doesn't check duplicates for the 1st 4 triangles +*the above issue is probably relate to the march() function doCube 1x time +*and then sending recurse() function docube in the same space +* so perhaps delete if(doCube(cube)) { condition in march() and just recurse +*also it processes 278700 pts instead of 32768 pts if made to march all spaces +*/ + +/*Unity Specific*/ +using UnityEngine; +using System.Collections; + +namespace UnityLibrary +{ + public class Metaball : MonoBehaviour + { + + /*Amount of cubes in X/Y/Z directions, Dimension will always be from -.5f to .5f in XYZ + remember to call Regen() if changing! + */ + int _dimX = 30; + int _dimY = 30; + int _dimZ = 30; + + public int dimX + { + get { return _dimX; } + set { _dimX = value; Regen(); } + } + public int dimY + { + get { return _dimY; } + set { _dimY = value; Regen(); } + } + public int dimZ + { + get { return _dimZ; } + set { _dimZ = value; Regen(); } + } + /*Blobs are a staggered array of floats, where first index is blob, and second is 0=x, 1=y 2=z 3=power + Multidim might be slightly faster, but staggered made the code a little cleaner IMO*/ + public float[][] blobs; + + /*Cutoff intensity, where the surface of mesh will be created*/ + public float isoLevel = .5f; + + /*Scratch buffers for Vertices/Normals/Tris */ + private Vector3[] newVertex; + private Vector3[] newNormal; + private Vector2[] newUV; + private int[] newTri; + + /*Pointer into scratch buffers for tris and vertices(also used for UVs and Normals) + at the end of a frame it will give the total amount of each*/ + private int triP = 0; + private int vertP = 0; + + /*Generated at startup for dimX,dimY,dimZ, + all the points, edges, cubes in the 3D lattice*/ + private mcPoint[] _points; + private mcEdge[] _edges; + private mcCube[] _cubes; + + + /*Scratch buffers for use within functions, to eliminate the usage of new almost entirely each frame*/ + private Vector3[] tada; + private Vector2[] tada2; + private int tadac, tadac2; + private int tadam = 50000; + + /*Current frame counter*/ + private int pctr = 0; + + /*Cube Class*/ + private class mcCube + { + public mcCube() + { + cntr = 0; + edges = new mcEdge[12]; + for (int i = 0; i < 12; i++) + { + edges[i] = null; + } + points = new mcPoint[8]; + } + + /*12 Edges, see march() for their positioning*/ + public mcEdge[] edges; + + /*8 Points, see march() for their positioning*/ + public mcPoint[] points; + + /*last frame this cube was processed*/ + public int cntr; + + /*Pointers into the latice array*/ + public int px; + public int py; + public int pz; + } + + /*Edge class*/ + private class mcEdge + { + /*the vector of the calculated point*/ + public Vector3 v3; + + /*index into newVertex/Normal/Uv of calculated point*/ + public int vi; + + /*Last frame this was calculated at*/ + public int cntr; + + /*axis of edge*/ + public int axisI; + + public mcEdge(int axisI) + { + this.cntr = 0; + this.axisI = axisI; + } + } + + /*Point (in lattice) class*/ + public class mcPoint + { + /*Calculated Intensity or Power of point*/ + public float _i; + public int px, py, pz; + private Metaball mcblob; + public int cntr; + + /*Object Space position of point*/ + public float[] index; + + public mcPoint(float x, float y, float z, int px, int py, int pz, Metaball thismcblob) + { + this.index = new float[3]; + index[0] = x; index[1] = y; index[2] = z; + + this.px = px; + this.py = py; + this.pz = pz; + this.cntr = 0; + this.mcblob = thismcblob; + } + + /*Axis letter accessors*/ + public float x + { + get { return index[0]; } + set { index[0] = value; } + } + public float y + { + get { return index[1]; } + set { index[1] = value; } + } + public float z + { + get { return index[2]; } + set { index[2] = value; } + } + + /*Calculate the power of a point only if it hasn't been calculated already for this frame*/ + public float i() + { + float pwr; + if (cntr < mcblob.pctr) + { + cntr = mcblob.pctr; + pwr = 0f; + for (int jc = 0; jc < this.mcblob.blobs.Length; jc++) + { + float[] pb = this.mcblob.blobs[jc]; + pwr += (1.0f / Mathf.Sqrt(((pb[0] - this.x) * (pb[0] - this.x)) + ((pb[1] - this.y) * (pb[1] - this.y)) + ((pb[2] - this.z) * (pb[2] - this.z)))) * pb[3]; + } + this._i = pwr; + } + return this._i; + } + + public float this[int idx] + { + get + { + return index[idx]; + } + set + { + index[idx] = value; + } + } + } + + /* Normals are calculated by 'averaging' all the derivatives of the Blob power functions*/ + private Vector3 calcNormal(Vector3 pnt) + { + int jc; + Vector3 result = tada[tadac++]; + result.x = 0; result.y = 0; result.z = 0; + for (jc = 0; jc < blobs.Length; jc++) + { + float[] pb = blobs[jc]; + + Vector3 current = tada[tadac++]; + current.x = pnt.x - pb[0]; + current.y = pnt.y - pb[1]; + current.z = pnt.z - pb[2]; + float mag = current.magnitude; + float pwr = .5f * (1f / (mag * mag * mag)) * pb[3]; + result = result + (current * pwr); + } + return result.normalized; + } + + /*Given xyz indices into lattice, return referring cube */ + private mcCube getCube(int x, int y, int z) + { + if (x < 0 || y < 0 || z < 0 || x >= dimX || y >= dimY || z >= dimZ) { return null; } + return _cubes[z + (y * (dimZ)) + (x * (dimZ) * (dimY))]; + } + + /*Given xyz indices into lattice, return referring vertex */ + private mcPoint getPoint(int x, int y, int z) + { + if (x < 0 || y < 0 || z < 0 || x > dimX || y > dimY || z > dimZ) { return null; } + return _points[z + (y * (dimZ + 1)) + (x * (dimZ + 1) * (dimY + 1))]; + } + + /*Return the interpolated position of point on an Axis*/ + private Vector3 mPos(mcPoint a, mcPoint b, int axisI) + { + float mu = (isoLevel - a.i()) / (b.i() - a.i()); + Vector3 tmp = tada[tadac++]; + tmp[0] = a[0]; tmp[1] = a[1]; tmp[2] = a[2]; + tmp[axisI] = a[axisI] + (mu * (b[axisI] - a[axisI])); + + return tmp; + } + + /*If an edge of a cube has not been processed, find the interpolated point for + that edge (assumes the boundary crosses the edge) and compute the normal + for that point, as well as assigning it an index into the vertex list*/ + private void genEdge(mcCube cube, int edgei, int p1i, int p2i) + { + Vector3 v; + mcEdge e = cube.edges[edgei]; + if (e.cntr < pctr) + { + + v = mPos(cube.points[p1i], cube.points[p2i], e.axisI); + e.v3 = v; + e.vi = vertP; + newNormal[vertP] = calcNormal(v); + newVertex[vertP++] = v; + e.cntr = pctr; + + } + } + + /*Calculate a cube: + First set a boolean pointer made up of all the vertices within the cube + then (if not all in or out of the surface) go through all the edges that + are crossed by the surface and make sure that a vertex&normal is assigned + at the point of crossing. Then add all the triangles that cover the surface + within the cube. + Returns true if the surface crosses the cube, false otherwise.*/ + private bool doCube(mcCube cube) + { + int edgec, vertc; + edgec = 0; vertc = 0; + + int cubeIndex = 0; + + if (cube.points[0].i() > isoLevel) { cubeIndex |= 1; } + if (cube.points[1].i() > isoLevel) { cubeIndex |= 2; } + if (cube.points[2].i() > isoLevel) { cubeIndex |= 4; } + if (cube.points[3].i() > isoLevel) { cubeIndex |= 8; } + if (cube.points[4].i() > isoLevel) { cubeIndex |= 16; } + if (cube.points[5].i() > isoLevel) { cubeIndex |= 32; } + if (cube.points[6].i() > isoLevel) { cubeIndex |= 64; } + if (cube.points[7].i() > isoLevel) { cubeIndex |= 128; } + + int edgeIndex = edgeTable[cubeIndex]; + edgec += edgeIndex; + if (edgeIndex != 0) + { + if ((edgeIndex & 1) > 0) { genEdge(cube, 0, 0, 1); } + if ((edgeIndex & 2) > 0) { genEdge(cube, 1, 1, 2); } + if ((edgeIndex & 4) > 0) { genEdge(cube, 2, 2, 3); } + if ((edgeIndex & 0x8) > 0) { genEdge(cube, 3, 3, 0); } + if ((edgeIndex & 0x10) > 0) { genEdge(cube, 4, 4, 5); } + if ((edgeIndex & 0x20) > 0) { genEdge(cube, 5, 5, 6); } + if ((edgeIndex & 0x40) > 0) { genEdge(cube, 6, 6, 7); } + if ((edgeIndex & 0x80) > 0) { genEdge(cube, 7, 7, 4); } + if ((edgeIndex & 0x100) > 0) { genEdge(cube, 8, 0, 4); } + if ((edgeIndex & 0x200) > 0) { genEdge(cube, 9, 1, 5); } + if ((edgeIndex & 0x400) > 0) { genEdge(cube, 10, 2, 6); } + if ((edgeIndex & 0x800) > 0) { genEdge(cube, 11, 3, 7); } + + int tpi = 0; + int tmp; + while (triTable[cubeIndex, tpi] != -1) + { + tmp = cube.edges[triTable[cubeIndex, tpi + 2]].vi; + newTri[triP++] = tmp; vertc += tmp; + tmp = cube.edges[triTable[cubeIndex, tpi + 1]].vi; + newTri[triP++] = tmp; vertc += tmp; + tmp = cube.edges[triTable[cubeIndex, tpi]].vi; + newTri[triP++] = tmp; vertc += tmp; + tpi += 3; + } + + return true; + } + else + { + return false; + } + } + + /*Recurse all the neighboring cubes where thy contain part of the surface*/ + /*Counter to see how many cubes where processed*/ + int cubec; + private void recurseCube(mcCube cube) + { + mcCube nCube; + int jx, jy, jz; + jx = cube.px; jy = cube.py; jz = cube.pz; + cubec++; + /* Test 6 axis cases. This seems to work well, no need to test all 26 cases */ + nCube = getCube(jx + 1, jy, jz); + if (nCube != null && nCube.cntr < pctr) { nCube.cntr = pctr; if (doCube(nCube)) { recurseCube(nCube); } } + nCube = getCube(jx - 1, jy, jz); + if (nCube != null && nCube.cntr < pctr) { nCube.cntr = pctr; if (doCube(nCube)) { recurseCube(nCube); } } + nCube = getCube(jx, jy + 1, jz); + if (nCube != null && nCube.cntr < pctr) { nCube.cntr = pctr; if (doCube(nCube)) { recurseCube(nCube); } } + nCube = getCube(jx, jy - 1, jz); + if (nCube != null && nCube.cntr < pctr) { nCube.cntr = pctr; if (doCube(nCube)) { recurseCube(nCube); } } + nCube = getCube(jx, jy, jz + 1); + if (nCube != null && nCube.cntr < pctr) { nCube.cntr = pctr; if (doCube(nCube)) { recurseCube(nCube); } } + nCube = getCube(jx, jy, jz - 1); + if (nCube != null && nCube.cntr < pctr) { nCube.cntr = pctr; if (doCube(nCube)) { recurseCube(nCube); } } + } + + /*Go through all the Blobs, and travel from the center outwards in a negative Z direction + until we reach the surface, then begin to recurse around the surface. This isn't flawless + if the blob isn't completely within the lattice boundaries in the minimal Z axis and no + other blob that does check out is in contact with it. The blob will dissapear, but otherwise + works well*/ + private void march() + { + int i, jx, jy, jz; + for (i = 0; i < blobs.Length; i++) + { + float[] pb = blobs[i]; + jx = (int)((pb[0] + .5f) * dimX); + jy = (int)((pb[1] + .5f) * dimY); + jz = (int)((pb[2] + .5f) * dimZ); + + while (jz >= 0) + { + mcCube cube = getCube(jx, jy, jz); + if (cube != null && cube.cntr < pctr) + { + if (doCube(cube)) + { + recurseCube(cube); + jz = -1; + } + cube.cntr = pctr; + } + else + { + jz = -1; + } + jz -= 1; + } + } + } + + /*Unity and Sample Specific, scratch caches to not reallocate vertices/tris/etc...*/ + Vector3[] fv, fn; + int[] ft; + Vector2[] fuv; + + //Last Status Post + private float lt = 0f; + + /*Unity and Sample Specific*/ + private void renderMesh() + { + int i; + + /*Clear the Vertices that don't have any real information assigned to them */ + for (i = 0; i < vertP; i++) + { + fv[i] = newVertex[i]; fn[i] = newNormal[i]; + fuv[i] = tada2[tadac2++]; + Vector3 fuvt = transform.TransformPoint(fn[i]).normalized; + fuv[i].x = (fuvt.x + 1f) * .5f; fuv[i].y = (fuvt.y + 1f) * .5f; + } + // fuv[i].x=fn[i].x;fuv[i].y=fn[i].y;} + + for (i = vertP; i < fv.Length; i++) + { + fv[i][0] = 0; fn[i][0] = 0; fuv[i][0] = 0; + fv[i][1] = 0; fn[i][1] = 0; fuv[i][1] = 0; + fv[i][2] = 0; + } + + for (i = 0; i < triP; i++) { ft[i] = newTri[i]; } + for (i = triP; i < ft.Length; i++) { ft[i] = 0; } + + Mesh mesh = ((MeshFilter)GetComponent("MeshFilter")).mesh; + + mesh.vertices = fv; + mesh.uv = fuv; + mesh.triangles = ft; + mesh.normals = fn; + + /*For Disco Ball Effect*/ + //mesh.RecalculateNormals(); + } + + /*What is needed to do every frame for the calculation and rendering of the Metaballs*/ + void doFrame() + { + tadac = 0; + tadac2 = 0; + cubec = 0; + pctr++; + triP = 0; + vertP = 0; + march(); + renderMesh(); + } + + /*Regenerate Lattice and Connections, when changing Dimensions of Lattice*/ + void Regen() + { + startObjs(); + startEngine(); + } + + //Unity and Sample specific + void Update() + { + //Update FPS and counters every second + //if (lt + 1 < Time.time) + //{ + // lt = Time.time; + // GUIText guit = (GUIText)GameObject.Find("guit").guiText; + // guit.text = "T:" + triP + " V:" + vertP + " C:" + cubec + " FPS:" + (int)(1f / Time.deltaTime); + //} + + blobs[0][0] = .12f + .12f * (float)Mathf.Sin((float)Time.time * .50f); + blobs[0][2] = .06f + .23f * (float)Mathf.Cos((float)Time.time * .2f); + blobs[1][0] = .12f + .12f * (float)Mathf.Sin((float)Time.time * .2f); + blobs[1][2] = -.23f + .10f * (float)Mathf.Cos((float)Time.time * 1f); + blobs[2][1] = -.03f + .24f * (float)Mathf.Sin((float)Time.time * .35f); + blobs[3][1] = .126f + .10f * (float)Mathf.Cos((float)Time.time * .1f); + blobs[4][0] = .206f + .1f * (float)Mathf.Cos((float)Time.time * .5f); + blobs[4][1] = .056f + .2f * (float)Mathf.Sin((float)Time.time * .3f); + blobs[4][2] = .25f + .08f * (float)Mathf.Cos((float)Time.time * .2f); + + transform.Rotate(Time.deltaTime * 10f, 0, Time.deltaTime * .6f); + + doFrame(); + } + + //Unity and Sample Specific + void Start() + { + lt = 0f; + blobs = new float[5][]; + blobs[0] = new float[] { .16f, .26f, .16f, .13f }; + blobs[1] = new float[] { .13f, -.134f, .35f, .12f }; + blobs[2] = new float[] { -.18f, .125f, -.25f, .16f }; + blobs[3] = new float[] { -.13f, .23f, .255f, .13f }; + blobs[4] = new float[] { -.18f, .125f, .35f, .12f }; + isoLevel = 1.95f; + Regen(); + } + + + /*Unity Specific starting of engine*/ + void startEngine() + { + ((MeshFilter)GetComponent("MeshFilter")).mesh = new Mesh(); + } + + /*Generate the Cube Lattice + All shared vertices and edges are connected across cubes, + it's not perfect in that the edges along the lower index borders + are not connected, but all the rest are, this shouldn't make any + noticeable visual impact, and have no performance impact unless + a blob lies along those borders*/ + private void startObjs() + { + int i; + float jx, jy, jz; + int ijx, ijy, ijz; + int pointCount = ((dimX + 1) * (dimY + 1) * (dimZ + 1)); + int cubeCount = (dimX * dimY * dimZ); + int edgeCount = (cubeCount * 3) + ((2 * dimX * dimY) + (2 * dimX * dimZ) + (2 * dimY * dimZ)) + dimX + dimY + dimZ; //Ideal Edge Count + int edgeNow = edgeCount + ((dimX * dimY) + (dimY * dimZ) + (dimZ * dimX)) * 2; //Haven't combined the edges of the 0 index borders + + //Should be a pretty safe amount + int tmpv = (int)(dimX * dimY * dimZ / 7); + tadam = tmpv * 4; + fv = new Vector3[tmpv]; + fn = new Vector3[tmpv]; + fuv = new Vector2[tmpv]; + + //Pretty save amount of Tris as well + ft = new int[(int)(cubeCount * .75)]; + + newVertex = new Vector3[300000]; + newTri = new int[300000]; + newNormal = new Vector3[300000]; + tada = new Vector3[tadam * 2]; + tada2 = new Vector2[tadam * 2]; + + //newUV=new Vector2[300000]; + _cubes = new mcCube[cubeCount]; + _points = new mcPoint[pointCount]; + _edges = new mcEdge[edgeNow]; + + for (i = 0; i < tadam * 2; i++) + { + tada[i] = new Vector3(0, 0, 0); + tada2[i] = new Vector2(0, 0); + } + + for (i = 0; i < edgeNow; i++) + { + _edges[i] = new mcEdge(-1); + } + + + i = 0; + for (jx = 0.0f; jx <= dimX; jx++) + { + for (jy = 0.0f; jy <= dimY; jy++) + { + for (jz = 0.0f; jz <= dimZ; jz++) + { + _points[i] = new mcPoint((jx / dimX) - .5f, (jy / dimY) - .5f, (jz / dimZ) - .5f, (int)jx, (int)jy, (int)jz, this); + + i++; + } + } + } + + for (i = 0; i < cubeCount; i++) + { + _cubes[i] = new mcCube(); + } + int ep = 0; + + mcCube c; + mcCube tc; + i = 0; + + int topo = 0; + for (ijx = 0; ijx < dimX; ijx++) + { + for (ijy = 0; ijy < dimY; ijy++) + { + for (ijz = 0; ijz < dimZ; ijz++) + { + c = _cubes[i]; + i++; + c.px = ijx; c.py = ijy; c.pz = ijz; + + mcPoint[] cpt = c.points; + cpt[0] = getPoint(ijx, ijy, ijz); + cpt[1] = getPoint(ijx + 1, ijy, ijz); + cpt[2] = getPoint(ijx + 1, ijy + 1, ijz); + cpt[3] = getPoint(ijx, ijy + 1, ijz); + cpt[4] = getPoint(ijx, ijy, ijz + 1); + cpt[5] = getPoint(ijx + 1, ijy, ijz + 1); + cpt[6] = getPoint(ijx + 1, ijy + 1, ijz + 1); + cpt[7] = getPoint(ijx, ijy + 1, ijz + 1); + + mcEdge[] e = c.edges; + e[5] = _edges[ep++]; e[5].axisI = 1; + e[6] = _edges[ep++]; e[6].axisI = 0; + e[10] = _edges[ep++]; e[10].axisI = 2; + + tc = getCube(ijx + 1, ijy, ijz); + if (tc != null) { tc.edges[11] = e[10]; tc.edges[7] = e[5]; } + + tc = getCube(ijx, ijy + 1, ijz); + if (tc != null) { tc.edges[4] = c.edges[6]; tc.edges[9] = c.edges[10]; } + + tc = getCube(ijx, ijy + 1, ijz + 1); + if (tc != null) { tc.edges[0] = c.edges[6]; } + + tc = getCube(ijx + 1, ijy, ijz + 1); + if (tc != null) { tc.edges[3] = c.edges[5]; } + + tc = getCube(ijx + 1, ijy + 1, ijz); + if (tc != null) { tc.edges[8] = c.edges[10]; } + + tc = getCube(ijx, ijy, ijz + 1); + if (tc != null) { tc.edges[1] = c.edges[5]; tc.edges[2] = c.edges[6]; } + + if (e[0] == null) + { + e[0] = _edges[ep++]; e[0].axisI = 0; + } + if (e[1] == null) + { + e[1] = _edges[ep++]; e[1].axisI = 1; + } + if (e[2] == null) + { + e[2] = _edges[ep++]; e[2].axisI = 0; + } + else { topo++; } + if (e[3] == null) + { + e[3] = _edges[ep++]; e[3].axisI = 1; + } + if (e[4] == null) + { + e[4] = _edges[ep++]; e[4].axisI = 0; + } + if (e[7] == null) + { + e[7] = _edges[ep++]; e[7].axisI = 1; + } + if (e[8] == null) + { + e[8] = _edges[ep++]; e[8].axisI = 2; + } + if (e[9] == null) + { + e[9] = _edges[ep++]; e[9].axisI = 2; + } + if (e[11] == null) + { + e[11] = _edges[ep++]; e[11].axisI = 2; + } + } + } + } + } + + /*Courtesy of http://local.wasp.uwa.edu.au/~pbourke/geometry/polygonise/*/ + private int[,] triTable = new int[,] + {{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {0, 1, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {1, 8, 3, 9, 8, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {1, 2, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {0, 8, 3, 1, 2, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {9, 2, 10, 0, 2, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {2, 8, 3, 2, 10, 8, 10, 9, 8, -1, -1, -1, -1, -1, -1, -1}, + {3, 11, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {0, 11, 2, 8, 11, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {1, 9, 0, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {1, 11, 2, 1, 9, 11, 9, 8, 11, -1, -1, -1, -1, -1, -1, -1}, + {3, 10, 1, 11, 10, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {0, 10, 1, 0, 8, 10, 8, 11, 10, -1, -1, -1, -1, -1, -1, -1}, + {3, 9, 0, 3, 11, 9, 11, 10, 9, -1, -1, -1, -1, -1, -1, -1}, + {9, 8, 10, 10, 8, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {4, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {4, 3, 0, 7, 3, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {0, 1, 9, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {4, 1, 9, 4, 7, 1, 7, 3, 1, -1, -1, -1, -1, -1, -1, -1}, + {1, 2, 10, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {3, 4, 7, 3, 0, 4, 1, 2, 10, -1, -1, -1, -1, -1, -1, -1}, + {9, 2, 10, 9, 0, 2, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1}, + {2, 10, 9, 2, 9, 7, 2, 7, 3, 7, 9, 4, -1, -1, -1, -1}, + {8, 4, 7, 3, 11, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {11, 4, 7, 11, 2, 4, 2, 0, 4, -1, -1, -1, -1, -1, -1, -1}, + {9, 0, 1, 8, 4, 7, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1}, + {4, 7, 11, 9, 4, 11, 9, 11, 2, 9, 2, 1, -1, -1, -1, -1}, + {3, 10, 1, 3, 11, 10, 7, 8, 4, -1, -1, -1, -1, -1, -1, -1}, + {1, 11, 10, 1, 4, 11, 1, 0, 4, 7, 11, 4, -1, -1, -1, -1}, + {4, 7, 8, 9, 0, 11, 9, 11, 10, 11, 0, 3, -1, -1, -1, -1}, + {4, 7, 11, 4, 11, 9, 9, 11, 10, -1, -1, -1, -1, -1, -1, -1}, + {9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {9, 5, 4, 0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {0, 5, 4, 1, 5, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {8, 5, 4, 8, 3, 5, 3, 1, 5, -1, -1, -1, -1, -1, -1, -1}, + {1, 2, 10, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {3, 0, 8, 1, 2, 10, 4, 9, 5, -1, -1, -1, -1, -1, -1, -1}, + {5, 2, 10, 5, 4, 2, 4, 0, 2, -1, -1, -1, -1, -1, -1, -1}, + {2, 10, 5, 3, 2, 5, 3, 5, 4, 3, 4, 8, -1, -1, -1, -1}, + {9, 5, 4, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {0, 11, 2, 0, 8, 11, 4, 9, 5, -1, -1, -1, -1, -1, -1, -1}, + {0, 5, 4, 0, 1, 5, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1}, + {2, 1, 5, 2, 5, 8, 2, 8, 11, 4, 8, 5, -1, -1, -1, -1}, + {10, 3, 11, 10, 1, 3, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1}, + {4, 9, 5, 0, 8, 1, 8, 10, 1, 8, 11, 10, -1, -1, -1, -1}, + {5, 4, 0, 5, 0, 11, 5, 11, 10, 11, 0, 3, -1, -1, -1, -1}, + {5, 4, 8, 5, 8, 10, 10, 8, 11, -1, -1, -1, -1, -1, -1, -1}, + {9, 7, 8, 5, 7, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {9, 3, 0, 9, 5, 3, 5, 7, 3, -1, -1, -1, -1, -1, -1, -1}, + {0, 7, 8, 0, 1, 7, 1, 5, 7, -1, -1, -1, -1, -1, -1, -1}, + {1, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {9, 7, 8, 9, 5, 7, 10, 1, 2, -1, -1, -1, -1, -1, -1, -1}, + {10, 1, 2, 9, 5, 0, 5, 3, 0, 5, 7, 3, -1, -1, -1, -1}, + {8, 0, 2, 8, 2, 5, 8, 5, 7, 10, 5, 2, -1, -1, -1, -1}, + {2, 10, 5, 2, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1}, + {7, 9, 5, 7, 8, 9, 3, 11, 2, -1, -1, -1, -1, -1, -1, -1}, + {9, 5, 7, 9, 7, 2, 9, 2, 0, 2, 7, 11, -1, -1, -1, -1}, + {2, 3, 11, 0, 1, 8, 1, 7, 8, 1, 5, 7, -1, -1, -1, -1}, + {11, 2, 1, 11, 1, 7, 7, 1, 5, -1, -1, -1, -1, -1, -1, -1}, + {9, 5, 8, 8, 5, 7, 10, 1, 3, 10, 3, 11, -1, -1, -1, -1}, + {5, 7, 0, 5, 0, 9, 7, 11, 0, 1, 0, 10, 11, 10, 0, -1}, + {11, 10, 0, 11, 0, 3, 10, 5, 0, 8, 0, 7, 5, 7, 0, -1}, + {11, 10, 5, 7, 11, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {0, 8, 3, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {9, 0, 1, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {1, 8, 3, 1, 9, 8, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1}, + {1, 6, 5, 2, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {1, 6, 5, 1, 2, 6, 3, 0, 8, -1, -1, -1, -1, -1, -1, -1}, + {9, 6, 5, 9, 0, 6, 0, 2, 6, -1, -1, -1, -1, -1, -1, -1}, + {5, 9, 8, 5, 8, 2, 5, 2, 6, 3, 2, 8, -1, -1, -1, -1}, + {2, 3, 11, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {11, 0, 8, 11, 2, 0, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1}, + {0, 1, 9, 2, 3, 11, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1}, + {5, 10, 6, 1, 9, 2, 9, 11, 2, 9, 8, 11, -1, -1, -1, -1}, + {6, 3, 11, 6, 5, 3, 5, 1, 3, -1, -1, -1, -1, -1, -1, -1}, + {0, 8, 11, 0, 11, 5, 0, 5, 1, 5, 11, 6, -1, -1, -1, -1}, + {3, 11, 6, 0, 3, 6, 0, 6, 5, 0, 5, 9, -1, -1, -1, -1}, + {6, 5, 9, 6, 9, 11, 11, 9, 8, -1, -1, -1, -1, -1, -1, -1}, + {5, 10, 6, 4, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {4, 3, 0, 4, 7, 3, 6, 5, 10, -1, -1, -1, -1, -1, -1, -1}, + {1, 9, 0, 5, 10, 6, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1}, + {10, 6, 5, 1, 9, 7, 1, 7, 3, 7, 9, 4, -1, -1, -1, -1}, + {6, 1, 2, 6, 5, 1, 4, 7, 8, -1, -1, -1, -1, -1, -1, -1}, + {1, 2, 5, 5, 2, 6, 3, 0, 4, 3, 4, 7, -1, -1, -1, -1}, + {8, 4, 7, 9, 0, 5, 0, 6, 5, 0, 2, 6, -1, -1, -1, -1}, + {7, 3, 9, 7, 9, 4, 3, 2, 9, 5, 9, 6, 2, 6, 9, -1}, + {3, 11, 2, 7, 8, 4, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1}, + {5, 10, 6, 4, 7, 2, 4, 2, 0, 2, 7, 11, -1, -1, -1, -1}, + {0, 1, 9, 4, 7, 8, 2, 3, 11, 5, 10, 6, -1, -1, -1, -1}, + {9, 2, 1, 9, 11, 2, 9, 4, 11, 7, 11, 4, 5, 10, 6, -1}, + {8, 4, 7, 3, 11, 5, 3, 5, 1, 5, 11, 6, -1, -1, -1, -1}, + {5, 1, 11, 5, 11, 6, 1, 0, 11, 7, 11, 4, 0, 4, 11, -1}, + {0, 5, 9, 0, 6, 5, 0, 3, 6, 11, 6, 3, 8, 4, 7, -1}, + {6, 5, 9, 6, 9, 11, 4, 7, 9, 7, 11, 9, -1, -1, -1, -1}, + {10, 4, 9, 6, 4, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {4, 10, 6, 4, 9, 10, 0, 8, 3, -1, -1, -1, -1, -1, -1, -1}, + + + {10, 0, 1, 10, 6, 0, 6, 4, 0, -1, -1, -1, -1, -1, -1, -1}, + {8, 3, 1, 8, 1, 6, 8, 6, 4, 6, 1, 10, -1, -1, -1, -1}, + {1, 4, 9, 1, 2, 4, 2, 6, 4, -1, -1, -1, -1, -1, -1, -1}, + {3, 0, 8, 1, 2, 9, 2, 4, 9, 2, 6, 4, -1, -1, -1, -1}, + {0, 2, 4, 4, 2, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {8, 3, 2, 8, 2, 4, 4, 2, 6, -1, -1, -1, -1, -1, -1, -1}, + {10, 4, 9, 10, 6, 4, 11, 2, 3, -1, -1, -1, -1, -1, -1, -1}, + {0, 8, 2, 2, 8, 11, 4, 9, 10, 4, 10, 6, -1, -1, -1, -1}, + {3, 11, 2, 0, 1, 6, 0, 6, 4, 6, 1, 10, -1, -1, -1, -1}, + {6, 4, 1, 6, 1, 10, 4, 8, 1, 2, 1, 11, 8, 11, 1, -1}, + {9, 6, 4, 9, 3, 6, 9, 1, 3, 11, 6, 3, -1, -1, -1, -1}, + {8, 11, 1, 8, 1, 0, 11, 6, 1, 9, 1, 4, 6, 4, 1, -1}, + {3, 11, 6, 3, 6, 0, 0, 6, 4, -1, -1, -1, -1, -1, -1, -1}, + {6, 4, 8, 11, 6, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {7, 10, 6, 7, 8, 10, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1}, + {0, 7, 3, 0, 10, 7, 0, 9, 10, 6, 7, 10, -1, -1, -1, -1}, + {10, 6, 7, 1, 10, 7, 1, 7, 8, 1, 8, 0, -1, -1, -1, -1}, + {10, 6, 7, 10, 7, 1, 1, 7, 3, -1, -1, -1, -1, -1, -1, -1}, + {1, 2, 6, 1, 6, 8, 1, 8, 9, 8, 6, 7, -1, -1, -1, -1}, + {2, 6, 9, 2, 9, 1, 6, 7, 9, 0, 9, 3, 7, 3, 9, -1}, + {7, 8, 0, 7, 0, 6, 6, 0, 2, -1, -1, -1, -1, -1, -1, -1}, + {7, 3, 2, 6, 7, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {2, 3, 11, 10, 6, 8, 10, 8, 9, 8, 6, 7, -1, -1, -1, -1}, + {2, 0, 7, 2, 7, 11, 0, 9, 7, 6, 7, 10, 9, 10, 7, -1}, + {1, 8, 0, 1, 7, 8, 1, 10, 7, 6, 7, 10, 2, 3, 11, -1}, + {11, 2, 1, 11, 1, 7, 10, 6, 1, 6, 7, 1, -1, -1, -1, -1}, + {8, 9, 6, 8, 6, 7, 9, 1, 6, 11, 6, 3, 1, 3, 6, -1}, + {0, 9, 1, 11, 6, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {7, 8, 0, 7, 0, 6, 3, 11, 0, 11, 6, 0, -1, -1, -1, -1}, + {7, 11, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {7, 6, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {3, 0, 8, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {0, 1, 9, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {8, 1, 9, 8, 3, 1, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1}, + {10, 1, 2, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {1, 2, 10, 3, 0, 8, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1}, + {2, 9, 0, 2, 10, 9, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1}, + {6, 11, 7, 2, 10, 3, 10, 8, 3, 10, 9, 8, -1, -1, -1, -1}, + {7, 2, 3, 6, 2, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {7, 0, 8, 7, 6, 0, 6, 2, 0, -1, -1, -1, -1, -1, -1, -1}, + {2, 7, 6, 2, 3, 7, 0, 1, 9, -1, -1, -1, -1, -1, -1, -1}, + {1, 6, 2, 1, 8, 6, 1, 9, 8, 8, 7, 6, -1, -1, -1, -1}, + {10, 7, 6, 10, 1, 7, 1, 3, 7, -1, -1, -1, -1, -1, -1, -1}, + {10, 7, 6, 1, 7, 10, 1, 8, 7, 1, 0, 8, -1, -1, -1, -1}, + {0, 3, 7, 0, 7, 10, 0, 10, 9, 6, 10, 7, -1, -1, -1, -1}, + {7, 6, 10, 7, 10, 8, 8, 10, 9, -1, -1, -1, -1, -1, -1, -1}, + {6, 8, 4, 11, 8, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {3, 6, 11, 3, 0, 6, 0, 4, 6, -1, -1, -1, -1, -1, -1, -1}, + {8, 6, 11, 8, 4, 6, 9, 0, 1, -1, -1, -1, -1, -1, -1, -1}, + {9, 4, 6, 9, 6, 3, 9, 3, 1, 11, 3, 6, -1, -1, -1, -1}, + {6, 8, 4, 6, 11, 8, 2, 10, 1, -1, -1, -1, -1, -1, -1, -1}, + {1, 2, 10, 3, 0, 11, 0, 6, 11, 0, 4, 6, -1, -1, -1, -1}, + {4, 11, 8, 4, 6, 11, 0, 2, 9, 2, 10, 9, -1, -1, -1, -1}, + {10, 9, 3, 10, 3, 2, 9, 4, 3, 11, 3, 6, 4, 6, 3, -1}, + {8, 2, 3, 8, 4, 2, 4, 6, 2, -1, -1, -1, -1, -1, -1, -1}, + {0, 4, 2, 4, 6, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {1, 9, 0, 2, 3, 4, 2, 4, 6, 4, 3, 8, -1, -1, -1, -1}, + {1, 9, 4, 1, 4, 2, 2, 4, 6, -1, -1, -1, -1, -1, -1, -1}, + + + {8, 1, 3, 8, 6, 1, 8, 4, 6, 6, 10, 1, -1, -1, -1, -1}, + {10, 1, 0, 10, 0, 6, 6, 0, 4, -1, -1, -1, -1, -1, -1, -1}, + {4, 6, 3, 4, 3, 8, 6, 10, 3, 0, 3, 9, 10, 9, 3, -1}, + {10, 9, 4, 6, 10, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {4, 9, 5, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {0, 8, 3, 4, 9, 5, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1}, + {5, 0, 1, 5, 4, 0, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1}, + {11, 7, 6, 8, 3, 4, 3, 5, 4, 3, 1, 5, -1, -1, -1, -1}, + {9, 5, 4, 10, 1, 2, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1}, + {6, 11, 7, 1, 2, 10, 0, 8, 3, 4, 9, 5, -1, -1, -1, -1}, + {7, 6, 11, 5, 4, 10, 4, 2, 10, 4, 0, 2, -1, -1, -1, -1}, + {3, 4, 8, 3, 5, 4, 3, 2, 5, 10, 5, 2, 11, 7, 6, -1}, + {7, 2, 3, 7, 6, 2, 5, 4, 9, -1, -1, -1, -1, -1, -1, -1}, + {9, 5, 4, 0, 8, 6, 0, 6, 2, 6, 8, 7, -1, -1, -1, -1}, + {3, 6, 2, 3, 7, 6, 1, 5, 0, 5, 4, 0, -1, -1, -1, -1}, + {6, 2, 8, 6, 8, 7, 2, 1, 8, 4, 8, 5, 1, 5, 8, -1}, + {9, 5, 4, 10, 1, 6, 1, 7, 6, 1, 3, 7, -1, -1, -1, -1}, + {1, 6, 10, 1, 7, 6, 1, 0, 7, 8, 7, 0, 9, 5, 4, -1}, + {4, 0, 10, 4, 10, 5, 0, 3, 10, 6, 10, 7, 3, 7, 10, -1}, + {7, 6, 10, 7, 10, 8, 5, 4, 10, 4, 8, 10, -1, -1, -1, -1}, + {6, 9, 5, 6, 11, 9, 11, 8, 9, -1, -1, -1, -1, -1, -1, -1}, + {3, 6, 11, 0, 6, 3, 0, 5, 6, 0, 9, 5, -1, -1, -1, -1}, + {0, 11, 8, 0, 5, 11, 0, 1, 5, 5, 6, 11, -1, -1, -1, -1}, + {6, 11, 3, 6, 3, 5, 5, 3, 1, -1, -1, -1, -1, -1, -1, -1}, + {1, 2, 10, 9, 5, 11, 9, 11, 8, 11, 5, 6, -1, -1, -1, -1}, + {0, 11, 3, 0, 6, 11, 0, 9, 6, 5, 6, 9, 1, 2, 10, -1}, + {11, 8, 5, 11, 5, 6, 8, 0, 5, 10, 5, 2, 0, 2, 5, -1}, + {6, 11, 3, 6, 3, 5, 2, 10, 3, 10, 5, 3, -1, -1, -1, -1}, + {5, 8, 9, 5, 2, 8, 5, 6, 2, 3, 8, 2, -1, -1, -1, -1}, + {9, 5, 6, 9, 6, 0, 0, 6, 2, -1, -1, -1, -1, -1, -1, -1}, + {1, 5, 8, 1, 8, 0, 5, 6, 8, 3, 8, 2, 6, 2, 8, -1}, + {1, 5, 6, 2, 1, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {1, 3, 6, 1, 6, 10, 3, 8, 6, 5, 6, 9, 8, 9, 6, -1}, + {10, 1, 0, 10, 0, 6, 9, 5, 0, 5, 6, 0, -1, -1, -1, -1}, + {0, 3, 8, 5, 6, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {10, 5, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {11, 5, 10, 7, 5, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {11, 5, 10, 11, 7, 5, 8, 3, 0, -1, -1, -1, -1, -1, -1, -1}, + {5, 11, 7, 5, 10, 11, 1, 9, 0, -1, -1, -1, -1, -1, -1, -1}, + {10, 7, 5, 10, 11, 7, 9, 8, 1, 8, 3, 1, -1, -1, -1, -1}, + {11, 1, 2, 11, 7, 1, 7, 5, 1, -1, -1, -1, -1, -1, -1, -1}, + {0, 8, 3, 1, 2, 7, 1, 7, 5, 7, 2, 11, -1, -1, -1, -1}, + {9, 7, 5, 9, 2, 7, 9, 0, 2, 2, 11, 7, -1, -1, -1, -1}, + {7, 5, 2, 7, 2, 11, 5, 9, 2, 3, 2, 8, 9, 8, 2, -1}, + {2, 5, 10, 2, 3, 5, 3, 7, 5, -1, -1, -1, -1, -1, -1, -1}, + {8, 2, 0, 8, 5, 2, 8, 7, 5, 10, 2, 5, -1, -1, -1, -1}, + {9, 0, 1, 5, 10, 3, 5, 3, 7, 3, 10, 2, -1, -1, -1, -1}, + {9, 8, 2, 9, 2, 1, 8, 7, 2, 10, 2, 5, 7, 5, 2, -1}, + {1, 3, 5, 3, 7, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {0, 8, 7, 0, 7, 1, 1, 7, 5, -1, -1, -1, -1, -1, -1, -1}, + {9, 0, 3, 9, 3, 5, 5, 3, 7, -1, -1, -1, -1, -1, -1, -1}, + {9, 8, 7, 5, 9, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {5, 8, 4, 5, 10, 8, 10, 11, 8, -1, -1, -1, -1, -1, -1, -1}, + {5, 0, 4, 5, 11, 0, 5, 10, 11, 11, 3, 0, -1, -1, -1, -1}, + {0, 1, 9, 8, 4, 10, 8, 10, 11, 10, 4, 5, -1, -1, -1, -1}, + {10, 11, 4, 10, 4, 5, 11, 3, 4, 9, 4, 1, 3, 1, 4, -1}, + {2, 5, 1, 2, 8, 5, 2, 11, 8, 4, 5, 8, -1, -1, -1, -1}, + {0, 4, 11, 0, 11, 3, 4, 5, 11, 2, 11, 1, 5, 1, 11, -1}, + {0, 2, 5, 0, 5, 9, 2, 11, 5, 4, 5, 8, 11, 8, 5, -1}, + {9, 4, 5, 2, 11, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {2, 5, 10, 3, 5, 2, 3, 4, 5, 3, 8, 4, -1, -1, -1, -1}, + {5, 10, 2, 5, 2, 4, 4, 2, 0, -1, -1, -1, -1, -1, -1, -1}, + {3, 10, 2, 3, 5, 10, 3, 8, 5, 4, 5, 8, 0, 1, 9, -1}, + {5, 10, 2, 5, 2, 4, 1, 9, 2, 9, 4, 2, -1, -1, -1, -1}, + {8, 4, 5, 8, 5, 3, 3, 5, 1, -1, -1, -1, -1, -1, -1, -1}, + {0, 4, 5, 1, 0, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {8, 4, 5, 8, 5, 3, 9, 0, 5, 0, 3, 5, -1, -1, -1, -1}, + {9, 4, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {4, 11, 7, 4, 9, 11, 9, 10, 11, -1, -1, -1, -1, -1, -1, -1}, + {0, 8, 3, 4, 9, 7, 9, 11, 7, 9, 10, 11, -1, -1, -1, -1}, + {1, 10, 11, 1, 11, 4, 1, 4, 0, 7, 4, 11, -1, -1, -1, -1}, + {3, 1, 4, 3, 4, 8, 1, 10, 4, 7, 4, 11, 10, 11, 4, -1}, + {4, 11, 7, 9, 11, 4, 9, 2, 11, 9, 1, 2, -1, -1, -1, -1}, + {9, 7, 4, 9, 11, 7, 9, 1, 11, 2, 11, 1, 0, 8, 3, -1}, + {11, 7, 4, 11, 4, 2, 2, 4, 0, -1, -1, -1, -1, -1, -1, -1}, + {11, 7, 4, 11, 4, 2, 8, 3, 4, 3, 2, 4, -1, -1, -1, -1}, + {2, 9, 10, 2, 7, 9, 2, 3, 7, 7, 4, 9, -1, -1, -1, -1}, + {9, 10, 7, 9, 7, 4, 10, 2, 7, 8, 7, 0, 2, 0, 7, -1}, + {3, 7, 10, 3, 10, 2, 7, 4, 10, 1, 10, 0, 4, 0, 10, -1}, + {1, 10, 2, 8, 7, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {4, 9, 1, 4, 1, 7, 7, 1, 3, -1, -1, -1, -1, -1, -1, -1}, + {4, 9, 1, 4, 1, 7, 0, 8, 1, 8, 7, 1, -1, -1, -1, -1}, + {4, 0, 3, 7, 4, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {4, 8, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {9, 10, 8, 10, 11, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {3, 0, 9, 3, 9, 11, 11, 9, 10, -1, -1, -1, -1, -1, -1, -1}, + {0, 1, 10, 0, 10, 8, 8, 10, 11, -1, -1, -1, -1, -1, -1, -1}, + {3, 1, 10, 11, 3, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {1, 2, 11, 1, 11, 9, 9, 11, 8, -1, -1, -1, -1, -1, -1, -1}, + {3, 0, 9, 3, 9, 11, 1, 2, 9, 2, 11, 9, -1, -1, -1, -1}, + {0, 2, 11, 8, 0, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {3, 2, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {2, 3, 8, 2, 8, 10, 10, 8, 9, -1, -1, -1, -1, -1, -1, -1}, + {9, 10, 2, 0, 9, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {2, 3, 8, 2, 8, 10, 0, 1, 8, 1, 10, 8, -1, -1, -1, -1}, + {1, 10, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {1, 3, 8, 9, 1, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {0, 9, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {0, 3, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, + {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}}; + + + private int[] edgeTable = new int[] { + 0x0 , 0x109, 0x203, 0x30a, 0x406, 0x50f, 0x605, 0x70c, + 0x80c, 0x905, 0xa0f, 0xb06, 0xc0a, 0xd03, 0xe09, 0xf00, + 0x190, 0x99 , 0x393, 0x29a, 0x596, 0x49f, 0x795, 0x69c, + 0x99c, 0x895, 0xb9f, 0xa96, 0xd9a, 0xc93, 0xf99, 0xe90, + 0x230, 0x339, 0x33 , 0x13a, 0x636, 0x73f, 0x435, 0x53c, + 0xa3c, 0xb35, 0x83f, 0x936, 0xe3a, 0xf33, 0xc39, 0xd30, + 0x3a0, 0x2a9, 0x1a3, 0xaa , 0x7a6, 0x6af, 0x5a5, 0x4ac, + 0xbac, 0xaa5, 0x9af, 0x8a6, 0xfaa, 0xea3, 0xda9, 0xca0, + 0x460, 0x569, 0x663, 0x76a, 0x66 , 0x16f, 0x265, 0x36c, + 0xc6c, 0xd65, 0xe6f, 0xf66, 0x86a, 0x963, 0xa69, 0xb60, + 0x5f0, 0x4f9, 0x7f3, 0x6fa, 0x1f6, 0xff , 0x3f5, 0x2fc, + 0xdfc, 0xcf5, 0xfff, 0xef6, 0x9fa, 0x8f3, 0xbf9, 0xaf0, + 0x650, 0x759, 0x453, 0x55a, 0x256, 0x35f, 0x55 , 0x15c, + 0xe5c, 0xf55, 0xc5f, 0xd56, 0xa5a, 0xb53, 0x859, 0x950, + 0x7c0, 0x6c9, 0x5c3, 0x4ca, 0x3c6, 0x2cf, 0x1c5, 0xcc , + 0xfcc, 0xec5, 0xdcf, 0xcc6, 0xbca, 0xac3, 0x9c9, 0x8c0, + 0x8c0, 0x9c9, 0xac3, 0xbca, 0xcc6, 0xdcf, 0xec5, 0xfcc, + 0xcc , 0x1c5, 0x2cf, 0x3c6, 0x4ca, 0x5c3, 0x6c9, 0x7c0, + 0x950, 0x859, 0xb53, 0xa5a, 0xd56, 0xc5f, 0xf55, 0xe5c, + 0x15c, 0x55 , 0x35f, 0x256, 0x55a, 0x453, 0x759, 0x650, + 0xaf0, 0xbf9, 0x8f3, 0x9fa, 0xef6, 0xfff, 0xcf5, 0xdfc, + 0x2fc, 0x3f5, 0xff , 0x1f6, 0x6fa, 0x7f3, 0x4f9, 0x5f0, + 0xb60, 0xa69, 0x963, 0x86a, 0xf66, 0xe6f, 0xd65, 0xc6c, + 0x36c, 0x265, 0x16f, 0x66 , 0x76a, 0x663, 0x569, 0x460, + 0xca0, 0xda9, 0xea3, 0xfaa, 0x8a6, 0x9af, 0xaa5, 0xbac, + 0x4ac, 0x5a5, 0x6af, 0x7a6, 0xaa , 0x1a3, 0x2a9, 0x3a0, + 0xd30, 0xc39, 0xf33, 0xe3a, 0x936, 0x83f, 0xb35, 0xa3c, + 0x53c, 0x435, 0x73f, 0x636, 0x13a, 0x33 , 0x339, 0x230, + 0xe90, 0xf99, 0xc93, 0xd9a, 0xa96, 0xb9f, 0x895, 0x99c, + 0x69c, 0x795, 0x49f, 0x596, 0x29a, 0x393, 0x99 , 0x190, + 0xf00, 0xe09, 0xd03, 0xc0a, 0xb06, 0xa0f, 0x905, 0x80c, + 0x70c, 0x605, 0x50f, 0x406, 0x30a, 0x203, 0x109, 0x0 }; + } +} From deb18acaf17d60bbe52097829e42528a537009b8 Mon Sep 17 00:00:00 2001 From: mika Date: Tue, 10 Mar 2020 15:58:27 +0200 Subject: [PATCH 147/231] Create HueContrastSaturation.shader --- .../3D/Standard/HueContrastSaturation.shader | 89 +++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 Assets/Shaders/3D/Standard/HueContrastSaturation.shader diff --git a/Assets/Shaders/3D/Standard/HueContrastSaturation.shader b/Assets/Shaders/3D/Standard/HueContrastSaturation.shader new file mode 100644 index 0000000..ede2a56 --- /dev/null +++ b/Assets/Shaders/3D/Standard/HueContrastSaturation.shader @@ -0,0 +1,89 @@ +// source https://forum.unity.com/threads/adding-hue-saturation-and-contrast-to-standardshader.843697/#post-5572063 + +Shader "UnityLibrary/Standard/HueContrastSaturation" +{ + Properties + { + _Color ("Color", Color) = (1,1,1,1) + _MainTex ("Albedo Map", 2D) = "black" {} + _BumpMap ("Normal Map", 2D) = "bump" {} + _MetallicGlossMap ("Metallic (R) Smoothness (A) Map", 2D) = "black" {} + _Hue ("Hue", Float) = 1.0 + _Contrast ("Contrast", Float) = 1.0 + _Saturation ("Saturation", Float) = 1.0 + } + + Subshader + { + Tags { "RenderType" = "Opaque" } + CGPROGRAM + #pragma surface SurfaceShader Standard fullforwardshadows addshadow + + sampler2D _MainTex, _BumpMap, _MetallicGlossMap; + float4 _Color; + float _Hue, _Contrast, _Saturation; + + float4x4 contrastMatrix (float c) + { + float t = (1.0 - c) * 0.5; + return float4x4 (c, 0, 0, 0, 0, c, 0, 0, 0, 0, c, 0, t, t, t, 1); + } + + float3 RGBToHSV(float3 c) + { + float4 K = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + float4 p = lerp( float4( c.bg, K.wz ), float4( c.gb, K.xy ), step( c.b, c.g ) ); + float4 q = lerp( float4( p.xyw, c.r ), float4( c.r, p.yzx ), step( p.x, c.r ) ); + float d = q.x - min( q.w, q.y ); + float e = 1.0e-10; + return float3( abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + } + + float3 HSVToRGB( float3 c ) + { + float4 K = float4( 1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0 ); + float3 p = abs( frac( c.xxx + K.xyz ) * 6.0 - K.www ); + return c.z * lerp( K.xxx, saturate( p - K.xxx ), c.y ); + } + + float3 Hue( float3 p, float v ) + { + p = RGBToHSV(p); + p.x *= v; + return HSVToRGB(p); + } + + float3 Saturation( float3 p, float v ) + { + p = RGBToHSV(p); + p.y *= v; + return HSVToRGB(p); + } + + float3 Contrast( float3 p, float v ) + { + return mul(float4(p,1.0), contrastMatrix(v)).rgb; + } + + struct Input + { + float2 uv_MainTex; + float2 uv_BumpMap; + float2 uv_MetallicGlossMap; + }; + + void SurfaceShader (Input IN, inout SurfaceOutputStandard o) + { + float4 color = tex2D(_MainTex,IN.uv_MainTex) * _Color; + color.rgb = Hue(color.rgb, _Hue); + color.rgb = Saturation(color.rgb, _Saturation); + color.rgb = Contrast(color.rgb, _Contrast); + o.Albedo = color; + o.Normal = UnpackNormal (tex2D(_BumpMap, IN.uv_BumpMap)); + o.Metallic = tex2D(_MetallicGlossMap, IN.uv_MetallicGlossMap).r; + o.Smoothness = tex2D(_MetallicGlossMap, IN.uv_MetallicGlossMap).a; + } + + ENDCG + } +} From 7da698ce01053da161b2f7174cea2f73b0690fca Mon Sep 17 00:00:00 2001 From: mika Date: Wed, 11 Mar 2020 11:12:47 +0200 Subject: [PATCH 148/231] Create MeshCombineWizard.cs --- .../Scripts/Editor/Mesh/MeshCombineWizard.cs | 127 ++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 Assets/Scripts/Editor/Mesh/MeshCombineWizard.cs diff --git a/Assets/Scripts/Editor/Mesh/MeshCombineWizard.cs b/Assets/Scripts/Editor/Mesh/MeshCombineWizard.cs new file mode 100644 index 0000000..5406c35 --- /dev/null +++ b/Assets/Scripts/Editor/Mesh/MeshCombineWizard.cs @@ -0,0 +1,127 @@ +// from https://forum.unity.com/threads/mesh-combine-wizard-free-unity-tool-source-code.444483/#post-5575042 + +using UnityEngine; +using UnityEditor; +using System.Collections.Generic; +using System.Linq; + +namespace UnityLibrary +{ + public class MeshCombineWizard : ScriptableWizard + { + public GameObject parentOfObjectsToCombine; + + [MenuItem("E.S. Tools/Mesh Combine Wizard")] + static void CreateWizard() + { + ScriptableWizard.DisplayWizard("Mesh Combine Wizard"); + } + + void OnWizardCreate() + { + if (parentOfObjectsToCombine == null) return; + + Vector3 originalPosition = parentOfObjectsToCombine.transform.position; + parentOfObjectsToCombine.transform.position = Vector3.zero; + + MeshFilter[] meshFilters = parentOfObjectsToCombine.GetComponentsInChildren(); + Dictionary> materialToMeshFilterList = new Dictionary>(); + List combinedObjects = new List(); + + for (int i = 0; i < meshFilters.Length; i++) + { + var materials = meshFilters[i].GetComponent().sharedMaterials; + if (materials == null) continue; + if (materials.Length > 1) + { + parentOfObjectsToCombine.transform.position = originalPosition; + Debug.LogError("Objects with multiple materials on the same mesh are not supported. Create multiple meshes from this object's sub-meshes in an external 3D tool and assign separate materials to each."); + return; + } + var material = materials[0]; + if (materialToMeshFilterList.ContainsKey(material)) materialToMeshFilterList[material].Add(meshFilters[i]); + else materialToMeshFilterList.Add(material, new List() { meshFilters[i] }); + } + + + // NC 03/2020 changes the loop to create meshes smaller than 695536 vertices + foreach (var entry in materialToMeshFilterList) + { + // get list of each meshes order by number of vertices + List meshesWithSameMaterial = entry.Value.OrderByDescending(mf => mf.sharedMesh.vertexCount).ToList(); + // split into bins of 65536 vertices max + int nrMeshes = meshesWithSameMaterial.Count; + while (nrMeshes > 0) + { + string materialName = entry.Key.ToString().Split(' ')[0]; + List meshBin = new List(); + meshBin.Add(meshesWithSameMaterial[0]); + meshesWithSameMaterial.RemoveAt(0); + nrMeshes--; + // add meshes in bin until 65536 vertices is reached + for (int i = 0; i < meshesWithSameMaterial.Count; i++) + { + if (meshBin.Sum(mf => mf.sharedMesh.vertexCount) + meshesWithSameMaterial[i].sharedMesh.vertexCount < 65536) + { + meshBin.Add(meshesWithSameMaterial[i]); + meshesWithSameMaterial.RemoveAt(i); + i--; + nrMeshes--; + } + } + + // merge this bin + CombineInstance[] combine = new CombineInstance[meshBin.Count]; + for (int i = 0; i < meshBin.Count; i++) + { + combine[i].mesh = meshBin[i].sharedMesh; + combine[i].transform = meshBin[i].transform.localToWorldMatrix; + } + Mesh combinedMesh = new Mesh(); + combinedMesh.CombineMeshes(combine); + + // save the mesh + materialName += "_" + combinedMesh.GetInstanceID(); + if (meshBin.Count > 1) + { + AssetDatabase.CreateAsset(combinedMesh, "Assets/CombinedMeshes_" + materialName + ".asset"); ; + } + + // assign the mesh to a new go + string goName = (materialToMeshFilterList.Count > 1) ? "CombinedMeshes_" + materialName : "CombinedMeshes_" + parentOfObjectsToCombine.name; + GameObject combinedObject = new GameObject(goName); + var filter = combinedObject.AddComponent(); + if (meshBin.Count > 1) + { + filter.sharedMesh = combinedMesh; + } + else + { + filter.sharedMesh = meshBin[0].sharedMesh; // the original mesh + } + var renderer = combinedObject.AddComponent(); + renderer.sharedMaterial = entry.Key; + combinedObjects.Add(combinedObject); + } + } + + GameObject resultGO = null; + if (combinedObjects.Count > 1) + { + resultGO = new GameObject("CombinedMeshes_" + parentOfObjectsToCombine.name); + foreach (var combinedObject in combinedObjects) combinedObject.transform.parent = resultGO.transform; + } + else + { + resultGO = combinedObjects[0]; + } + + Object prefab = PrefabUtility.CreateEmptyPrefab("Assets/" + resultGO.name + ".prefab"); + PrefabUtility.ReplacePrefab(resultGO, prefab, ReplacePrefabOptions.ConnectToPrefab); + + parentOfObjectsToCombine.SetActive(false); + parentOfObjectsToCombine.transform.position = originalPosition; + resultGO.transform.position = originalPosition; + } + } +} From ef1910f145f72db3e64fb157ef1c66e8d8d21d67 Mon Sep 17 00:00:00 2001 From: mika Date: Fri, 13 Mar 2020 14:59:49 +0200 Subject: [PATCH 149/231] Create ScrollingFill.shader --- .../Shaders/2D/Patterns/ScrollingFill.shader | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 Assets/Shaders/2D/Patterns/ScrollingFill.shader diff --git a/Assets/Shaders/2D/Patterns/ScrollingFill.shader b/Assets/Shaders/2D/Patterns/ScrollingFill.shader new file mode 100644 index 0000000..f6e685e --- /dev/null +++ b/Assets/Shaders/2D/Patterns/ScrollingFill.shader @@ -0,0 +1,70 @@ +// animated scrolling texture with fill amount +// https://unitycoder.com/blog/2020/03/13/shader-scrolling-texture-with-fill-amount/ + +Shader "UnityLibrary/Patterns/ScrollingFill" +{ + Properties + { + _MainTex ("Texture", 2D) = "white" {} + _Fill("Fill", Range(0.0,1.0)) = 0.5 + _Speed("Speed", float) = 5 + } + + SubShader + { + Tags { "RenderType"="Opaque" } + LOD 100 + + Pass + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + #include "UnityCG.cginc" + + struct appdata + { + float4 vertex : POSITION; + float2 uv : TEXCOORD0; + }; + + struct v2f + { + float2 uv : TEXCOORD0; + float4 vertex : SV_POSITION; + }; + + sampler2D _MainTex; + float4 _MainTex_ST; + float _Fill; + float _Speed; + + v2f vert (appdata v) + { + v2f o; + o.vertex = UnityObjectToClipPos(v.vertex); + o.uv = TRANSFORM_TEX(v.uv, _MainTex); + return o; + } + + fixed4 frag(v2f i) : SV_Target + { + // get scroll value + float2 scroll = float2(0, frac(_Time.x*_Speed)); + + // sample texture + fixed4 col = tex2D(_MainTex, i.uv -scroll); + + // discard if uv.y is below below cut value + clip(step(i.uv.y, _Fill * _MainTex_ST.y)-0.1); + + return col; + + // make un-animated part black + //return col*step(i.uv.y, _Cut * _MainTex_ST.y); + } + ENDCG + } + } +} From ac11c0ee0d42efd86d962e576eb64c979df6058a Mon Sep 17 00:00:00 2001 From: mika Date: Wed, 18 Mar 2020 17:47:12 +0200 Subject: [PATCH 150/231] Create ColorCycle.shader --- Assets/Shaders/2D/Effects/ColorCycle.shader | 64 +++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 Assets/Shaders/2D/Effects/ColorCycle.shader diff --git a/Assets/Shaders/2D/Effects/ColorCycle.shader b/Assets/Shaders/2D/Effects/ColorCycle.shader new file mode 100644 index 0000000..a41acc0 --- /dev/null +++ b/Assets/Shaders/2D/Effects/ColorCycle.shader @@ -0,0 +1,64 @@ +Shader "UnityLibrary/2D/Effects/ColorCycle" +{ + Properties + { + _MainTex ("Grayscale", 2D) = "white" {} + _GradientTex ("Gradient", 2D) = "white" {} + _Speed("Speed",float) = 1 + } + + SubShader + { + Tags { "RenderType"="Opaque" } + LOD 100 + + Pass + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + #include "UnityCG.cginc" + + struct appdata + { + float4 vertex : POSITION; + float2 uv : TEXCOORD0; + }; + + struct v2f + { + float2 uv : TEXCOORD0; + float4 vertex : SV_POSITION; + }; + + sampler2D _MainTex; + sampler2D _GradientTex; + float4 _MainTex_ST; + float _Speed; + + v2f vert (appdata v) + { + v2f o; + o.vertex = UnityObjectToClipPos(v.vertex); + o.uv = TRANSFORM_TEX(v.uv, _MainTex); + return o; + } + + fixed4 frag (v2f i) : SV_Target + { + // get (grayscale texture) pixel color + float gray = tex2D(_MainTex, i.uv).r; + + // get scrolling + float scroll = frac(_Time.x*_Speed); + + // get gradient color from texture + fixed4 col = tex2D(_GradientTex,float2(gray+scroll,0.5)); + + return col; + } + ENDCG + } + } +} From e1c6de5dc3e97ed1c81e5d652cecc185e05e1e0a Mon Sep 17 00:00:00 2001 From: mika Date: Fri, 17 Apr 2020 15:44:47 +0300 Subject: [PATCH 151/231] fix top10 sorting, add gameobject ping button, show top20 --- .../Editor/Tools/GetSelectedMeshInfo.cs | 56 +++++++++++++------ 1 file changed, 38 insertions(+), 18 deletions(-) diff --git a/Assets/Scripts/Editor/Tools/GetSelectedMeshInfo.cs b/Assets/Scripts/Editor/Tools/GetSelectedMeshInfo.cs index 6124981..67164bd 100644 --- a/Assets/Scripts/Editor/Tools/GetSelectedMeshInfo.cs +++ b/Assets/Scripts/Editor/Tools/GetSelectedMeshInfo.cs @@ -1,6 +1,7 @@ // display selected gameobject mesh stats (should work on prefabs,models in project window also) using System.Collections.Generic; +using System.Linq; using UnityEditor; using UnityEngine; @@ -14,7 +15,9 @@ public class GetSelectedMeshInfo : EditorWindow int totalVertices = 0; int totalTris = 0; - List top10 = new List(); + Dictionary topList = new Dictionary(); + IOrderedEnumerable> sortedTopList; + MeshFilter[] meshes; [MenuItem("Tools/UnityLibrary/GetMeshInfo")] @@ -26,21 +29,32 @@ public static void ShowWindow() void OnGUI() { + // TODO process all selected gameobjects var selection = Selection.activeGameObject; - if (selection != null) + + // if have selection + if (selection == null) + { + EditorGUILayout.LabelField("Select gameobject from scene or hierarchy.."); + + } + else { EditorGUILayout.LabelField("Selected: " + selection.name); // update mesh info only if selection changed if (selectionChanged == true) { - top10.Clear(); + selectionChanged = false; + + // clear old top results + topList.Clear(); totalMeshes = 0; totalVertices = 0; totalTris = 0; - // get all meshes + // check all meshes meshes = selection.GetComponentsInChildren(); for (int i = 0, length = meshes.Length; i < length; i++) { @@ -48,12 +62,11 @@ void OnGUI() totalVertices += verts; totalTris += meshes[i].sharedMesh.triangles.Length / 3; totalMeshes++; - top10.Add(verts); + topList.Add(i, verts); } - selectionChanged = false; - // sort top10 - top10.Sort(); + // sort top list + sortedTopList = topList.OrderByDescending(x => x.Value); } // display stats @@ -61,23 +74,30 @@ void OnGUI() EditorGUILayout.LabelField("Vertices: " + totalVertices); EditorGUILayout.LabelField("Triangles: " + totalTris); EditorGUILayout.Space(); - EditorGUILayout.LabelField("TOP 10", EditorStyles.boldLabel); + EditorGUILayout.LabelField("TOP 20", EditorStyles.boldLabel); // top 10 - if (meshes != null) + if (meshes != null && sortedTopList != null) { - // start from last index - int from = meshes.Length; - // until 10 meshes or if less than 10 - int to = meshes.Length - Mathf.Min(10, from); - for (int i = from-1; i >= to; i--) + int i = 0; + foreach (var item in sortedTopList) { - int percent = (int)(top10[i] / (float)totalVertices * 100f); - EditorGUILayout.LabelField(meshes[i].name + " = " + top10[i] + " (" + percent + "%)"); + int percent = (int)(item.Value / (float)totalVertices * 100f); + EditorGUILayout.BeginHorizontal(); + // ping button + if (GUILayout.Button(" ", GUILayout.Width(16))) + { + EditorGUIUtility.PingObject(meshes[i].transform); + } + EditorGUILayout.LabelField(meshes[i].name + " = " + item.Value + " (" + percent + "%)"); + GUILayout.ExpandWidth(true); + EditorGUILayout.EndHorizontal(); + + // show only first 20 + if (++i > 20) break; } } } - } void OnSelectionChange() From 8bae538af93957b15f9233b68266d09081f37ce7 Mon Sep 17 00:00:00 2001 From: mika Date: Fri, 29 May 2020 11:39:52 +0300 Subject: [PATCH 152/231] Create SetBoxColliderToUI.cs --- .../Editor/ContextMenu/SetBoxColliderToUI.cs | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 Assets/Scripts/Editor/ContextMenu/SetBoxColliderToUI.cs diff --git a/Assets/Scripts/Editor/ContextMenu/SetBoxColliderToUI.cs b/Assets/Scripts/Editor/ContextMenu/SetBoxColliderToUI.cs new file mode 100644 index 0000000..6b58cf5 --- /dev/null +++ b/Assets/Scripts/Editor/ContextMenu/SetBoxColliderToUI.cs @@ -0,0 +1,32 @@ +// Tries to move BoxCollider(3D)-component to match UI panel/image position, by adjusting collider pivot value + +using UnityEngine; +using UnityEditor; + +namespace UnityLibrary +{ + public class SetBoxColliderToUI : MonoBehaviour + { + [MenuItem("CONTEXT/BoxCollider/Match Position to UI")] + static void FixPosition(MenuCommand command) + { + BoxCollider b = (BoxCollider)command.context; + + // record undo + Undo.RecordObject(b.transform, "Set Box Collider To UI"); + + // fix pos from Pivot + var r = b.gameObject.GetComponent(); + if (r == null) return; + + //Debug.Log("pivot "+r.pivot); + + var center = b.center; + + center.x = 0.5f - r.pivot.x; + center.y = 0.5f - r.pivot.y; + + b.center = center; + } + } +} From fcdbc8c57e9c1094a25683b8e78169861b14c863 Mon Sep 17 00:00:00 2001 From: mika Date: Thu, 11 Jun 2020 13:10:10 +0300 Subject: [PATCH 153/231] Create BoxColliderFitChildren.cs --- .../ContextMenu/BoxColliderFitChildren.cs | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 Assets/Scripts/Editor/ContextMenu/BoxColliderFitChildren.cs diff --git a/Assets/Scripts/Editor/ContextMenu/BoxColliderFitChildren.cs b/Assets/Scripts/Editor/ContextMenu/BoxColliderFitChildren.cs new file mode 100644 index 0000000..4e5f0a5 --- /dev/null +++ b/Assets/Scripts/Editor/ContextMenu/BoxColliderFitChildren.cs @@ -0,0 +1,45 @@ +// Adjust Box Collider to fit child meshes inside +// usage: You have empty parent transform, with child meshes inside, add box collider to parent then use this + +using UnityEngine; +using UnityEditor; + +namespace UnityLibrary +{ + public class BoxColliderFitChildren : MonoBehaviour + { + [MenuItem("CONTEXT/BoxCollider/Fit to Children")] + static void FixSize(MenuCommand command) + { + BoxCollider col = (BoxCollider)command.context; + + // record undo + Undo.RecordObject(col.transform, "Fit Box Collider To Children"); + + // get child mesh bounds + var b = GetRecursiveMeshBounds(col.gameObject); + + // set collider local center and size + col.center = col.transform.root.InverseTransformVector(b.center) - col.transform.position; + col.size = b.size; + } + + public static Bounds GetRecursiveMeshBounds(GameObject go) + { + var r = go.GetComponentsInChildren(); + if (r.Length > 0) + { + var b = r[0].bounds; + for (int i = 1; i < r.Length; i++) + { + b.Encapsulate(r[i].bounds); + } + return b; + } + else // TODO no renderers + { + return new Bounds(Vector3.one, Vector3.one); + } + } + } +} From b3270aedc8287d80690ef4b034784d5399fee002 Mon Sep 17 00:00:00 2001 From: mika Date: Thu, 11 Jun 2020 13:18:35 +0300 Subject: [PATCH 154/231] Update BoxColliderFitChildren.cs --- Assets/Scripts/Editor/ContextMenu/BoxColliderFitChildren.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Assets/Scripts/Editor/ContextMenu/BoxColliderFitChildren.cs b/Assets/Scripts/Editor/ContextMenu/BoxColliderFitChildren.cs index 4e5f0a5..58f7b0d 100644 --- a/Assets/Scripts/Editor/ContextMenu/BoxColliderFitChildren.cs +++ b/Assets/Scripts/Editor/ContextMenu/BoxColliderFitChildren.cs @@ -1,5 +1,6 @@ // Adjust Box Collider to fit child meshes inside -// usage: You have empty parent transform, with child meshes inside, add box collider to parent then use this +// Usage: You have empty parent transform, with child meshes inside, add box collider to parent then use this +// NOTE: Doesnt work if root transform is rotated using UnityEngine; using UnityEditor; From c4d5a3e508239b6442db8b18eda9730dd8eafd63 Mon Sep 17 00:00:00 2001 From: LashaBuxo Date: Sun, 14 Jun 2020 16:10:57 +0400 Subject: [PATCH 155/231] Fixed VideoPlayer error while opening in 2017 version --- .../Scripts/Editor/ContextMenu/GetVideoAspectRatioEditor.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Assets/Scripts/Editor/ContextMenu/GetVideoAspectRatioEditor.cs b/Assets/Scripts/Editor/ContextMenu/GetVideoAspectRatioEditor.cs index 23c6600..b15992c 100644 --- a/Assets/Scripts/Editor/ContextMenu/GetVideoAspectRatioEditor.cs +++ b/Assets/Scripts/Editor/ContextMenu/GetVideoAspectRatioEditor.cs @@ -19,7 +19,12 @@ static void DoubleMass(MenuCommand command) Debug.LogError("No videoclip assigned.."); return; } +#if UNITY_2017 + float aspectRatioY = v.texture.height / (float)v.texture.width; +#else float aspectRatioY = v.height / (float)v.width; +#endif + // record undo Undo.RecordObject(v.transform, "Set scale"); From 724808441c49602fc8a8efa6c3bc63a7ef6a3ff4 Mon Sep 17 00:00:00 2001 From: mika Date: Thu, 2 Jul 2020 11:12:44 +0300 Subject: [PATCH 156/231] Create CompileTime.cs --- Assets/Scripts/Editor/Tools/CompileTime.cs | 201 +++++++++++++++++++++ 1 file changed, 201 insertions(+) create mode 100644 Assets/Scripts/Editor/Tools/CompileTime.cs diff --git a/Assets/Scripts/Editor/Tools/CompileTime.cs b/Assets/Scripts/Editor/Tools/CompileTime.cs new file mode 100644 index 0000000..89721bc --- /dev/null +++ b/Assets/Scripts/Editor/Tools/CompileTime.cs @@ -0,0 +1,201 @@ +// compile time tracking tool (and quickly enable disable settings, and scene autosave option) +// original source: https://gist.github.com/spajus/72a74146b1bbeddd44a66e1b8a3c829c +// created by https://github.com/spajus twitch https://www.twitch.tv/dev_spajus +// 02.07.2020 added unity_2018_4 check and set autosave off by default - unitycoder.com + +using System; +using System.Collections.Generic; +using UnityEditor; +using UnityEditor.Compilation; +using UnityEditor.SceneManagement; +using UnityEngine; + +namespace UnityLibrary +{ + class CompileTime : EditorWindow + { + bool allowProfiler = false; + bool isTrackingTime; + bool isLockReload; + bool isAutoSave = false; // autosave default off + bool isLocked; + bool restartAfterCompile; + bool memoryWarned; + string lastReloadTime = ""; + string lastCompileTime = ""; + string lastAssCompileTime = ""; + double startTime, finishTime, compileTime, reloadTime; + double assStartTime, assFinishTime, assCompileTime; + Dictionary startTimes = new Dictionary(); + List lastAssCompile; + + [MenuItem("Tools/UnityLibrary/Compile Time")] + public static void Init() + { + EditorWindow.GetWindow(typeof(CompileTime)); + } + + void Update() + { + if (isLockReload) { return; } + if (EditorApplication.isCompiling && !isTrackingTime) + { + if (EditorApplication.isPlaying) + { + restartAfterCompile = true; + EditorApplication.isPlaying = false; + } + startTime = EditorApplication.timeSinceStartup; + lastReloadTime = "Reloading now"; + lastCompileTime = "Compiling now"; + lastAssCompile = new List(); + Debug.Log("Started compiling scripts"); + isTrackingTime = true; + } + else if (!EditorApplication.isCompiling && isTrackingTime) + { + finishTime = EditorApplication.timeSinceStartup; + isTrackingTime = false; + EditorApplication.Beep(); + reloadTime = finishTime - startTime; + lastReloadTime = reloadTime.ToString("0.000") + "s"; + compileTime = reloadTime - assCompileTime; + lastCompileTime = compileTime.ToString("0.000") + "s"; + if (isAutoSave && !EditorApplication.isPlaying) + { + Debug.Log("Auto Saving Scene"); + EditorSceneManager.SaveOpenScenes(); + } + if (restartAfterCompile) + { + restartAfterCompile = false; + EditorApplication.isPlaying = true; + } + } + } + + void OnGUI() + { +#if UNITY_2018_4_OR_NEWER + // Toggle domain reload + var playModeOptsEnabled = EditorSettings.enterPlayModeOptionsEnabled; + playModeOptsEnabled = EditorGUILayout.Toggle("Disable Domain Reload", playModeOptsEnabled); + EditorSettings.enterPlayModeOptionsEnabled = playModeOptsEnabled; +#endif + + if (UnityEngine.Profiling.Profiler.enabled) + { + EditorGUILayout.LabelField("PROFILER ENABLED"); + } + allowProfiler = EditorGUILayout.Toggle("Allow profiler", allowProfiler); + if (!allowProfiler && UnityEngine.Profiling.Profiler.enabled) + { + UnityEngine.Profiling.Profiler.enabled = false; + } + EditorGUILayout.LabelField("Time", Time.realtimeSinceStartup.ToString()); + float m1 = (UnityEngine.Profiling.Profiler.GetTotalAllocatedMemoryLong() / 1024f / 1024f); + float m2 = (UnityEngine.Profiling.Profiler.GetAllocatedMemoryForGraphicsDriver() / 1024f / 1024f); + float m3 = (UnityEngine.Profiling.Profiler.GetTotalReservedMemoryLong() / 1024f / 1024f); + float m = m1 + m2 + m3; + if (m > 10000 && !memoryWarned) + { + memoryWarned = true; + EditorApplication.Beep(); + Debug.LogError("Memory over 10000MB!"); + allowProfiler = false; + UnityEngine.Profiling.Profiler.enabled = false; + } + if (m < 8000 && memoryWarned) + { + memoryWarned = false; + } + EditorGUILayout.LabelField("Memory used:", m.ToString("0.00") + " MB"); + + isLockReload = EditorGUILayout.Toggle("Lock assembly reload", isLockReload); + isAutoSave = EditorGUILayout.Toggle("Auto Save", isAutoSave); + EditorGUILayout.LabelField("Full reload", lastReloadTime); + EditorGUILayout.LabelField("Compile", lastCompileTime); + if (lastAssCompileTime != null) + { + EditorGUILayout.LabelField("Assembly reload", lastAssCompileTime); + } + // For mysterious reason, iterating over a dictionary doesn't work, it gets empty! + if (lastAssCompile != null) + { + foreach (string s in lastAssCompile) + { + var ss = s.Split(':'); + EditorGUILayout.LabelField(ss[0], ss[1]); + } + } + + if (isLockReload) + { + if (!isLocked) + { + Debug.Log("Locking reload of assemblies"); + EditorApplication.LockReloadAssemblies(); + isLocked = true; + } + } + else + { + if (isLocked) + { + Debug.Log("Unlocking reload of assemblies"); + EditorApplication.UnlockReloadAssemblies(); + isLocked = false; + } + } + } + + void OnBeforeAssemblyReload() + { + assStartTime = EditorApplication.timeSinceStartup; + this.ShowNotification(new GUIContent("Started assembly reload")); + } + + void OnAfterAssemblyReload() + { + assFinishTime = EditorApplication.timeSinceStartup; + assCompileTime = assFinishTime - assStartTime; + lastAssCompileTime = assCompileTime.ToString("0.000") + "s"; + } + + void CompilationPipelineOnAssemblyCompilationStarted(string assembly) + { + Debug.Log("Assembly compile started: " + assembly); + startTimes[assembly] = DateTime.UtcNow; + } + + void CompilationPipelineOnAssemblyCompilationFinished(string assembly, CompilerMessage[] arg2) + { + var time = startTimes[assembly]; + var timeSpan = DateTime.UtcNow - startTimes[assembly]; + var bt = string.Format("{0:0.00}s", timeSpan.TotalMilliseconds / 1000f); + var cleanAss = assembly.Replace("Library/ScriptAssemblies/", ""); + + if (lastAssCompile != null) + { + lastAssCompile.Add(cleanAss + ":" + bt); + } + Debug.Log("Assembly compile ended: " + assembly + " in " + bt); + } + + void OnEnable() + { + AssemblyReloadEvents.beforeAssemblyReload += OnBeforeAssemblyReload; + AssemblyReloadEvents.afterAssemblyReload += OnAfterAssemblyReload; + CompilationPipeline.assemblyCompilationStarted += CompilationPipelineOnAssemblyCompilationStarted; + CompilationPipeline.assemblyCompilationFinished += CompilationPipelineOnAssemblyCompilationFinished; + } + + void OnDisable() + { + AssemblyReloadEvents.beforeAssemblyReload -= OnBeforeAssemblyReload; + AssemblyReloadEvents.afterAssemblyReload -= OnAfterAssemblyReload; + CompilationPipeline.assemblyCompilationStarted -= CompilationPipelineOnAssemblyCompilationStarted; + CompilationPipeline.assemblyCompilationFinished -= CompilationPipelineOnAssemblyCompilationFinished; + } + } +} From 1a4b1937c9bfe07a307fa2519844d9ed174c0990 Mon Sep 17 00:00:00 2001 From: mika Date: Thu, 2 Jul 2020 13:35:54 +0300 Subject: [PATCH 157/231] fix mesh indexes, add tooltip to ping buttons thanks @memo-mgh --- Assets/Scripts/Editor/Tools/GetSelectedMeshInfo.cs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/Assets/Scripts/Editor/Tools/GetSelectedMeshInfo.cs b/Assets/Scripts/Editor/Tools/GetSelectedMeshInfo.cs index 67164bd..d8ddcf3 100644 --- a/Assets/Scripts/Editor/Tools/GetSelectedMeshInfo.cs +++ b/Assets/Scripts/Editor/Tools/GetSelectedMeshInfo.cs @@ -36,7 +36,6 @@ void OnGUI() if (selection == null) { EditorGUILayout.LabelField("Select gameobject from scene or hierarchy.."); - } else { @@ -76,7 +75,7 @@ void OnGUI() EditorGUILayout.Space(); EditorGUILayout.LabelField("TOP 20", EditorStyles.boldLabel); - // top 10 + // top list if (meshes != null && sortedTopList != null) { int i = 0; @@ -85,11 +84,11 @@ void OnGUI() int percent = (int)(item.Value / (float)totalVertices * 100f); EditorGUILayout.BeginHorizontal(); // ping button - if (GUILayout.Button(" ", GUILayout.Width(16))) + if (GUILayout.Button(new GUIContent(" ", "Ping"), GUILayout.Width(16))) { - EditorGUIUtility.PingObject(meshes[i].transform); + EditorGUIUtility.PingObject(meshes[item.Key].transform); } - EditorGUILayout.LabelField(meshes[i].name + " = " + item.Value + " (" + percent + "%)"); + EditorGUILayout.LabelField(meshes[item.Key].name + " = " + item.Value + " (" + percent + "%)"); GUILayout.ExpandWidth(true); EditorGUILayout.EndHorizontal(); From 4e92323a9ba1add50e282439b635b4780788660f Mon Sep 17 00:00:00 2001 From: mika Date: Tue, 7 Jul 2020 17:52:00 +0300 Subject: [PATCH 158/231] Create WhoDisabledOrEnabled.cs --- .../Helpers/Debug/WhoDisabledOrEnabled.cs | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 Assets/Scripts/Helpers/Debug/WhoDisabledOrEnabled.cs diff --git a/Assets/Scripts/Helpers/Debug/WhoDisabledOrEnabled.cs b/Assets/Scripts/Helpers/Debug/WhoDisabledOrEnabled.cs new file mode 100644 index 0000000..5c43b88 --- /dev/null +++ b/Assets/Scripts/Helpers/Debug/WhoDisabledOrEnabled.cs @@ -0,0 +1,20 @@ +// shows who disabled/enabled this gameobject from another script +// usage: attach to gameobject that you want to track (see console stack trace) + +using UnityEngine; + +namespace UnityLibrary +{ + public class WhoDisabledOrEnabled : MonoBehaviour + { + private void OnDisable() + { + Debug.LogError("OnDisable: " + gameObject.name, gameObject); + } + + private void OnEnable() + { + Debug.LogError("OnEnable: " + gameObject.name, gameObject); + } + } +} From c9ea94494867bdfc8af758ee8f573e367d6f1aee Mon Sep 17 00:00:00 2001 From: pkunjam Date: Fri, 17 Jul 2020 10:15:09 +0530 Subject: [PATCH 159/231] Smoothly move a gameobject --- .../ui animation Sample Scene.unity.meta | 8 + .../Scripts/AssetBundles/AssetBundleLoader.cs | 4 +- .../Camera/MarrtsSmoothedMouseLook.cs.meta | 12 + Assets/Scripts/Camera/PlayerMovement.cs | 40 +++ Assets/Scripts/Camera/PlayerMovement.cs.meta | 11 + .../{Editor.meta => Scripts/Docs/Mesh.meta} | 4 +- Assets/Scripts/Docs/Mesh/MeshExample.cs.meta | 12 + .../UnityEngine/CullingGroupExample.cs.meta | 12 + Assets/Scripts/Editor/ContextMenu.meta | 9 + .../BoxColliderFitChildren.cs.meta | 12 + .../CreateOutlineForPanelEditor.cs.meta | 12 + .../GetVideoAspectRatioEditor.cs.meta | 12 + .../ContextMenu/SetBoxColliderToUI.cs.meta | 12 + Assets/Scripts/Editor/GameObject.meta | 9 + .../Editor/GameObject/ResetTransform.cs.meta | 12 + .../Editor/Gizmos/RendererBoundsGizmo.cs.meta | 12 + Assets/Scripts/Editor/Hierarchy.meta | 9 + .../Editor/Hierarchy/UnparentMe.cs.meta | 12 + Assets/Scripts/Editor/Mesh.meta | 9 + .../Scripts/Editor/Mesh/CreatePlane.cs.meta | 12 + .../Editor/Mesh/MeshCombineWizard.cs.meta | 12 + .../Editor/Tools/ColorPickerWindow.cs.meta | 12 + .../Scripts/Editor/Tools/CompileTime.cs.meta | 12 + .../Editor/Tools/ReferenceImageViewer.cs.meta | 12 + .../Editor/Tools/SceneManagerWindow.cs.meta | 12 + .../Editor/Tools/SceneSwitcherWindow.cs.meta | 12 + .../Extensions/MonoBehaviourExtensions.meta | 9 + .../MonoBehaviourExtensions/Example.meta | 9 + .../MonoBehaviorExtensionsExample.cs.meta | 12 + .../MonoBehaviourExtensions.cs.meta | 12 + .../Debug/WhoDisabledOrEnabled.cs.meta | 12 + Assets/Scripts/Mesh.meta | 9 + Assets/Scripts/Mesh/Metaball.cs.meta | 12 + Assets/Scripts/Texture.meta | 9 + .../Texture/GradientTextureMaker.cs.meta | 12 + Assets/Scripts/Tools.meta | 9 + .../Scripts/Tools/TerrainTreeReplacer.cs.meta | 12 + Assets/Scripts/UI/Animation.meta | 9 + .../Scripts/UI/Animation/GrowEffect.cs.meta | 12 + .../UI/Animation/HelicopterGrowEffect.cs.meta | 12 + Assets/Scripts/UI/Animation/ImageFade.cs.meta | 12 + .../UI/Animation/LerpFromOffset.cs.meta | 12 + Assets/Scripts/UI/Animation/Shared.meta | 9 + .../UI/Animation/Shared/Interpolation.cs.meta | 12 + Assets/Shaders/2D/Debug.meta | 9 + .../Shaders/2D/Debug/HSVDebugger.shader.meta | 9 + .../Shaders/2D/Effects/ColorCycle.shader.meta | 9 + Assets/Shaders/2D/Patterns.meta | 9 + .../2D/Patterns/CirclesPattern.shader.meta | 9 + .../2D/Patterns/ScrollingFill.shader.meta | 9 + Assets/Shaders/2D/Special.meta | 9 + .../2D/Special/RayMarching.shader.meta | 9 + .../Shaders/2D/Sprites/FlipBook.shader.meta | 9 + Assets/Shaders/3D/Effects.meta | 9 + .../Standard-SeeThroughWalls.shader.meta | 9 + .../VerticalCameraDistanceFade.shader.meta | 9 + Assets/Shaders/3D/Standard.meta | 9 + .../HueContrastSaturation.shader.meta | 9 + .../3D/Unlit/Reverse-DisIntegrate-Shader.meta | 8 + Assets/Shaders/3D/Water.meta | 9 + Assets/Shaders/3D/Water/WaterBox.shader.meta | 9 + Logs/Packages-Update.log | 67 ++++ Packages/manifest.json | 49 +++ ProjectSettings/EditorSettings.asset | 25 +- ProjectSettings/PresetManager.asset | 7 + ProjectSettings/ProjectSettings.asset | 330 ++++++++++-------- ProjectSettings/ProjectVersion.txt | 3 +- ProjectSettings/VFXManager.asset | 12 + ProjectSettings/XRSettings.asset | 10 + 69 files changed, 1010 insertions(+), 147 deletions(-) create mode 100644 Assets/Scenes/ui animation Sample Scene.unity.meta create mode 100644 Assets/Scripts/Camera/MarrtsSmoothedMouseLook.cs.meta create mode 100644 Assets/Scripts/Camera/PlayerMovement.cs create mode 100644 Assets/Scripts/Camera/PlayerMovement.cs.meta rename Assets/{Editor.meta => Scripts/Docs/Mesh.meta} (67%) create mode 100644 Assets/Scripts/Docs/Mesh/MeshExample.cs.meta create mode 100644 Assets/Scripts/Docs/UnityEngine/CullingGroupExample.cs.meta create mode 100644 Assets/Scripts/Editor/ContextMenu.meta create mode 100644 Assets/Scripts/Editor/ContextMenu/BoxColliderFitChildren.cs.meta create mode 100644 Assets/Scripts/Editor/ContextMenu/CreateOutlineForPanelEditor.cs.meta create mode 100644 Assets/Scripts/Editor/ContextMenu/GetVideoAspectRatioEditor.cs.meta create mode 100644 Assets/Scripts/Editor/ContextMenu/SetBoxColliderToUI.cs.meta create mode 100644 Assets/Scripts/Editor/GameObject.meta create mode 100644 Assets/Scripts/Editor/GameObject/ResetTransform.cs.meta create mode 100644 Assets/Scripts/Editor/Gizmos/RendererBoundsGizmo.cs.meta create mode 100644 Assets/Scripts/Editor/Hierarchy.meta create mode 100644 Assets/Scripts/Editor/Hierarchy/UnparentMe.cs.meta create mode 100644 Assets/Scripts/Editor/Mesh.meta create mode 100644 Assets/Scripts/Editor/Mesh/CreatePlane.cs.meta create mode 100644 Assets/Scripts/Editor/Mesh/MeshCombineWizard.cs.meta create mode 100644 Assets/Scripts/Editor/Tools/ColorPickerWindow.cs.meta create mode 100644 Assets/Scripts/Editor/Tools/CompileTime.cs.meta create mode 100644 Assets/Scripts/Editor/Tools/ReferenceImageViewer.cs.meta create mode 100644 Assets/Scripts/Editor/Tools/SceneManagerWindow.cs.meta create mode 100644 Assets/Scripts/Editor/Tools/SceneSwitcherWindow.cs.meta create mode 100644 Assets/Scripts/Extensions/MonoBehaviourExtensions.meta create mode 100644 Assets/Scripts/Extensions/MonoBehaviourExtensions/Example.meta create mode 100644 Assets/Scripts/Extensions/MonoBehaviourExtensions/Example/MonoBehaviorExtensionsExample.cs.meta create mode 100644 Assets/Scripts/Extensions/MonoBehaviourExtensions/MonoBehaviourExtensions.cs.meta create mode 100644 Assets/Scripts/Helpers/Debug/WhoDisabledOrEnabled.cs.meta create mode 100644 Assets/Scripts/Mesh.meta create mode 100644 Assets/Scripts/Mesh/Metaball.cs.meta create mode 100644 Assets/Scripts/Texture.meta create mode 100644 Assets/Scripts/Texture/GradientTextureMaker.cs.meta create mode 100644 Assets/Scripts/Tools.meta create mode 100644 Assets/Scripts/Tools/TerrainTreeReplacer.cs.meta create mode 100644 Assets/Scripts/UI/Animation.meta create mode 100644 Assets/Scripts/UI/Animation/GrowEffect.cs.meta create mode 100644 Assets/Scripts/UI/Animation/HelicopterGrowEffect.cs.meta create mode 100644 Assets/Scripts/UI/Animation/ImageFade.cs.meta create mode 100644 Assets/Scripts/UI/Animation/LerpFromOffset.cs.meta create mode 100644 Assets/Scripts/UI/Animation/Shared.meta create mode 100644 Assets/Scripts/UI/Animation/Shared/Interpolation.cs.meta create mode 100644 Assets/Shaders/2D/Debug.meta create mode 100644 Assets/Shaders/2D/Debug/HSVDebugger.shader.meta create mode 100644 Assets/Shaders/2D/Effects/ColorCycle.shader.meta create mode 100644 Assets/Shaders/2D/Patterns.meta create mode 100644 Assets/Shaders/2D/Patterns/CirclesPattern.shader.meta create mode 100644 Assets/Shaders/2D/Patterns/ScrollingFill.shader.meta create mode 100644 Assets/Shaders/2D/Special.meta create mode 100644 Assets/Shaders/2D/Special/RayMarching.shader.meta create mode 100644 Assets/Shaders/2D/Sprites/FlipBook.shader.meta create mode 100644 Assets/Shaders/3D/Effects.meta create mode 100644 Assets/Shaders/3D/Effects/Standard-SeeThroughWalls.shader.meta create mode 100644 Assets/Shaders/3D/Effects/VerticalCameraDistanceFade.shader.meta create mode 100644 Assets/Shaders/3D/Standard.meta create mode 100644 Assets/Shaders/3D/Standard/HueContrastSaturation.shader.meta create mode 100644 Assets/Shaders/3D/Unlit/Reverse-DisIntegrate-Shader.meta create mode 100644 Assets/Shaders/3D/Water.meta create mode 100644 Assets/Shaders/3D/Water/WaterBox.shader.meta create mode 100644 Logs/Packages-Update.log create mode 100644 Packages/manifest.json create mode 100644 ProjectSettings/PresetManager.asset create mode 100644 ProjectSettings/VFXManager.asset create mode 100644 ProjectSettings/XRSettings.asset diff --git a/Assets/Scenes/ui animation Sample Scene.unity.meta b/Assets/Scenes/ui animation Sample Scene.unity.meta new file mode 100644 index 0000000..4048b51 --- /dev/null +++ b/Assets/Scenes/ui animation Sample Scene.unity.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2145e601083d97c4ba64d70455d21a11 +timeCreated: 1594958189 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/AssetBundles/AssetBundleLoader.cs b/Assets/Scripts/AssetBundles/AssetBundleLoader.cs index 215d6de..d31ae28 100644 --- a/Assets/Scripts/AssetBundles/AssetBundleLoader.cs +++ b/Assets/Scripts/AssetBundles/AssetBundleLoader.cs @@ -84,10 +84,10 @@ IEnumerator DownloadAndCache(string bundleURL, string assetName = "") } // now download the actual bundle, with hashString parameter it uses cached version if available - www = UnityWebRequest.GetAssetBundle(bundleURL + "?r=" + (Random.value * 9999999), hashString, 0); + www = UnityWebRequestAssetBundle.GetAssetBundle(bundleURL + "?r=" + (Random.value * 9999999), hashString, 0); // wait for load to finish - yield return www.Send(); + yield return www.SendWebRequest(); if (www.error != null) { diff --git a/Assets/Scripts/Camera/MarrtsSmoothedMouseLook.cs.meta b/Assets/Scripts/Camera/MarrtsSmoothedMouseLook.cs.meta new file mode 100644 index 0000000..3eccce9 --- /dev/null +++ b/Assets/Scripts/Camera/MarrtsSmoothedMouseLook.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 10e595b96bab7724a99b2b273e92011e +timeCreated: 1594958193 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Camera/PlayerMovement.cs b/Assets/Scripts/Camera/PlayerMovement.cs new file mode 100644 index 0000000..e9fb679 --- /dev/null +++ b/Assets/Scripts/Camera/PlayerMovement.cs @@ -0,0 +1,40 @@ +using UnityEngine; +using System.Collections.Generic; +using System.Collections; + +//Script for moving a gameObject smoothly + +namespace UnityLibary +{ + public class PlayerMovement : MonoBehaviour + { + //attach the gameobject that you want to move + public CharacterController controller; + + public float speed = 5f; + + void Update() + { + float x = Input.GetAxis("Horizontal"); + float z = Input.GetAxis("Vertical"); + + Vector3 move = transform.right * x + transform.forward * z; + + controller.Move(move * speed * Time.deltaTime); + + //Rotate clockwise + if (Input.GetKey(KeyCode.E)) + { + transform.RotateAround(transform.position, Vector3.up, 100 * Time.deltaTime); + } + + // Rotate anticlockwise + if (Input.GetKey(KeyCode.Q)) + { + transform.RotateAround(transform.position, -Vector3.up, 100 * Time.deltaTime); + } + + } + + } +} diff --git a/Assets/Scripts/Camera/PlayerMovement.cs.meta b/Assets/Scripts/Camera/PlayerMovement.cs.meta new file mode 100644 index 0000000..058aaca --- /dev/null +++ b/Assets/Scripts/Camera/PlayerMovement.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c1dd692b70ceca4439544f5a72fa7f70 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Editor.meta b/Assets/Scripts/Docs/Mesh.meta similarity index 67% rename from Assets/Editor.meta rename to Assets/Scripts/Docs/Mesh.meta index 9c21977..836722b 100644 --- a/Assets/Editor.meta +++ b/Assets/Scripts/Docs/Mesh.meta @@ -1,7 +1,7 @@ fileFormatVersion: 2 -guid: 710e084e33216854daedf076c029ff31 +guid: dfe48b7debc5f9c4a9ab9b77ddb37e1a folderAsset: yes -timeCreated: 1501225949 +timeCreated: 1594958191 licenseType: Free DefaultImporter: userData: diff --git a/Assets/Scripts/Docs/Mesh/MeshExample.cs.meta b/Assets/Scripts/Docs/Mesh/MeshExample.cs.meta new file mode 100644 index 0000000..24cd5ab --- /dev/null +++ b/Assets/Scripts/Docs/Mesh/MeshExample.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 3292a9e48eeb600418703ec125a8ef82 +timeCreated: 1594958193 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Docs/UnityEngine/CullingGroupExample.cs.meta b/Assets/Scripts/Docs/UnityEngine/CullingGroupExample.cs.meta new file mode 100644 index 0000000..3f8f80c --- /dev/null +++ b/Assets/Scripts/Docs/UnityEngine/CullingGroupExample.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: a0f7bca99a1816244927583c60c3e022 +timeCreated: 1594958194 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Editor/ContextMenu.meta b/Assets/Scripts/Editor/ContextMenu.meta new file mode 100644 index 0000000..bbbf7ac --- /dev/null +++ b/Assets/Scripts/Editor/ContextMenu.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 07f01cf58a1140349bfac4f393266db1 +folderAsset: yes +timeCreated: 1594958190 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Editor/ContextMenu/BoxColliderFitChildren.cs.meta b/Assets/Scripts/Editor/ContextMenu/BoxColliderFitChildren.cs.meta new file mode 100644 index 0000000..08e2df8 --- /dev/null +++ b/Assets/Scripts/Editor/ContextMenu/BoxColliderFitChildren.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 687fde9d16dc6b04e934c421806d4abb +timeCreated: 1594958194 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Editor/ContextMenu/CreateOutlineForPanelEditor.cs.meta b/Assets/Scripts/Editor/ContextMenu/CreateOutlineForPanelEditor.cs.meta new file mode 100644 index 0000000..e5d8f63 --- /dev/null +++ b/Assets/Scripts/Editor/ContextMenu/CreateOutlineForPanelEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: ea3d3337d55b5bc42a40dff5480adca0 +timeCreated: 1594958194 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Editor/ContextMenu/GetVideoAspectRatioEditor.cs.meta b/Assets/Scripts/Editor/ContextMenu/GetVideoAspectRatioEditor.cs.meta new file mode 100644 index 0000000..4aa5605 --- /dev/null +++ b/Assets/Scripts/Editor/ContextMenu/GetVideoAspectRatioEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: acde12b67d212ae42ab65f73b96ffd59 +timeCreated: 1594958194 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Editor/ContextMenu/SetBoxColliderToUI.cs.meta b/Assets/Scripts/Editor/ContextMenu/SetBoxColliderToUI.cs.meta new file mode 100644 index 0000000..bbc5ca4 --- /dev/null +++ b/Assets/Scripts/Editor/ContextMenu/SetBoxColliderToUI.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 9581bb1267ccd9e48b11127704331d49 +timeCreated: 1594958194 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Editor/GameObject.meta b/Assets/Scripts/Editor/GameObject.meta new file mode 100644 index 0000000..ea83061 --- /dev/null +++ b/Assets/Scripts/Editor/GameObject.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: dda0f0ad5057e2244b9a17ccd5031e99 +folderAsset: yes +timeCreated: 1594958191 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Editor/GameObject/ResetTransform.cs.meta b/Assets/Scripts/Editor/GameObject/ResetTransform.cs.meta new file mode 100644 index 0000000..0cc89a0 --- /dev/null +++ b/Assets/Scripts/Editor/GameObject/ResetTransform.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 51c038ebd5a3e0d4b92a12f03a73b6ea +timeCreated: 1594958193 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Editor/Gizmos/RendererBoundsGizmo.cs.meta b/Assets/Scripts/Editor/Gizmos/RendererBoundsGizmo.cs.meta new file mode 100644 index 0000000..d097268 --- /dev/null +++ b/Assets/Scripts/Editor/Gizmos/RendererBoundsGizmo.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: f1bf2afb27df5364dab899f318af7f69 +timeCreated: 1594958195 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Editor/Hierarchy.meta b/Assets/Scripts/Editor/Hierarchy.meta new file mode 100644 index 0000000..d0052a8 --- /dev/null +++ b/Assets/Scripts/Editor/Hierarchy.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 4ad868ac71006a0418c8df13616a4c3e +folderAsset: yes +timeCreated: 1594958190 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Editor/Hierarchy/UnparentMe.cs.meta b/Assets/Scripts/Editor/Hierarchy/UnparentMe.cs.meta new file mode 100644 index 0000000..f0a2192 --- /dev/null +++ b/Assets/Scripts/Editor/Hierarchy/UnparentMe.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 859aeadcffa51fe4f9cc875774621ef9 +timeCreated: 1594958194 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Editor/Mesh.meta b/Assets/Scripts/Editor/Mesh.meta new file mode 100644 index 0000000..bf539ea --- /dev/null +++ b/Assets/Scripts/Editor/Mesh.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: f45eaf3f880e5c04785b1cdca6b98021 +folderAsset: yes +timeCreated: 1594958191 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Editor/Mesh/CreatePlane.cs.meta b/Assets/Scripts/Editor/Mesh/CreatePlane.cs.meta new file mode 100644 index 0000000..e2ec4a4 --- /dev/null +++ b/Assets/Scripts/Editor/Mesh/CreatePlane.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: d1cea26cb1deacf48b0dd190be08a597 +timeCreated: 1594958194 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Editor/Mesh/MeshCombineWizard.cs.meta b/Assets/Scripts/Editor/Mesh/MeshCombineWizard.cs.meta new file mode 100644 index 0000000..69ac2e2 --- /dev/null +++ b/Assets/Scripts/Editor/Mesh/MeshCombineWizard.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 72fbe9dd2dbf0f845ab4d30da0d8b27c +timeCreated: 1594958194 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Editor/Tools/ColorPickerWindow.cs.meta b/Assets/Scripts/Editor/Tools/ColorPickerWindow.cs.meta new file mode 100644 index 0000000..d8f24d1 --- /dev/null +++ b/Assets/Scripts/Editor/Tools/ColorPickerWindow.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 333163797deb57f4a8d7373ac970d9bf +timeCreated: 1594958193 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Editor/Tools/CompileTime.cs.meta b/Assets/Scripts/Editor/Tools/CompileTime.cs.meta new file mode 100644 index 0000000..30a9f44 --- /dev/null +++ b/Assets/Scripts/Editor/Tools/CompileTime.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: a15be7d1f359a614fb4f298da7a5fa9e +timeCreated: 1594958194 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Editor/Tools/ReferenceImageViewer.cs.meta b/Assets/Scripts/Editor/Tools/ReferenceImageViewer.cs.meta new file mode 100644 index 0000000..9f770af --- /dev/null +++ b/Assets/Scripts/Editor/Tools/ReferenceImageViewer.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 2db76a597f4fe1b4e83ee1084fd940a6 +timeCreated: 1594958193 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Editor/Tools/SceneManagerWindow.cs.meta b/Assets/Scripts/Editor/Tools/SceneManagerWindow.cs.meta new file mode 100644 index 0000000..1c85eff --- /dev/null +++ b/Assets/Scripts/Editor/Tools/SceneManagerWindow.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 9b6b0e046c5bb254f919f740aeb8518b +timeCreated: 1594958194 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Editor/Tools/SceneSwitcherWindow.cs.meta b/Assets/Scripts/Editor/Tools/SceneSwitcherWindow.cs.meta new file mode 100644 index 0000000..ce3ea39 --- /dev/null +++ b/Assets/Scripts/Editor/Tools/SceneSwitcherWindow.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: fc44dc6a633635b4ba4ed8bfa75dc6bb +timeCreated: 1594958195 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Extensions/MonoBehaviourExtensions.meta b/Assets/Scripts/Extensions/MonoBehaviourExtensions.meta new file mode 100644 index 0000000..92e9b6a --- /dev/null +++ b/Assets/Scripts/Extensions/MonoBehaviourExtensions.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 9064a058036a7004f829d31b1ec4fa7a +folderAsset: yes +timeCreated: 1594958190 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Extensions/MonoBehaviourExtensions/Example.meta b/Assets/Scripts/Extensions/MonoBehaviourExtensions/Example.meta new file mode 100644 index 0000000..0279a23 --- /dev/null +++ b/Assets/Scripts/Extensions/MonoBehaviourExtensions/Example.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: d05efc8881e8e844a8eccc6132e0ddf6 +folderAsset: yes +timeCreated: 1594958191 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Extensions/MonoBehaviourExtensions/Example/MonoBehaviorExtensionsExample.cs.meta b/Assets/Scripts/Extensions/MonoBehaviourExtensions/Example/MonoBehaviorExtensionsExample.cs.meta new file mode 100644 index 0000000..3cf25b0 --- /dev/null +++ b/Assets/Scripts/Extensions/MonoBehaviourExtensions/Example/MonoBehaviorExtensionsExample.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 7bbf1f0c60c74ac4683995b0a507d537 +timeCreated: 1594958194 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Extensions/MonoBehaviourExtensions/MonoBehaviourExtensions.cs.meta b/Assets/Scripts/Extensions/MonoBehaviourExtensions/MonoBehaviourExtensions.cs.meta new file mode 100644 index 0000000..0c46b6b --- /dev/null +++ b/Assets/Scripts/Extensions/MonoBehaviourExtensions/MonoBehaviourExtensions.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 607fadb72caa2c54f833370bcf9558dc +timeCreated: 1594958194 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Helpers/Debug/WhoDisabledOrEnabled.cs.meta b/Assets/Scripts/Helpers/Debug/WhoDisabledOrEnabled.cs.meta new file mode 100644 index 0000000..664c889 --- /dev/null +++ b/Assets/Scripts/Helpers/Debug/WhoDisabledOrEnabled.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: c69c0e5bff195b040b1c86515b454544 +timeCreated: 1594958194 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Mesh.meta b/Assets/Scripts/Mesh.meta new file mode 100644 index 0000000..762cc6b --- /dev/null +++ b/Assets/Scripts/Mesh.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 14b294f417b66d44a87b73ca589bca2f +folderAsset: yes +timeCreated: 1594958189 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Mesh/Metaball.cs.meta b/Assets/Scripts/Mesh/Metaball.cs.meta new file mode 100644 index 0000000..90b6b2e --- /dev/null +++ b/Assets/Scripts/Mesh/Metaball.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: f055b957fef29374d98e499595efe8c3 +timeCreated: 1594958194 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Texture.meta b/Assets/Scripts/Texture.meta new file mode 100644 index 0000000..25ffb0f --- /dev/null +++ b/Assets/Scripts/Texture.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 21723003e773f1d44a6ff8203e46f395 +folderAsset: yes +timeCreated: 1594958189 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Texture/GradientTextureMaker.cs.meta b/Assets/Scripts/Texture/GradientTextureMaker.cs.meta new file mode 100644 index 0000000..eb407b4 --- /dev/null +++ b/Assets/Scripts/Texture/GradientTextureMaker.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 8fd686556c4ac49449e619d0aa69b9da +timeCreated: 1594958194 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Tools.meta b/Assets/Scripts/Tools.meta new file mode 100644 index 0000000..406b9bb --- /dev/null +++ b/Assets/Scripts/Tools.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 4887b891f87d1bc47a7ae210331d1ea7 +folderAsset: yes +timeCreated: 1594958190 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Tools/TerrainTreeReplacer.cs.meta b/Assets/Scripts/Tools/TerrainTreeReplacer.cs.meta new file mode 100644 index 0000000..daa176e --- /dev/null +++ b/Assets/Scripts/Tools/TerrainTreeReplacer.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 91b800e4892ad554dbc156f9543e2402 +timeCreated: 1594958194 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/UI/Animation.meta b/Assets/Scripts/UI/Animation.meta new file mode 100644 index 0000000..deaf7f5 --- /dev/null +++ b/Assets/Scripts/UI/Animation.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: b234f75726460ce46b93b19b770c8385 +folderAsset: yes +timeCreated: 1594958190 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/UI/Animation/GrowEffect.cs.meta b/Assets/Scripts/UI/Animation/GrowEffect.cs.meta new file mode 100644 index 0000000..f0976a4 --- /dev/null +++ b/Assets/Scripts/UI/Animation/GrowEffect.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 4cc1ed66c8e377c40a814dec093b6f2e +timeCreated: 1594958193 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/UI/Animation/HelicopterGrowEffect.cs.meta b/Assets/Scripts/UI/Animation/HelicopterGrowEffect.cs.meta new file mode 100644 index 0000000..100a5b6 --- /dev/null +++ b/Assets/Scripts/UI/Animation/HelicopterGrowEffect.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 0e6ad0b8ea027294985b17ecc5ae35b0 +timeCreated: 1594958193 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/UI/Animation/ImageFade.cs.meta b/Assets/Scripts/UI/Animation/ImageFade.cs.meta new file mode 100644 index 0000000..379c833 --- /dev/null +++ b/Assets/Scripts/UI/Animation/ImageFade.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: b538d7b1930f56747a8f9bb73ad5c33b +timeCreated: 1594958194 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/UI/Animation/LerpFromOffset.cs.meta b/Assets/Scripts/UI/Animation/LerpFromOffset.cs.meta new file mode 100644 index 0000000..d8ca5be --- /dev/null +++ b/Assets/Scripts/UI/Animation/LerpFromOffset.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: f461de9f20f87e64ea1c52f11e14a559 +timeCreated: 1594958195 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/UI/Animation/Shared.meta b/Assets/Scripts/UI/Animation/Shared.meta new file mode 100644 index 0000000..86f437c --- /dev/null +++ b/Assets/Scripts/UI/Animation/Shared.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 4318a6e62d3fa9b4e80b0a7ce121d0f3 +folderAsset: yes +timeCreated: 1594958191 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/UI/Animation/Shared/Interpolation.cs.meta b/Assets/Scripts/UI/Animation/Shared/Interpolation.cs.meta new file mode 100644 index 0000000..1479c95 --- /dev/null +++ b/Assets/Scripts/UI/Animation/Shared/Interpolation.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 0bafe5c15fee7b64f84801f9b22ff905 +timeCreated: 1594958193 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/2D/Debug.meta b/Assets/Shaders/2D/Debug.meta new file mode 100644 index 0000000..5150edd --- /dev/null +++ b/Assets/Shaders/2D/Debug.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 31f63f34ba5d21c4d8ad3c2a63a85220 +folderAsset: yes +timeCreated: 1594958190 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/2D/Debug/HSVDebugger.shader.meta b/Assets/Shaders/2D/Debug/HSVDebugger.shader.meta new file mode 100644 index 0000000..e9b9382 --- /dev/null +++ b/Assets/Shaders/2D/Debug/HSVDebugger.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 3454bedd801ec8049958fc2054f6265e +timeCreated: 1594958198 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/2D/Effects/ColorCycle.shader.meta b/Assets/Shaders/2D/Effects/ColorCycle.shader.meta new file mode 100644 index 0000000..133c82f --- /dev/null +++ b/Assets/Shaders/2D/Effects/ColorCycle.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 330b6be9f3a469e42a73504b34d499c6 +timeCreated: 1594958198 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/2D/Patterns.meta b/Assets/Shaders/2D/Patterns.meta new file mode 100644 index 0000000..cb80a0f --- /dev/null +++ b/Assets/Shaders/2D/Patterns.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 399c75202c145034baa2c9d01212a27c +folderAsset: yes +timeCreated: 1594958190 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/2D/Patterns/CirclesPattern.shader.meta b/Assets/Shaders/2D/Patterns/CirclesPattern.shader.meta new file mode 100644 index 0000000..2c456fe --- /dev/null +++ b/Assets/Shaders/2D/Patterns/CirclesPattern.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 6a51e5184b408be4b8a27b34dfca55d2 +timeCreated: 1594958200 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/2D/Patterns/ScrollingFill.shader.meta b/Assets/Shaders/2D/Patterns/ScrollingFill.shader.meta new file mode 100644 index 0000000..f42b404 --- /dev/null +++ b/Assets/Shaders/2D/Patterns/ScrollingFill.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 34a3246941ff91e4d9a6bf3a8c9bbf56 +timeCreated: 1594958198 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/2D/Special.meta b/Assets/Shaders/2D/Special.meta new file mode 100644 index 0000000..01540e4 --- /dev/null +++ b/Assets/Shaders/2D/Special.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 52b47187126304f448c235620a02b491 +folderAsset: yes +timeCreated: 1594958190 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/2D/Special/RayMarching.shader.meta b/Assets/Shaders/2D/Special/RayMarching.shader.meta new file mode 100644 index 0000000..b0a2666 --- /dev/null +++ b/Assets/Shaders/2D/Special/RayMarching.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 80f5dea6657e52b43b3c354aae5371e3 +timeCreated: 1594958202 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/2D/Sprites/FlipBook.shader.meta b/Assets/Shaders/2D/Sprites/FlipBook.shader.meta new file mode 100644 index 0000000..044c4e0 --- /dev/null +++ b/Assets/Shaders/2D/Sprites/FlipBook.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 4ebeb70d938436745afc3679d29342ee +timeCreated: 1594958199 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/3D/Effects.meta b/Assets/Shaders/3D/Effects.meta new file mode 100644 index 0000000..9729063 --- /dev/null +++ b/Assets/Shaders/3D/Effects.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 721c02c14478d394eb2cd50453c1dd46 +folderAsset: yes +timeCreated: 1594958190 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/3D/Effects/Standard-SeeThroughWalls.shader.meta b/Assets/Shaders/3D/Effects/Standard-SeeThroughWalls.shader.meta new file mode 100644 index 0000000..be7cbb5 --- /dev/null +++ b/Assets/Shaders/3D/Effects/Standard-SeeThroughWalls.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 353df71fa3c6e5846a31afbe285baf57 +timeCreated: 1594958198 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/3D/Effects/VerticalCameraDistanceFade.shader.meta b/Assets/Shaders/3D/Effects/VerticalCameraDistanceFade.shader.meta new file mode 100644 index 0000000..d4a4687 --- /dev/null +++ b/Assets/Shaders/3D/Effects/VerticalCameraDistanceFade.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 4b3fdf02746e56f4a87156674e1b493c +timeCreated: 1594958199 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/3D/Standard.meta b/Assets/Shaders/3D/Standard.meta new file mode 100644 index 0000000..61a16ba --- /dev/null +++ b/Assets/Shaders/3D/Standard.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 2bc68b9180eac9c4584bd64f091ef2d3 +folderAsset: yes +timeCreated: 1594958190 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/3D/Standard/HueContrastSaturation.shader.meta b/Assets/Shaders/3D/Standard/HueContrastSaturation.shader.meta new file mode 100644 index 0000000..cc6cc14 --- /dev/null +++ b/Assets/Shaders/3D/Standard/HueContrastSaturation.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 6f585f7124fa4094fa1b503ac78e757b +timeCreated: 1594958201 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/3D/Unlit/Reverse-DisIntegrate-Shader.meta b/Assets/Shaders/3D/Unlit/Reverse-DisIntegrate-Shader.meta new file mode 100644 index 0000000..1ed747b --- /dev/null +++ b/Assets/Shaders/3D/Unlit/Reverse-DisIntegrate-Shader.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9c8f6c7a074ca5e42add15300bee781a +timeCreated: 1594958191 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/3D/Water.meta b/Assets/Shaders/3D/Water.meta new file mode 100644 index 0000000..dc054a6 --- /dev/null +++ b/Assets/Shaders/3D/Water.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 6f78ac9f8e56a074a9b3398b55a3798b +folderAsset: yes +timeCreated: 1594958190 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/3D/Water/WaterBox.shader.meta b/Assets/Shaders/3D/Water/WaterBox.shader.meta new file mode 100644 index 0000000..ed4a685 --- /dev/null +++ b/Assets/Shaders/3D/Water/WaterBox.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: d43f18bcc0c85024ba6a0410b601cbee +timeCreated: 1594958204 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Logs/Packages-Update.log b/Logs/Packages-Update.log new file mode 100644 index 0000000..b2e8054 --- /dev/null +++ b/Logs/Packages-Update.log @@ -0,0 +1,67 @@ + +=== Fri Jul 17 09:30:37 2020 + +Packages were changed. +Update Mode: resetToDefaultDependencies + +The following packages were added: + com.unity.analytics@3.2.2 + com.unity.purchasing@2.0.3 + com.unity.ads@2.0.8 + com.unity.textmeshpro@1.3.0 + com.unity.package-manager-ui@2.0.7 + com.unity.collab-proxy@1.2.15 + com.unity.modules.ai@1.0.0 + com.unity.modules.animation@1.0.0 + com.unity.modules.assetbundle@1.0.0 + com.unity.modules.audio@1.0.0 + com.unity.modules.cloth@1.0.0 + com.unity.modules.director@1.0.0 + com.unity.modules.imageconversion@1.0.0 + com.unity.modules.imgui@1.0.0 + com.unity.modules.jsonserialize@1.0.0 + com.unity.modules.particlesystem@1.0.0 + com.unity.modules.physics@1.0.0 + com.unity.modules.physics2d@1.0.0 + com.unity.modules.screencapture@1.0.0 + com.unity.modules.terrain@1.0.0 + com.unity.modules.terrainphysics@1.0.0 + com.unity.modules.tilemap@1.0.0 + com.unity.modules.ui@1.0.0 + com.unity.modules.uielements@1.0.0 + com.unity.modules.umbra@1.0.0 + com.unity.modules.unityanalytics@1.0.0 + com.unity.modules.unitywebrequest@1.0.0 + com.unity.modules.unitywebrequestassetbundle@1.0.0 + com.unity.modules.unitywebrequestaudio@1.0.0 + com.unity.modules.unitywebrequesttexture@1.0.0 + com.unity.modules.unitywebrequestwww@1.0.0 + com.unity.modules.vehicles@1.0.0 + com.unity.modules.video@1.0.0 + com.unity.modules.vr@1.0.0 + com.unity.modules.wind@1.0.0 + com.unity.modules.xr@1.0.0 + +=== Fri Jul 17 09:51:50 2020 + +Packages were changed. +Update Mode: updateDependencies + +The following packages were added: + com.unity.2d.sprite@1.0.0 + com.unity.2d.tilemap@1.0.0 + com.unity.ide.rider@1.1.4 + com.unity.ide.vscode@1.1.4 + com.unity.modules.androidjni@1.0.0 + com.unity.multiplayer-hlapi@1.0.4 + com.unity.test-framework@1.1.11 + com.unity.timeline@1.2.12 + com.unity.ugui@1.0.0 + com.unity.xr.legacyinputhelpers@1.3.8 +The following packages were updated: + com.unity.analytics from version 3.2.2 to 3.3.5 + com.unity.collab-proxy from version 1.2.15 to 1.2.16 + com.unity.purchasing from version 2.0.3 to 2.0.6 + com.unity.textmeshpro from version 1.3.0 to 2.0.1 +The following packages were removed: + com.unity.package-manager-ui@2.0.7 diff --git a/Packages/manifest.json b/Packages/manifest.json new file mode 100644 index 0000000..b387d24 --- /dev/null +++ b/Packages/manifest.json @@ -0,0 +1,49 @@ +{ + "dependencies": { + "com.unity.2d.sprite": "1.0.0", + "com.unity.2d.tilemap": "1.0.0", + "com.unity.ads": "2.0.8", + "com.unity.analytics": "3.3.5", + "com.unity.collab-proxy": "1.2.16", + "com.unity.ide.rider": "1.1.4", + "com.unity.ide.vscode": "1.1.4", + "com.unity.multiplayer-hlapi": "1.0.4", + "com.unity.purchasing": "2.0.6", + "com.unity.test-framework": "1.1.11", + "com.unity.textmeshpro": "2.0.1", + "com.unity.timeline": "1.2.12", + "com.unity.ugui": "1.0.0", + "com.unity.xr.legacyinputhelpers": "1.3.8", + "com.unity.modules.ai": "1.0.0", + "com.unity.modules.androidjni": "1.0.0", + "com.unity.modules.animation": "1.0.0", + "com.unity.modules.assetbundle": "1.0.0", + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.cloth": "1.0.0", + "com.unity.modules.director": "1.0.0", + "com.unity.modules.imageconversion": "1.0.0", + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.modules.particlesystem": "1.0.0", + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.physics2d": "1.0.0", + "com.unity.modules.screencapture": "1.0.0", + "com.unity.modules.terrain": "1.0.0", + "com.unity.modules.terrainphysics": "1.0.0", + "com.unity.modules.tilemap": "1.0.0", + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.uielements": "1.0.0", + "com.unity.modules.umbra": "1.0.0", + "com.unity.modules.unityanalytics": "1.0.0", + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.unitywebrequestassetbundle": "1.0.0", + "com.unity.modules.unitywebrequestaudio": "1.0.0", + "com.unity.modules.unitywebrequesttexture": "1.0.0", + "com.unity.modules.unitywebrequestwww": "1.0.0", + "com.unity.modules.vehicles": "1.0.0", + "com.unity.modules.video": "1.0.0", + "com.unity.modules.vr": "1.0.0", + "com.unity.modules.wind": "1.0.0", + "com.unity.modules.xr": "1.0.0" + } +} diff --git a/ProjectSettings/EditorSettings.asset b/ProjectSettings/EditorSettings.asset index f33b6fb..9ccec94 100644 --- a/ProjectSettings/EditorSettings.asset +++ b/ProjectSettings/EditorSettings.asset @@ -3,14 +3,33 @@ --- !u!159 &1 EditorSettings: m_ObjectHideFlags: 0 - serializedVersion: 4 + serializedVersion: 9 m_ExternalVersionControlSupport: Visible Meta Files m_SerializationMode: 2 + m_LineEndingsForNewScripts: 1 m_DefaultBehaviorMode: 0 + m_PrefabRegularEnvironment: {fileID: 0} + m_PrefabUIEnvironment: {fileID: 0} m_SpritePackerMode: 0 m_SpritePackerPaddingPower: 1 - m_ProjectGenerationIncludedExtensions: txt;xml;fnt;cd + m_EtcTextureCompressorBehavior: 0 + m_EtcTextureFastCompressor: 2 + m_EtcTextureNormalCompressor: 2 + m_EtcTextureBestCompressor: 5 + m_ProjectGenerationIncludedExtensions: txt;xml;fnt;cd;asmref m_ProjectGenerationRootNamespace: - m_UserGeneratedProjectSuffix: m_CollabEditorSettings: inProgressEnabled: 1 + m_EnableTextureStreamingInEditMode: 1 + m_EnableTextureStreamingInPlayMode: 1 + m_AsyncShaderCompilation: 1 + m_EnterPlayModeOptionsEnabled: 0 + m_EnterPlayModeOptions: 3 + m_ShowLightmapResolutionOverlay: 1 + m_UseLegacyProbeSampleCount: 1 + m_AssetPipelineMode: 1 + m_CacheServerMode: 0 + m_CacheServerEndpoint: + m_CacheServerNamespacePrefix: default + m_CacheServerEnableDownload: 1 + m_CacheServerEnableUpload: 1 diff --git a/ProjectSettings/PresetManager.asset b/ProjectSettings/PresetManager.asset new file mode 100644 index 0000000..67a94da --- /dev/null +++ b/ProjectSettings/PresetManager.asset @@ -0,0 +1,7 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1386491679 &1 +PresetManager: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_DefaultPresets: {} diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset index c373cfb..5d778b8 100644 --- a/ProjectSettings/ProjectSettings.asset +++ b/ProjectSettings/ProjectSettings.asset @@ -3,9 +3,11 @@ --- !u!129 &1 PlayerSettings: m_ObjectHideFlags: 0 - serializedVersion: 12 + serializedVersion: 20 productGUID: 36f97d821ecfac149ae5eae5c4496e56 AndroidProfiler: 0 + AndroidFilterTouchesWhenObscured: 0 + AndroidEnableSustainedPerformanceMode: 0 defaultScreenOrientation: 4 targetDevice: 2 useOnDemandResources: 0 @@ -38,8 +40,6 @@ PlayerSettings: width: 1 height: 1 m_SplashScreenLogos: [] - m_SplashScreenBackgroundLandscape: {fileID: 0} - m_SplashScreenBackgroundPortrait: {fileID: 0} m_VirtualRealitySplashScreen: {fileID: 0} m_HolographicTrackingLossScreen: {fileID: 0} defaultScreenWidth: 1024 @@ -49,13 +49,10 @@ PlayerSettings: m_StereoRenderingPath: 0 m_ActiveColorSpace: 0 m_MTRendering: 1 - m_MobileMTRendering: 0 m_StackTraceTypes: 010000000100000001000000010000000100000001000000 iosShowActivityIndicatorOnLoading: -1 androidShowActivityIndicatorOnLoading: -1 - tizenShowActivityIndicatorOnLoading: -1 - iosAppInBackgroundBehavior: 0 - displayResolutionDialog: 1 + iosUseCustomAppBackgroundBehavior: 0 iosAllowHTTPDownload: 1 allowedAutorotateToPortrait: 1 allowedAutorotateToPortraitUpsideDown: 1 @@ -63,23 +60,30 @@ PlayerSettings: allowedAutorotateToLandscapeLeft: 1 useOSAutorotation: 1 use32BitDisplayBuffer: 1 + preserveFramebufferAlpha: 0 disableDepthAndStencilBuffers: 0 - defaultIsFullScreen: 1 + androidStartInFullscreen: 1 + androidRenderOutsideSafeArea: 1 + androidUseSwappy: 0 + androidBlitType: 0 defaultIsNativeResolution: 1 + macRetinaSupport: 1 runInBackground: 0 captureSingleScreen: 0 muteOtherAudioSources: 0 Prepare IOS For Recording: 0 Force IOS Speakers When Recording: 0 + deferSystemGesturesMode: 0 + hideHomeButton: 0 submitAnalytics: 1 usePlayerLog: 1 bakeCollisionMeshes: 0 forceSingleInstance: 0 + useFlipModelSwapchain: 1 resizableWindow: 0 useMacAppStoreValidation: 0 macAppStoreCategory: public.app-category.games gpuSkinning: 0 - graphicsJobs: 0 xboxPIXTextureCapture: 0 xboxEnableAvatar: 0 xboxEnableKinect: 0 @@ -87,34 +91,28 @@ PlayerSettings: xboxEnableFitness: 0 visibleInBackground: 1 allowFullscreenSwitch: 1 - graphicsJobMode: 0 - macFullscreenMode: 2 - d3d9FullscreenMode: 1 - d3d11FullscreenMode: 1 + fullscreenMode: 1 xboxSpeechDB: 0 xboxEnableHeadOrientation: 0 xboxEnableGuest: 0 xboxEnablePIXSampling: 0 - n3dsDisableStereoscopicView: 0 - n3dsEnableSharedListOpt: 1 - n3dsEnableVSync: 0 - ignoreAlphaClear: 0 + metalFramebufferOnly: 0 xboxOneResolution: 0 + xboxOneSResolution: 0 + xboxOneXResolution: 3 xboxOneMonoLoggingLevel: 0 xboxOneLoggingLevel: 1 xboxOneDisableEsram: 0 - videoMemoryForVertexBuffers: 0 - psp2PowerMode: 0 - psp2AcquireBGM: 1 - wiiUTVResolution: 0 - wiiUGamePadMSAA: 1 - wiiUSupportsNunchuk: 0 - wiiUSupportsClassicController: 0 - wiiUSupportsBalanceBoard: 0 - wiiUSupportsMotionPlus: 0 - wiiUSupportsProController: 0 - wiiUAllowScreenCapture: 1 - wiiUControllerCount: 0 + xboxOneEnableTypeOptimization: 0 + xboxOnePresentImmediateThreshold: 0 + switchQueueCommandMemory: 1048576 + switchQueueControlMemory: 16384 + switchQueueComputeMemory: 262144 + switchNVNShaderPoolsGranularity: 33554432 + switchNVNDefaultPoolsGranularity: 16777216 + switchNVNOtherPoolsGranularity: 16777216 + vulkanNumSwapchainBuffers: 3 + vulkanEnableSetSRGBWrite: 0 m_SupportedAspectRatios: 4:3: 1 5:4: 1 @@ -124,6 +122,7 @@ PlayerSettings: bundleVersion: 1.0 preloadedAssets: [] metroInputSource: 0 + wsaTransparentSwapchain: 0 m_HolographicPauseOnTrackingLoss: 1 xboxOneDisableKinectGpuReservation: 0 xboxOneEnable7thCore: 0 @@ -134,16 +133,39 @@ PlayerSettings: daydream: depthFormat: 0 useSustainedPerformanceMode: 0 + enableVideoLayer: 0 + useProtectedVideoMemory: 0 + minimumSupportedHeadTracking: 0 + maximumSupportedHeadTracking: 1 hololens: depthFormat: 1 - protectGraphicsMemory: 0 + depthBufferSharingEnabled: 1 + lumin: + depthFormat: 0 + frameTiming: 2 + enableGLCache: 0 + glCacheMaxBlobSize: 524288 + glCacheMaxFileSize: 8388608 + oculus: + sharedDepthBuffer: 1 + dashSupport: 1 + lowOverheadMode: 0 + protectedContext: 0 + v2Signing: 1 + enable360StereoCapture: 0 + isWsaHolographicRemotingEnabled: 0 + enableFrameTimingStats: 0 useHDRDisplay: 0 - targetPixelDensity: 0 + D3DHDRBitDepth: 0 + m_ColorGamuts: 00000000 + targetPixelDensity: 30 resolutionScalingMode: 0 + androidSupportedAspectRatio: 1 + androidMaxAspectRatio: 2.1 applicationIdentifier: {} buildNumber: {} AndroidBundleVersionCode: 1 - AndroidMinSdkVersion: 16 + AndroidMinSdkVersion: 19 AndroidTargetSdkVersion: 0 AndroidPreferredInstallLocation: 1 aotOptions: @@ -156,14 +178,12 @@ PlayerSettings: APKExpansionFiles: 0 keepLoadedShadersAlive: 0 StripUnusedMeshComponents: 0 - VertexChannelCompressionMask: - serializedVersion: 2 - m_Bits: 238 + VertexChannelCompressionMask: 214 iPhoneSdkVersion: 988 - iOSTargetOSVersionString: + iOSTargetOSVersionString: 10.0 tvOSSdkVersion: 0 tvOSRequireExtendedGameController: 0 - tvOSTargetOSVersionString: + tvOSTargetOSVersionString: 10.0 uIPrerenderedIcon: 0 uIRequiresPersistentWiFi: 0 uIRequiresFullScreen: 1 @@ -176,15 +196,26 @@ PlayerSettings: iPhone47inSplashScreen: {fileID: 0} iPhone55inPortraitSplashScreen: {fileID: 0} iPhone55inLandscapeSplashScreen: {fileID: 0} + iPhone58inPortraitSplashScreen: {fileID: 0} + iPhone58inLandscapeSplashScreen: {fileID: 0} iPadPortraitSplashScreen: {fileID: 0} iPadHighResPortraitSplashScreen: {fileID: 0} iPadLandscapeSplashScreen: {fileID: 0} iPadHighResLandscapeSplashScreen: {fileID: 0} + iPhone65inPortraitSplashScreen: {fileID: 0} + iPhone65inLandscapeSplashScreen: {fileID: 0} + iPhone61inPortraitSplashScreen: {fileID: 0} + iPhone61inLandscapeSplashScreen: {fileID: 0} appleTVSplashScreen: {fileID: 0} + appleTVSplashScreen2x: {fileID: 0} tvOSSmallIconLayers: [] + tvOSSmallIconLayers2x: [] tvOSLargeIconLayers: [] + tvOSLargeIconLayers2x: [] tvOSTopShelfImageLayers: [] + tvOSTopShelfImageLayers2x: [] tvOSTopShelfImageWideLayers: [] + tvOSTopShelfImageWideLayers2x: [] iOSLaunchScreenType: 0 iOSLaunchScreenPortrait: {fileID: 0} iOSLaunchScreenLandscape: {fileID: 0} @@ -202,6 +233,8 @@ PlayerSettings: iOSLaunchScreeniPadFillPct: 100 iOSLaunchScreeniPadSize: 100 iOSLaunchScreeniPadCustomXibPath: + iOSUseLaunchScreenStoryboard: 0 + iOSLaunchScreenCustomStoryboardPath: iOSDeviceRequirements: [] iOSURLSchemes: [] iOSBackgroundModes: 0 @@ -212,48 +245,88 @@ PlayerSettings: appleDeveloperTeamID: iOSManualSigningProvisioningProfileID: tvOSManualSigningProvisioningProfileID: + iOSManualSigningProvisioningProfileType: 0 + tvOSManualSigningProvisioningProfileType: 0 appleEnableAutomaticSigning: 0 - AndroidTargetDevice: 0 + iOSRequireARKit: 0 + iOSAutomaticallyDetectAndAddCapabilities: 1 + appleEnableProMotion: 0 + clonedFromGUID: 00000000000000000000000000000000 + templatePackageId: + templateDefaultScene: + AndroidTargetArchitectures: 1 AndroidSplashScreenScale: 0 androidSplashScreen: {fileID: 0} - AndroidKeystoreName: + AndroidKeystoreName: '{inproject}: ' AndroidKeyaliasName: + AndroidBuildApkPerCpuArchitecture: 0 AndroidTVCompatibility: 1 AndroidIsGame: 1 + AndroidEnableTango: 0 androidEnableBanner: 1 + androidUseLowAccuracyLocation: 0 + androidUseCustomKeystore: 0 m_AndroidBanners: - width: 320 height: 180 banner: {fileID: 0} androidGamepadSupportLevel: 0 - resolutionDialogBanner: {fileID: 0} + AndroidValidateAppBundleSize: 1 + AndroidAppBundleSizeToValidate: 150 m_BuildTargetIcons: [] + m_BuildTargetPlatformIcons: [] m_BuildTargetBatching: [] + m_BuildTargetGraphicsJobs: + - m_BuildTarget: MacStandaloneSupport + m_GraphicsJobs: 0 + - m_BuildTarget: Switch + m_GraphicsJobs: 0 + - m_BuildTarget: MetroSupport + m_GraphicsJobs: 0 + - m_BuildTarget: AppleTVSupport + m_GraphicsJobs: 0 + - m_BuildTarget: BJMSupport + m_GraphicsJobs: 0 + - m_BuildTarget: LinuxStandaloneSupport + m_GraphicsJobs: 0 + - m_BuildTarget: PS4Player + m_GraphicsJobs: 0 + - m_BuildTarget: iOSSupport + m_GraphicsJobs: 0 + - m_BuildTarget: WindowsStandaloneSupport + m_GraphicsJobs: 0 + - m_BuildTarget: XboxOnePlayer + m_GraphicsJobs: 0 + - m_BuildTarget: LuminSupport + m_GraphicsJobs: 0 + - m_BuildTarget: AndroidPlayer + m_GraphicsJobs: 0 + - m_BuildTarget: WebGLSupport + m_GraphicsJobs: 0 + m_BuildTargetGraphicsJobMode: + - m_BuildTarget: PS4Player + m_GraphicsJobMode: 0 + - m_BuildTarget: XboxOnePlayer + m_GraphicsJobMode: 0 m_BuildTargetGraphicsAPIs: [] m_BuildTargetVRSettings: [] openGLRequireES31: 0 openGLRequireES31AEP: 0 - webPlayerTemplate: APPLICATION:Default + openGLRequireES32: 0 m_TemplateCustomTags: {} - wiiUTitleID: 0005000011000000 - wiiUGroupID: 00010000 - wiiUCommonSaveSize: 4096 - wiiUAccountSaveSize: 2048 - wiiUOlvAccessKey: 0 - wiiUTinCode: 0 - wiiUJoinGameId: 0 - wiiUJoinGameModeMask: 0000000000000000 - wiiUCommonBossSize: 0 - wiiUAccountBossSize: 0 - wiiUAddOnUniqueIDs: [] - wiiUMainThreadStackSize: 3072 - wiiULoaderThreadStackSize: 1024 - wiiUSystemHeapSize: 128 - wiiUTVStartupScreen: {fileID: 0} - wiiUGamePadStartupScreen: {fileID: 0} - wiiUDrcBufferDisabled: 0 - wiiUProfilerLibPath: + mobileMTRendering: + iPhone: 1 + tvOS: 1 + m_BuildTargetGroupLightmapEncodingQuality: + - m_BuildTarget: Standalone + m_EncodingQuality: 1 + - m_BuildTarget: XboxOne + m_EncodingQuality: 1 + - m_BuildTarget: PS4 + m_EncodingQuality: 1 + m_BuildTargetGroupLightmapSettings: [] playModeTestRunnerEnabled: 1 + runPlayModeTestAsEditModeTest: 0 actionOnDotNetUnhandledException: 1 enableInternalProfiler: 0 logObjCUncaughtExceptions: 1 @@ -281,6 +354,9 @@ PlayerSettings: switchTitleNames_9: switchTitleNames_10: switchTitleNames_11: + switchTitleNames_12: + switchTitleNames_13: + switchTitleNames_14: switchPublisherNames_0: switchPublisherNames_1: switchPublisherNames_2: @@ -293,6 +369,9 @@ PlayerSettings: switchPublisherNames_9: switchPublisherNames_10: switchPublisherNames_11: + switchPublisherNames_12: + switchPublisherNames_13: + switchPublisherNames_14: switchIcons_0: {fileID: 0} switchIcons_1: {fileID: 0} switchIcons_2: {fileID: 0} @@ -305,6 +384,9 @@ PlayerSettings: switchIcons_9: {fileID: 0} switchIcons_10: {fileID: 0} switchIcons_11: {fileID: 0} + switchIcons_12: {fileID: 0} + switchIcons_13: {fileID: 0} + switchIcons_14: {fileID: 0} switchSmallIcons_0: {fileID: 0} switchSmallIcons_1: {fileID: 0} switchSmallIcons_2: {fileID: 0} @@ -317,6 +399,9 @@ PlayerSettings: switchSmallIcons_9: {fileID: 0} switchSmallIcons_10: {fileID: 0} switchSmallIcons_11: {fileID: 0} + switchSmallIcons_12: {fileID: 0} + switchSmallIcons_13: {fileID: 0} + switchSmallIcons_14: {fileID: 0} switchManualHTML: switchAccessibleURLs: switchLegalInformation: @@ -348,6 +433,7 @@ PlayerSettings: switchRatingsInt_9: 0 switchRatingsInt_10: 0 switchRatingsInt_11: 0 + switchRatingsInt_12: 0 switchLocalCommunicationIds_0: 0x01004b9000490000 switchLocalCommunicationIds_1: switchLocalCommunicationIds_2: @@ -358,8 +444,15 @@ PlayerSettings: switchLocalCommunicationIds_7: switchParentalControl: 0 switchAllowsScreenshot: 1 + switchAllowsVideoCapturing: 1 + switchAllowsRuntimeAddOnContentInstall: 0 switchDataLossConfirmation: 0 + switchUserAccountLockEnabled: 0 + switchSystemResourceMemory: 16777216 switchSupportedNpadStyles: 3 + switchNativeFsCacheSize: 32 + switchIsHoldTypeHorizontal: 0 + switchSupportedNpadCount: 8 switchSocketConfigEnabled: 0 switchTcpInitialSendBufferSize: 32 switchTcpInitialReceiveBufferSize: 64 @@ -368,6 +461,9 @@ PlayerSettings: switchUdpSendBufferSize: 9 switchUdpReceiveBufferSize: 42 switchSocketBufferEfficiency: 4 + switchSocketInitializeEnabled: 1 + switchNetworkInterfaceManagerInitializeEnabled: 1 + switchPlayerConnectionEnabled: 1 ps4NPAgeRating: 12 ps4NPTitleSecret: ps4NPTrophyPackPath: @@ -386,6 +482,8 @@ PlayerSettings: ps4PronunciationSIGPath: ps4BackgroundImagePath: ps4StartupImagePath: + ps4StartupImagesFolder: + ps4IconImagesFolder: ps4SaveDataImagePath: ps4SdkOverride: ps4BGMPath: @@ -404,12 +502,15 @@ PlayerSettings: ps4DownloadDataSize: 0 ps4GarlicHeapSize: 2048 ps4ProGarlicHeapSize: 2560 + playerPrefsMaxSize: 32768 ps4Passcode: frAQBc8Wsa1xVPfvJcrgRYwTiizs2trQ ps4pnSessions: 1 ps4pnPresence: 1 ps4pnFriends: 1 ps4pnGameCustomData: 1 playerPrefsSupport: 0 + enableApplicationExit: 0 + resetTempFolder: 1 restrictedAudioUsageRights: 0 ps4UseResolutionFallback: 0 ps4ReprojectionSupport: 0 @@ -432,57 +533,11 @@ PlayerSettings: ps4contentSearchFeaturesUsed: 0 ps4attribEyeToEyeDistanceSettingVR: 0 ps4IncludedModules: [] + ps4attribVROutputEnabled: 0 monoEnv: - psp2Splashimage: {fileID: 0} - psp2NPTrophyPackPath: - psp2NPSupportGBMorGJP: 0 - psp2NPAgeRating: 12 - psp2NPTitleDatPath: - psp2NPCommsID: - psp2NPCommunicationsID: - psp2NPCommsPassphrase: - psp2NPCommsSig: - psp2ParamSfxPath: - psp2ManualPath: - psp2LiveAreaGatePath: - psp2LiveAreaBackroundPath: - psp2LiveAreaPath: - psp2LiveAreaTrialPath: - psp2PatchChangeInfoPath: - psp2PatchOriginalPackage: - psp2PackagePassword: F69AzBlax3CF3EDNhm3soLBPh71Yexui - psp2KeystoneFile: - psp2MemoryExpansionMode: 0 - psp2DRMType: 0 - psp2StorageType: 0 - psp2MediaCapacity: 0 - psp2DLCConfigPath: - psp2ThumbnailPath: - psp2BackgroundPath: - psp2SoundPath: - psp2TrophyCommId: - psp2TrophyPackagePath: - psp2PackagedResourcesPath: - psp2SaveDataQuota: 10240 - psp2ParentalLevel: 1 - psp2ShortTitle: Not Set - psp2ContentID: IV0000-ABCD12345_00-0123456789ABCDEF - psp2Category: 0 - psp2MasterVersion: 01.00 - psp2AppVersion: 01.00 - psp2TVBootMode: 0 - psp2EnterButtonAssignment: 2 - psp2TVDisableEmu: 0 - psp2AllowTwitterDialog: 1 - psp2Upgradable: 0 - psp2HealthWarning: 0 - psp2UseLibLocation: 0 - psp2InfoBarOnStartup: 0 - psp2InfoBarColor: 0 - psp2ScriptOptimizationLevel: 0 - psmSplashimage: {fileID: 0} splashScreenBackgroundSourceLandscape: {fileID: 0} splashScreenBackgroundSourcePortrait: {fileID: 0} + blurSplashScreenBackground: 1 spritePackerPolicy: webGLMemorySize: 256 webGLExceptionSupport: 1 @@ -494,15 +549,22 @@ PlayerSettings: webGLTemplate: APPLICATION:Default webGLAnalyzeBuildSize: 0 webGLUseEmbeddedResources: 0 - webGLUseWasm: 0 webGLCompressionFormat: 1 + webGLLinkerTarget: 1 + webGLThreadsSupport: 0 + webGLWasmStreaming: 0 scriptingDefineSymbols: 1: MYCOMPANY;MYCOMPANY_MYPACKAGE platformArchitecture: {} scriptingBackend: {} + il2cppCompilerConfiguration: {} + managedStrippingLevel: {} incrementalIl2cppBuild: {} + allowUnsafeCode: 0 additionalIl2CppArgs: - scriptingRuntimeVersion: 0 + scriptingRuntimeVersion: 1 + gcIncremental: 0 + gcWBarrierValidation: 0 apiCompatibilityLevelPerPlatform: {} m_RenderingPath: 1 m_MobileRenderingPath: 1 @@ -516,11 +578,12 @@ PlayerSettings: metroApplicationDescription: UnityLibrary wsaImages: {} metroTileShortName: - metroCommandLineArgsFile: metroTileShowName: 0 metroMediumTileShowName: 0 metroLargeTileShowName: 0 metroWideTileShowName: 0 + metroSupportStreamingInstall: 0 + metroLastRequiredScene: 0 metroDefaultTileSize: 1 metroTileForegroundText: 2 metroTileBackgroundColor: {r: 0.13333334, g: 0.17254902, b: 0.21568628, a: 0} @@ -528,35 +591,10 @@ PlayerSettings: a: 1} metroSplashScreenUseBackgroundColor: 0 platformCapabilities: {} + metroTargetDeviceFamilies: {} metroFTAName: metroFTAFileTypes: [] metroProtocolName: - metroCompilationOverrides: 1 - tizenProductDescription: - tizenProductURL: - tizenSigningProfileName: - tizenGPSPermissions: 0 - tizenMicrophonePermissions: 0 - tizenDeploymentTarget: - tizenDeploymentTargetType: -1 - tizenMinOSVersion: 1 - n3dsUseExtSaveData: 0 - n3dsCompressStaticMem: 1 - n3dsExtSaveDataNumber: 0x12345 - n3dsStackSize: 131072 - n3dsTargetPlatform: 2 - n3dsRegion: 7 - n3dsMediaSize: 0 - n3dsLogoStyle: 3 - n3dsTitle: GameName - n3dsProductCode: - n3dsApplicationId: 0xFF3FF - stvDeviceAddress: - stvProductDescription: - stvProductAuthor: - stvProductAuthorEmail: - stvProductLink: - stvProductCategory: 0 XboxOneProductId: XboxOneUpdateKey: XboxOneSandboxId: @@ -566,6 +604,7 @@ PlayerSettings: XboxOneGameOsOverridePath: XboxOnePackagingOverridePath: XboxOneAppManifestOverridePath: + XboxOneVersion: 1.0.0.0 XboxOnePackageEncryption: 0 XboxOnePackageUpdateGranularity: 2 XboxOneDescription: @@ -579,17 +618,30 @@ PlayerSettings: XboxOneSplashScreen: {fileID: 0} XboxOneAllowedProductIds: [] XboxOnePersistentLocalStorageSize: 0 - xboxOneScriptCompiler: 0 + XboxOneXTitleMemory: 8 + XboxOneOverrideIdentityName: vrEditorSettings: daydream: daydreamIconForeground: {fileID: 0} daydreamIconBackground: {fileID: 0} cloudServicesEnabled: {} - facebookSdkVersion: 7.9.4 - apiCompatibilityLevel: 2 + luminIcon: + m_Name: + m_ModelFolderPath: + m_PortalFolderPath: + luminCert: + m_CertPath: + m_SignPackage: 1 + luminIsChannelApp: 0 + luminVersion: + m_VersionCode: 1 + m_VersionName: + apiCompatibilityLevel: 6 cloudProjectId: + framebufferDepthMemorylessMode: 0 projectName: organizationId: cloudEnabled: 0 enableNativePlatformBackendsForNewInputSystem: 0 disableOldInputManagerSupport: 0 + legacyClampBlendShapeWeights: 1 diff --git a/ProjectSettings/ProjectVersion.txt b/ProjectSettings/ProjectVersion.txt index ca1aa05..a8d6725 100644 --- a/ProjectSettings/ProjectVersion.txt +++ b/ProjectSettings/ProjectVersion.txt @@ -1 +1,2 @@ -m_EditorVersion: 2017.1.0f3 +m_EditorVersion: 2019.3.3f1 +m_EditorVersionWithRevision: 2019.3.3f1 (7ceaae5f7503) diff --git a/ProjectSettings/VFXManager.asset b/ProjectSettings/VFXManager.asset new file mode 100644 index 0000000..3a95c98 --- /dev/null +++ b/ProjectSettings/VFXManager.asset @@ -0,0 +1,12 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!937362698 &1 +VFXManager: + m_ObjectHideFlags: 0 + m_IndirectShader: {fileID: 0} + m_CopyBufferShader: {fileID: 0} + m_SortShader: {fileID: 0} + m_StripUpdateShader: {fileID: 0} + m_RenderPipeSettingsPath: + m_FixedTimeStep: 0.016666668 + m_MaxDeltaTime: 0.05 diff --git a/ProjectSettings/XRSettings.asset b/ProjectSettings/XRSettings.asset new file mode 100644 index 0000000..482590c --- /dev/null +++ b/ProjectSettings/XRSettings.asset @@ -0,0 +1,10 @@ +{ + "m_SettingKeys": [ + "VR Device Disabled", + "VR Device User Alert" + ], + "m_SettingValues": [ + "False", + "False" + ] +} \ No newline at end of file From 4fd96461567cdf584f38ff9d904d0bdf77c0849f Mon Sep 17 00:00:00 2001 From: pkunjam Date: Fri, 17 Jul 2020 20:06:35 +0530 Subject: [PATCH 160/231] comment correction --- Assets/Scripts/Camera/PlayerMovement.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Assets/Scripts/Camera/PlayerMovement.cs b/Assets/Scripts/Camera/PlayerMovement.cs index e9fb679..901af41 100644 --- a/Assets/Scripts/Camera/PlayerMovement.cs +++ b/Assets/Scripts/Camera/PlayerMovement.cs @@ -3,12 +3,13 @@ using System.Collections; //Script for moving a gameObject smoothly +//Usage: Attach the character controller component to the gameobject that you want to move namespace UnityLibary { public class PlayerMovement : MonoBehaviour { - //attach the gameobject that you want to move + // place the gameobject that you want to move to the controller placeholder public CharacterController controller; public float speed = 5f; From c579bf50ea0dea8f015d6522ac8e46667f51a254 Mon Sep 17 00:00:00 2001 From: pkunjam Date: Sat, 18 Jul 2020 12:31:12 +0530 Subject: [PATCH 161/231] script to display webcam texture into a gameobject --- Assets/Scripts/Texture/WebCamDisplay.cs | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 Assets/Scripts/Texture/WebCamDisplay.cs diff --git a/Assets/Scripts/Texture/WebCamDisplay.cs b/Assets/Scripts/Texture/WebCamDisplay.cs new file mode 100644 index 0000000..12bf6c8 --- /dev/null +++ b/Assets/Scripts/Texture/WebCamDisplay.cs @@ -0,0 +1,21 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +// usage: attach this script to any gameobject in which you want to render the webcam display +// create a material, use Unlit/Texture as a shader and place it to the gameobject's material placeholder in the mesh renderer component + +namespace UnityLibrary +{ + public class WebCamDisplay : MonoBehaviour + { + void Start() + { + WebCamTexture webCam = new WebCamTexture(); + webCam.deviceName = WebCamTexture.devices[0].name; + this.GetComponent().material.mainTexture = webCam; + webCam.Play(); + } + } +} + From 7836593170978484e0e203067a5bcd26c514980a Mon Sep 17 00:00:00 2001 From: pkunjam Date: Sat, 18 Jul 2020 18:22:50 +0530 Subject: [PATCH 162/231] Removed packages and project settings --- Assets/Scripts/Texture/WebCamDisplay.cs.meta | 11 + Packages/manifest.json | 49 -- ProjectSettings/AudioManager.asset | 17 - ProjectSettings/ClusterInputManager.asset | 6 - ProjectSettings/DynamicsManager.asset | 19 - ProjectSettings/EditorBuildSettings.asset | 7 - ProjectSettings/EditorSettings.asset | 35 - ProjectSettings/GraphicsSettings.asset | 61 -- ProjectSettings/InputManager.asset | 295 --------- ProjectSettings/NavMeshAreas.asset | 89 --- ProjectSettings/NetworkManager.asset | 8 - ProjectSettings/Physics2DSettings.asset | 36 -- ProjectSettings/PresetManager.asset | 7 - ProjectSettings/ProjectSettings.asset | 647 ------------------- ProjectSettings/ProjectVersion.txt | 2 - ProjectSettings/QualitySettings.asset | 193 ------ ProjectSettings/TagManager.asset | 43 -- ProjectSettings/TimeManager.asset | 9 - ProjectSettings/UnityConnectSettings.asset | 34 - ProjectSettings/VFXManager.asset | 12 - ProjectSettings/XRSettings.asset | 10 - 21 files changed, 11 insertions(+), 1579 deletions(-) create mode 100644 Assets/Scripts/Texture/WebCamDisplay.cs.meta delete mode 100644 Packages/manifest.json delete mode 100644 ProjectSettings/AudioManager.asset delete mode 100644 ProjectSettings/ClusterInputManager.asset delete mode 100644 ProjectSettings/DynamicsManager.asset delete mode 100644 ProjectSettings/EditorBuildSettings.asset delete mode 100644 ProjectSettings/EditorSettings.asset delete mode 100644 ProjectSettings/GraphicsSettings.asset delete mode 100644 ProjectSettings/InputManager.asset delete mode 100644 ProjectSettings/NavMeshAreas.asset delete mode 100644 ProjectSettings/NetworkManager.asset delete mode 100644 ProjectSettings/Physics2DSettings.asset delete mode 100644 ProjectSettings/PresetManager.asset delete mode 100644 ProjectSettings/ProjectSettings.asset delete mode 100644 ProjectSettings/ProjectVersion.txt delete mode 100644 ProjectSettings/QualitySettings.asset delete mode 100644 ProjectSettings/TagManager.asset delete mode 100644 ProjectSettings/TimeManager.asset delete mode 100644 ProjectSettings/UnityConnectSettings.asset delete mode 100644 ProjectSettings/VFXManager.asset delete mode 100644 ProjectSettings/XRSettings.asset diff --git a/Assets/Scripts/Texture/WebCamDisplay.cs.meta b/Assets/Scripts/Texture/WebCamDisplay.cs.meta new file mode 100644 index 0000000..9976b84 --- /dev/null +++ b/Assets/Scripts/Texture/WebCamDisplay.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c15440579c94fd245b85260bce402884 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/manifest.json b/Packages/manifest.json deleted file mode 100644 index b387d24..0000000 --- a/Packages/manifest.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "dependencies": { - "com.unity.2d.sprite": "1.0.0", - "com.unity.2d.tilemap": "1.0.0", - "com.unity.ads": "2.0.8", - "com.unity.analytics": "3.3.5", - "com.unity.collab-proxy": "1.2.16", - "com.unity.ide.rider": "1.1.4", - "com.unity.ide.vscode": "1.1.4", - "com.unity.multiplayer-hlapi": "1.0.4", - "com.unity.purchasing": "2.0.6", - "com.unity.test-framework": "1.1.11", - "com.unity.textmeshpro": "2.0.1", - "com.unity.timeline": "1.2.12", - "com.unity.ugui": "1.0.0", - "com.unity.xr.legacyinputhelpers": "1.3.8", - "com.unity.modules.ai": "1.0.0", - "com.unity.modules.androidjni": "1.0.0", - "com.unity.modules.animation": "1.0.0", - "com.unity.modules.assetbundle": "1.0.0", - "com.unity.modules.audio": "1.0.0", - "com.unity.modules.cloth": "1.0.0", - "com.unity.modules.director": "1.0.0", - "com.unity.modules.imageconversion": "1.0.0", - "com.unity.modules.imgui": "1.0.0", - "com.unity.modules.jsonserialize": "1.0.0", - "com.unity.modules.particlesystem": "1.0.0", - "com.unity.modules.physics": "1.0.0", - "com.unity.modules.physics2d": "1.0.0", - "com.unity.modules.screencapture": "1.0.0", - "com.unity.modules.terrain": "1.0.0", - "com.unity.modules.terrainphysics": "1.0.0", - "com.unity.modules.tilemap": "1.0.0", - "com.unity.modules.ui": "1.0.0", - "com.unity.modules.uielements": "1.0.0", - "com.unity.modules.umbra": "1.0.0", - "com.unity.modules.unityanalytics": "1.0.0", - "com.unity.modules.unitywebrequest": "1.0.0", - "com.unity.modules.unitywebrequestassetbundle": "1.0.0", - "com.unity.modules.unitywebrequestaudio": "1.0.0", - "com.unity.modules.unitywebrequesttexture": "1.0.0", - "com.unity.modules.unitywebrequestwww": "1.0.0", - "com.unity.modules.vehicles": "1.0.0", - "com.unity.modules.video": "1.0.0", - "com.unity.modules.vr": "1.0.0", - "com.unity.modules.wind": "1.0.0", - "com.unity.modules.xr": "1.0.0" - } -} diff --git a/ProjectSettings/AudioManager.asset b/ProjectSettings/AudioManager.asset deleted file mode 100644 index da61125..0000000 --- a/ProjectSettings/AudioManager.asset +++ /dev/null @@ -1,17 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!11 &1 -AudioManager: - m_ObjectHideFlags: 0 - m_Volume: 1 - Rolloff Scale: 1 - Doppler Factor: 1 - Default Speaker Mode: 2 - m_SampleRate: 0 - m_DSPBufferSize: 0 - m_VirtualVoiceCount: 512 - m_RealVoiceCount: 32 - m_SpatializerPlugin: - m_AmbisonicDecoderPlugin: - m_DisableAudio: 0 - m_VirtualizeEffects: 1 diff --git a/ProjectSettings/ClusterInputManager.asset b/ProjectSettings/ClusterInputManager.asset deleted file mode 100644 index e7886b2..0000000 --- a/ProjectSettings/ClusterInputManager.asset +++ /dev/null @@ -1,6 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!236 &1 -ClusterInputManager: - m_ObjectHideFlags: 0 - m_Inputs: [] diff --git a/ProjectSettings/DynamicsManager.asset b/ProjectSettings/DynamicsManager.asset deleted file mode 100644 index 1931946..0000000 --- a/ProjectSettings/DynamicsManager.asset +++ /dev/null @@ -1,19 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!55 &1 -PhysicsManager: - m_ObjectHideFlags: 0 - serializedVersion: 3 - m_Gravity: {x: 0, y: -9.81, z: 0} - m_DefaultMaterial: {fileID: 0} - m_BounceThreshold: 2 - m_SleepThreshold: 0.005 - m_DefaultContactOffset: 0.01 - m_DefaultSolverIterations: 6 - m_DefaultSolverVelocityIterations: 1 - m_QueriesHitBackfaces: 0 - m_QueriesHitTriggers: 1 - m_EnableAdaptiveForce: 0 - m_EnablePCM: 1 - m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff - m_AutoSimulation: 1 diff --git a/ProjectSettings/EditorBuildSettings.asset b/ProjectSettings/EditorBuildSettings.asset deleted file mode 100644 index 6dc24f7..0000000 --- a/ProjectSettings/EditorBuildSettings.asset +++ /dev/null @@ -1,7 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1045 &1 -EditorBuildSettings: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Scenes: [] diff --git a/ProjectSettings/EditorSettings.asset b/ProjectSettings/EditorSettings.asset deleted file mode 100644 index 9ccec94..0000000 --- a/ProjectSettings/EditorSettings.asset +++ /dev/null @@ -1,35 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!159 &1 -EditorSettings: - m_ObjectHideFlags: 0 - serializedVersion: 9 - m_ExternalVersionControlSupport: Visible Meta Files - m_SerializationMode: 2 - m_LineEndingsForNewScripts: 1 - m_DefaultBehaviorMode: 0 - m_PrefabRegularEnvironment: {fileID: 0} - m_PrefabUIEnvironment: {fileID: 0} - m_SpritePackerMode: 0 - m_SpritePackerPaddingPower: 1 - m_EtcTextureCompressorBehavior: 0 - m_EtcTextureFastCompressor: 2 - m_EtcTextureNormalCompressor: 2 - m_EtcTextureBestCompressor: 5 - m_ProjectGenerationIncludedExtensions: txt;xml;fnt;cd;asmref - m_ProjectGenerationRootNamespace: - m_CollabEditorSettings: - inProgressEnabled: 1 - m_EnableTextureStreamingInEditMode: 1 - m_EnableTextureStreamingInPlayMode: 1 - m_AsyncShaderCompilation: 1 - m_EnterPlayModeOptionsEnabled: 0 - m_EnterPlayModeOptions: 3 - m_ShowLightmapResolutionOverlay: 1 - m_UseLegacyProbeSampleCount: 1 - m_AssetPipelineMode: 1 - m_CacheServerMode: 0 - m_CacheServerEndpoint: - m_CacheServerNamespacePrefix: default - m_CacheServerEnableDownload: 1 - m_CacheServerEnableUpload: 1 diff --git a/ProjectSettings/GraphicsSettings.asset b/ProjectSettings/GraphicsSettings.asset deleted file mode 100644 index 74d7b53..0000000 --- a/ProjectSettings/GraphicsSettings.asset +++ /dev/null @@ -1,61 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!30 &1 -GraphicsSettings: - m_ObjectHideFlags: 0 - serializedVersion: 12 - m_Deferred: - m_Mode: 1 - m_Shader: {fileID: 69, guid: 0000000000000000f000000000000000, type: 0} - m_DeferredReflections: - m_Mode: 1 - m_Shader: {fileID: 74, guid: 0000000000000000f000000000000000, type: 0} - m_ScreenSpaceShadows: - m_Mode: 1 - m_Shader: {fileID: 64, guid: 0000000000000000f000000000000000, type: 0} - m_LegacyDeferred: - m_Mode: 1 - m_Shader: {fileID: 63, guid: 0000000000000000f000000000000000, type: 0} - m_DepthNormals: - m_Mode: 1 - m_Shader: {fileID: 62, guid: 0000000000000000f000000000000000, type: 0} - m_MotionVectors: - m_Mode: 1 - m_Shader: {fileID: 75, guid: 0000000000000000f000000000000000, type: 0} - m_LightHalo: - m_Mode: 1 - m_Shader: {fileID: 105, guid: 0000000000000000f000000000000000, type: 0} - m_LensFlare: - m_Mode: 1 - m_Shader: {fileID: 102, guid: 0000000000000000f000000000000000, type: 0} - m_AlwaysIncludedShaders: - - {fileID: 7, guid: 0000000000000000f000000000000000, type: 0} - - {fileID: 15104, guid: 0000000000000000f000000000000000, type: 0} - - {fileID: 15105, guid: 0000000000000000f000000000000000, type: 0} - - {fileID: 15106, guid: 0000000000000000f000000000000000, type: 0} - - {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0} - - {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0} - m_PreloadedShaders: [] - m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000, - type: 0} - m_CustomRenderPipeline: {fileID: 0} - m_TransparencySortMode: 0 - m_TransparencySortAxis: {x: 0, y: 0, z: 1} - m_DefaultRenderingPath: 1 - m_DefaultMobileRenderingPath: 1 - m_TierSettings: [] - m_LightmapStripping: 0 - m_FogStripping: 0 - m_InstancingStripping: 0 - m_LightmapKeepPlain: 1 - m_LightmapKeepDirCombined: 1 - m_LightmapKeepDynamicPlain: 1 - m_LightmapKeepDynamicDirCombined: 1 - m_LightmapKeepShadowMask: 1 - m_LightmapKeepSubtractive: 1 - m_FogKeepLinear: 1 - m_FogKeepExp: 1 - m_FogKeepExp2: 1 - m_AlbedoSwatchInfos: [] - m_LightsUseLinearIntensity: 0 - m_LightsUseColorTemperature: 0 diff --git a/ProjectSettings/InputManager.asset b/ProjectSettings/InputManager.asset deleted file mode 100644 index 17c8f53..0000000 --- a/ProjectSettings/InputManager.asset +++ /dev/null @@ -1,295 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!13 &1 -InputManager: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Axes: - - serializedVersion: 3 - m_Name: Horizontal - descriptiveName: - descriptiveNegativeName: - negativeButton: left - positiveButton: right - altNegativeButton: a - altPositiveButton: d - gravity: 3 - dead: 0.001 - sensitivity: 3 - snap: 1 - invert: 0 - type: 0 - axis: 0 - joyNum: 0 - - serializedVersion: 3 - m_Name: Vertical - descriptiveName: - descriptiveNegativeName: - negativeButton: down - positiveButton: up - altNegativeButton: s - altPositiveButton: w - gravity: 3 - dead: 0.001 - sensitivity: 3 - snap: 1 - invert: 0 - type: 0 - axis: 0 - joyNum: 0 - - serializedVersion: 3 - m_Name: Fire1 - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: left ctrl - altNegativeButton: - altPositiveButton: mouse 0 - gravity: 1000 - dead: 0.001 - sensitivity: 1000 - snap: 0 - invert: 0 - type: 0 - axis: 0 - joyNum: 0 - - serializedVersion: 3 - m_Name: Fire2 - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: left alt - altNegativeButton: - altPositiveButton: mouse 1 - gravity: 1000 - dead: 0.001 - sensitivity: 1000 - snap: 0 - invert: 0 - type: 0 - axis: 0 - joyNum: 0 - - serializedVersion: 3 - m_Name: Fire3 - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: left shift - altNegativeButton: - altPositiveButton: mouse 2 - gravity: 1000 - dead: 0.001 - sensitivity: 1000 - snap: 0 - invert: 0 - type: 0 - axis: 0 - joyNum: 0 - - serializedVersion: 3 - m_Name: Jump - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: space - altNegativeButton: - altPositiveButton: - gravity: 1000 - dead: 0.001 - sensitivity: 1000 - snap: 0 - invert: 0 - type: 0 - axis: 0 - joyNum: 0 - - serializedVersion: 3 - m_Name: Mouse X - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: - altNegativeButton: - altPositiveButton: - gravity: 0 - dead: 0 - sensitivity: 0.1 - snap: 0 - invert: 0 - type: 1 - axis: 0 - joyNum: 0 - - serializedVersion: 3 - m_Name: Mouse Y - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: - altNegativeButton: - altPositiveButton: - gravity: 0 - dead: 0 - sensitivity: 0.1 - snap: 0 - invert: 0 - type: 1 - axis: 1 - joyNum: 0 - - serializedVersion: 3 - m_Name: Mouse ScrollWheel - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: - altNegativeButton: - altPositiveButton: - gravity: 0 - dead: 0 - sensitivity: 0.1 - snap: 0 - invert: 0 - type: 1 - axis: 2 - joyNum: 0 - - serializedVersion: 3 - m_Name: Horizontal - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: - altNegativeButton: - altPositiveButton: - gravity: 0 - dead: 0.19 - sensitivity: 1 - snap: 0 - invert: 0 - type: 2 - axis: 0 - joyNum: 0 - - serializedVersion: 3 - m_Name: Vertical - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: - altNegativeButton: - altPositiveButton: - gravity: 0 - dead: 0.19 - sensitivity: 1 - snap: 0 - invert: 1 - type: 2 - axis: 1 - joyNum: 0 - - serializedVersion: 3 - m_Name: Fire1 - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: joystick button 0 - altNegativeButton: - altPositiveButton: - gravity: 1000 - dead: 0.001 - sensitivity: 1000 - snap: 0 - invert: 0 - type: 0 - axis: 0 - joyNum: 0 - - serializedVersion: 3 - m_Name: Fire2 - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: joystick button 1 - altNegativeButton: - altPositiveButton: - gravity: 1000 - dead: 0.001 - sensitivity: 1000 - snap: 0 - invert: 0 - type: 0 - axis: 0 - joyNum: 0 - - serializedVersion: 3 - m_Name: Fire3 - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: joystick button 2 - altNegativeButton: - altPositiveButton: - gravity: 1000 - dead: 0.001 - sensitivity: 1000 - snap: 0 - invert: 0 - type: 0 - axis: 0 - joyNum: 0 - - serializedVersion: 3 - m_Name: Jump - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: joystick button 3 - altNegativeButton: - altPositiveButton: - gravity: 1000 - dead: 0.001 - sensitivity: 1000 - snap: 0 - invert: 0 - type: 0 - axis: 0 - joyNum: 0 - - serializedVersion: 3 - m_Name: Submit - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: return - altNegativeButton: - altPositiveButton: joystick button 0 - gravity: 1000 - dead: 0.001 - sensitivity: 1000 - snap: 0 - invert: 0 - type: 0 - axis: 0 - joyNum: 0 - - serializedVersion: 3 - m_Name: Submit - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: enter - altNegativeButton: - altPositiveButton: space - gravity: 1000 - dead: 0.001 - sensitivity: 1000 - snap: 0 - invert: 0 - type: 0 - axis: 0 - joyNum: 0 - - serializedVersion: 3 - m_Name: Cancel - descriptiveName: - descriptiveNegativeName: - negativeButton: - positiveButton: escape - altNegativeButton: - altPositiveButton: joystick button 1 - gravity: 1000 - dead: 0.001 - sensitivity: 1000 - snap: 0 - invert: 0 - type: 0 - axis: 0 - joyNum: 0 diff --git a/ProjectSettings/NavMeshAreas.asset b/ProjectSettings/NavMeshAreas.asset deleted file mode 100644 index 6dd520f..0000000 --- a/ProjectSettings/NavMeshAreas.asset +++ /dev/null @@ -1,89 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!126 &1 -NavMeshProjectSettings: - m_ObjectHideFlags: 0 - serializedVersion: 2 - areas: - - name: Walkable - cost: 1 - - name: Not Walkable - cost: 1 - - name: Jump - cost: 2 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - - name: - cost: 1 - m_LastAgentTypeID: -887442657 - m_Settings: - - serializedVersion: 2 - agentTypeID: 0 - agentRadius: 0.5 - agentHeight: 2 - agentSlope: 45 - agentClimb: 0.75 - ledgeDropHeight: 0 - maxJumpAcrossDistance: 0 - minRegionArea: 2 - manualCellSize: 0 - cellSize: 0.16666667 - manualTileSize: 0 - tileSize: 256 - accuratePlacement: 0 - m_SettingNames: - - Humanoid diff --git a/ProjectSettings/NetworkManager.asset b/ProjectSettings/NetworkManager.asset deleted file mode 100644 index 5dc6a83..0000000 --- a/ProjectSettings/NetworkManager.asset +++ /dev/null @@ -1,8 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!149 &1 -NetworkManager: - m_ObjectHideFlags: 0 - m_DebugLevel: 0 - m_Sendrate: 15 - m_AssetToPrefab: {} diff --git a/ProjectSettings/Physics2DSettings.asset b/ProjectSettings/Physics2DSettings.asset deleted file mode 100644 index e3b2d0b..0000000 --- a/ProjectSettings/Physics2DSettings.asset +++ /dev/null @@ -1,36 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!19 &1 -Physics2DSettings: - m_ObjectHideFlags: 0 - serializedVersion: 3 - m_Gravity: {x: 0, y: -9.81} - m_DefaultMaterial: {fileID: 0} - m_VelocityIterations: 8 - m_PositionIterations: 3 - m_VelocityThreshold: 1 - m_MaxLinearCorrection: 0.2 - m_MaxAngularCorrection: 8 - m_MaxTranslationSpeed: 100 - m_MaxRotationSpeed: 360 - m_BaumgarteScale: 0.2 - m_BaumgarteTimeOfImpactScale: 0.75 - m_TimeToSleep: 0.5 - m_LinearSleepTolerance: 0.01 - m_AngularSleepTolerance: 2 - m_DefaultContactOffset: 0.01 - m_AutoSimulation: 1 - m_QueriesHitTriggers: 1 - m_QueriesStartInColliders: 1 - m_ChangeStopsCallbacks: 0 - m_CallbacksOnDisable: 1 - m_AlwaysShowColliders: 0 - m_ShowColliderSleep: 1 - m_ShowColliderContacts: 0 - m_ShowColliderAABB: 0 - m_ContactArrowScale: 0.2 - m_ColliderAwakeColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.7529412} - m_ColliderAsleepColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.36078432} - m_ColliderContactColor: {r: 1, g: 0, b: 1, a: 0.6862745} - m_ColliderAABBColor: {r: 1, g: 1, b: 0, a: 0.2509804} - m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff diff --git a/ProjectSettings/PresetManager.asset b/ProjectSettings/PresetManager.asset deleted file mode 100644 index 67a94da..0000000 --- a/ProjectSettings/PresetManager.asset +++ /dev/null @@ -1,7 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1386491679 &1 -PresetManager: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_DefaultPresets: {} diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset deleted file mode 100644 index 5d778b8..0000000 --- a/ProjectSettings/ProjectSettings.asset +++ /dev/null @@ -1,647 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!129 &1 -PlayerSettings: - m_ObjectHideFlags: 0 - serializedVersion: 20 - productGUID: 36f97d821ecfac149ae5eae5c4496e56 - AndroidProfiler: 0 - AndroidFilterTouchesWhenObscured: 0 - AndroidEnableSustainedPerformanceMode: 0 - defaultScreenOrientation: 4 - targetDevice: 2 - useOnDemandResources: 0 - accelerometerFrequency: 60 - companyName: DefaultCompany - productName: UnityLibrary - defaultCursor: {fileID: 0} - cursorHotspot: {x: 0, y: 0} - m_SplashScreenBackgroundColor: {r: 0.13725491, g: 0.12156863, b: 0.1254902, a: 1} - m_ShowUnitySplashScreen: 1 - m_ShowUnitySplashLogo: 1 - m_SplashScreenOverlayOpacity: 1 - m_SplashScreenAnimation: 1 - m_SplashScreenLogoStyle: 1 - m_SplashScreenDrawMode: 0 - m_SplashScreenBackgroundAnimationZoom: 1 - m_SplashScreenLogoAnimationZoom: 1 - m_SplashScreenBackgroundLandscapeAspect: 1 - m_SplashScreenBackgroundPortraitAspect: 1 - m_SplashScreenBackgroundLandscapeUvs: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - m_SplashScreenBackgroundPortraitUvs: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - m_SplashScreenLogos: [] - m_VirtualRealitySplashScreen: {fileID: 0} - m_HolographicTrackingLossScreen: {fileID: 0} - defaultScreenWidth: 1024 - defaultScreenHeight: 768 - defaultScreenWidthWeb: 960 - defaultScreenHeightWeb: 600 - m_StereoRenderingPath: 0 - m_ActiveColorSpace: 0 - m_MTRendering: 1 - m_StackTraceTypes: 010000000100000001000000010000000100000001000000 - iosShowActivityIndicatorOnLoading: -1 - androidShowActivityIndicatorOnLoading: -1 - iosUseCustomAppBackgroundBehavior: 0 - iosAllowHTTPDownload: 1 - allowedAutorotateToPortrait: 1 - allowedAutorotateToPortraitUpsideDown: 1 - allowedAutorotateToLandscapeRight: 1 - allowedAutorotateToLandscapeLeft: 1 - useOSAutorotation: 1 - use32BitDisplayBuffer: 1 - preserveFramebufferAlpha: 0 - disableDepthAndStencilBuffers: 0 - androidStartInFullscreen: 1 - androidRenderOutsideSafeArea: 1 - androidUseSwappy: 0 - androidBlitType: 0 - defaultIsNativeResolution: 1 - macRetinaSupport: 1 - runInBackground: 0 - captureSingleScreen: 0 - muteOtherAudioSources: 0 - Prepare IOS For Recording: 0 - Force IOS Speakers When Recording: 0 - deferSystemGesturesMode: 0 - hideHomeButton: 0 - submitAnalytics: 1 - usePlayerLog: 1 - bakeCollisionMeshes: 0 - forceSingleInstance: 0 - useFlipModelSwapchain: 1 - resizableWindow: 0 - useMacAppStoreValidation: 0 - macAppStoreCategory: public.app-category.games - gpuSkinning: 0 - xboxPIXTextureCapture: 0 - xboxEnableAvatar: 0 - xboxEnableKinect: 0 - xboxEnableKinectAutoTracking: 0 - xboxEnableFitness: 0 - visibleInBackground: 1 - allowFullscreenSwitch: 1 - fullscreenMode: 1 - xboxSpeechDB: 0 - xboxEnableHeadOrientation: 0 - xboxEnableGuest: 0 - xboxEnablePIXSampling: 0 - metalFramebufferOnly: 0 - xboxOneResolution: 0 - xboxOneSResolution: 0 - xboxOneXResolution: 3 - xboxOneMonoLoggingLevel: 0 - xboxOneLoggingLevel: 1 - xboxOneDisableEsram: 0 - xboxOneEnableTypeOptimization: 0 - xboxOnePresentImmediateThreshold: 0 - switchQueueCommandMemory: 1048576 - switchQueueControlMemory: 16384 - switchQueueComputeMemory: 262144 - switchNVNShaderPoolsGranularity: 33554432 - switchNVNDefaultPoolsGranularity: 16777216 - switchNVNOtherPoolsGranularity: 16777216 - vulkanNumSwapchainBuffers: 3 - vulkanEnableSetSRGBWrite: 0 - m_SupportedAspectRatios: - 4:3: 1 - 5:4: 1 - 16:10: 1 - 16:9: 1 - Others: 1 - bundleVersion: 1.0 - preloadedAssets: [] - metroInputSource: 0 - wsaTransparentSwapchain: 0 - m_HolographicPauseOnTrackingLoss: 1 - xboxOneDisableKinectGpuReservation: 0 - xboxOneEnable7thCore: 0 - vrSettings: - cardboard: - depthFormat: 0 - enableTransitionView: 0 - daydream: - depthFormat: 0 - useSustainedPerformanceMode: 0 - enableVideoLayer: 0 - useProtectedVideoMemory: 0 - minimumSupportedHeadTracking: 0 - maximumSupportedHeadTracking: 1 - hololens: - depthFormat: 1 - depthBufferSharingEnabled: 1 - lumin: - depthFormat: 0 - frameTiming: 2 - enableGLCache: 0 - glCacheMaxBlobSize: 524288 - glCacheMaxFileSize: 8388608 - oculus: - sharedDepthBuffer: 1 - dashSupport: 1 - lowOverheadMode: 0 - protectedContext: 0 - v2Signing: 1 - enable360StereoCapture: 0 - isWsaHolographicRemotingEnabled: 0 - enableFrameTimingStats: 0 - useHDRDisplay: 0 - D3DHDRBitDepth: 0 - m_ColorGamuts: 00000000 - targetPixelDensity: 30 - resolutionScalingMode: 0 - androidSupportedAspectRatio: 1 - androidMaxAspectRatio: 2.1 - applicationIdentifier: {} - buildNumber: {} - AndroidBundleVersionCode: 1 - AndroidMinSdkVersion: 19 - AndroidTargetSdkVersion: 0 - AndroidPreferredInstallLocation: 1 - aotOptions: - stripEngineCode: 1 - iPhoneStrippingLevel: 0 - iPhoneScriptCallOptimization: 0 - ForceInternetPermission: 0 - ForceSDCardPermission: 0 - CreateWallpaper: 0 - APKExpansionFiles: 0 - keepLoadedShadersAlive: 0 - StripUnusedMeshComponents: 0 - VertexChannelCompressionMask: 214 - iPhoneSdkVersion: 988 - iOSTargetOSVersionString: 10.0 - tvOSSdkVersion: 0 - tvOSRequireExtendedGameController: 0 - tvOSTargetOSVersionString: 10.0 - uIPrerenderedIcon: 0 - uIRequiresPersistentWiFi: 0 - uIRequiresFullScreen: 1 - uIStatusBarHidden: 1 - uIExitOnSuspend: 0 - uIStatusBarStyle: 0 - iPhoneSplashScreen: {fileID: 0} - iPhoneHighResSplashScreen: {fileID: 0} - iPhoneTallHighResSplashScreen: {fileID: 0} - iPhone47inSplashScreen: {fileID: 0} - iPhone55inPortraitSplashScreen: {fileID: 0} - iPhone55inLandscapeSplashScreen: {fileID: 0} - iPhone58inPortraitSplashScreen: {fileID: 0} - iPhone58inLandscapeSplashScreen: {fileID: 0} - iPadPortraitSplashScreen: {fileID: 0} - iPadHighResPortraitSplashScreen: {fileID: 0} - iPadLandscapeSplashScreen: {fileID: 0} - iPadHighResLandscapeSplashScreen: {fileID: 0} - iPhone65inPortraitSplashScreen: {fileID: 0} - iPhone65inLandscapeSplashScreen: {fileID: 0} - iPhone61inPortraitSplashScreen: {fileID: 0} - iPhone61inLandscapeSplashScreen: {fileID: 0} - appleTVSplashScreen: {fileID: 0} - appleTVSplashScreen2x: {fileID: 0} - tvOSSmallIconLayers: [] - tvOSSmallIconLayers2x: [] - tvOSLargeIconLayers: [] - tvOSLargeIconLayers2x: [] - tvOSTopShelfImageLayers: [] - tvOSTopShelfImageLayers2x: [] - tvOSTopShelfImageWideLayers: [] - tvOSTopShelfImageWideLayers2x: [] - iOSLaunchScreenType: 0 - iOSLaunchScreenPortrait: {fileID: 0} - iOSLaunchScreenLandscape: {fileID: 0} - iOSLaunchScreenBackgroundColor: - serializedVersion: 2 - rgba: 0 - iOSLaunchScreenFillPct: 100 - iOSLaunchScreenSize: 100 - iOSLaunchScreenCustomXibPath: - iOSLaunchScreeniPadType: 0 - iOSLaunchScreeniPadImage: {fileID: 0} - iOSLaunchScreeniPadBackgroundColor: - serializedVersion: 2 - rgba: 0 - iOSLaunchScreeniPadFillPct: 100 - iOSLaunchScreeniPadSize: 100 - iOSLaunchScreeniPadCustomXibPath: - iOSUseLaunchScreenStoryboard: 0 - iOSLaunchScreenCustomStoryboardPath: - iOSDeviceRequirements: [] - iOSURLSchemes: [] - iOSBackgroundModes: 0 - iOSMetalForceHardShadows: 0 - metalEditorSupport: 1 - metalAPIValidation: 1 - iOSRenderExtraFrameOnPause: 0 - appleDeveloperTeamID: - iOSManualSigningProvisioningProfileID: - tvOSManualSigningProvisioningProfileID: - iOSManualSigningProvisioningProfileType: 0 - tvOSManualSigningProvisioningProfileType: 0 - appleEnableAutomaticSigning: 0 - iOSRequireARKit: 0 - iOSAutomaticallyDetectAndAddCapabilities: 1 - appleEnableProMotion: 0 - clonedFromGUID: 00000000000000000000000000000000 - templatePackageId: - templateDefaultScene: - AndroidTargetArchitectures: 1 - AndroidSplashScreenScale: 0 - androidSplashScreen: {fileID: 0} - AndroidKeystoreName: '{inproject}: ' - AndroidKeyaliasName: - AndroidBuildApkPerCpuArchitecture: 0 - AndroidTVCompatibility: 1 - AndroidIsGame: 1 - AndroidEnableTango: 0 - androidEnableBanner: 1 - androidUseLowAccuracyLocation: 0 - androidUseCustomKeystore: 0 - m_AndroidBanners: - - width: 320 - height: 180 - banner: {fileID: 0} - androidGamepadSupportLevel: 0 - AndroidValidateAppBundleSize: 1 - AndroidAppBundleSizeToValidate: 150 - m_BuildTargetIcons: [] - m_BuildTargetPlatformIcons: [] - m_BuildTargetBatching: [] - m_BuildTargetGraphicsJobs: - - m_BuildTarget: MacStandaloneSupport - m_GraphicsJobs: 0 - - m_BuildTarget: Switch - m_GraphicsJobs: 0 - - m_BuildTarget: MetroSupport - m_GraphicsJobs: 0 - - m_BuildTarget: AppleTVSupport - m_GraphicsJobs: 0 - - m_BuildTarget: BJMSupport - m_GraphicsJobs: 0 - - m_BuildTarget: LinuxStandaloneSupport - m_GraphicsJobs: 0 - - m_BuildTarget: PS4Player - m_GraphicsJobs: 0 - - m_BuildTarget: iOSSupport - m_GraphicsJobs: 0 - - m_BuildTarget: WindowsStandaloneSupport - m_GraphicsJobs: 0 - - m_BuildTarget: XboxOnePlayer - m_GraphicsJobs: 0 - - m_BuildTarget: LuminSupport - m_GraphicsJobs: 0 - - m_BuildTarget: AndroidPlayer - m_GraphicsJobs: 0 - - m_BuildTarget: WebGLSupport - m_GraphicsJobs: 0 - m_BuildTargetGraphicsJobMode: - - m_BuildTarget: PS4Player - m_GraphicsJobMode: 0 - - m_BuildTarget: XboxOnePlayer - m_GraphicsJobMode: 0 - m_BuildTargetGraphicsAPIs: [] - m_BuildTargetVRSettings: [] - openGLRequireES31: 0 - openGLRequireES31AEP: 0 - openGLRequireES32: 0 - m_TemplateCustomTags: {} - mobileMTRendering: - iPhone: 1 - tvOS: 1 - m_BuildTargetGroupLightmapEncodingQuality: - - m_BuildTarget: Standalone - m_EncodingQuality: 1 - - m_BuildTarget: XboxOne - m_EncodingQuality: 1 - - m_BuildTarget: PS4 - m_EncodingQuality: 1 - m_BuildTargetGroupLightmapSettings: [] - playModeTestRunnerEnabled: 1 - runPlayModeTestAsEditModeTest: 0 - actionOnDotNetUnhandledException: 1 - enableInternalProfiler: 0 - logObjCUncaughtExceptions: 1 - enableCrashReportAPI: 0 - cameraUsageDescription: - locationUsageDescription: - microphoneUsageDescription: - switchNetLibKey: - switchSocketMemoryPoolSize: 6144 - switchSocketAllocatorPoolSize: 128 - switchSocketConcurrencyLimit: 14 - switchScreenResolutionBehavior: 2 - switchUseCPUProfiler: 0 - switchApplicationID: 0x01004b9000490000 - switchNSODependencies: - switchTitleNames_0: - switchTitleNames_1: - switchTitleNames_2: - switchTitleNames_3: - switchTitleNames_4: - switchTitleNames_5: - switchTitleNames_6: - switchTitleNames_7: - switchTitleNames_8: - switchTitleNames_9: - switchTitleNames_10: - switchTitleNames_11: - switchTitleNames_12: - switchTitleNames_13: - switchTitleNames_14: - switchPublisherNames_0: - switchPublisherNames_1: - switchPublisherNames_2: - switchPublisherNames_3: - switchPublisherNames_4: - switchPublisherNames_5: - switchPublisherNames_6: - switchPublisherNames_7: - switchPublisherNames_8: - switchPublisherNames_9: - switchPublisherNames_10: - switchPublisherNames_11: - switchPublisherNames_12: - switchPublisherNames_13: - switchPublisherNames_14: - switchIcons_0: {fileID: 0} - switchIcons_1: {fileID: 0} - switchIcons_2: {fileID: 0} - switchIcons_3: {fileID: 0} - switchIcons_4: {fileID: 0} - switchIcons_5: {fileID: 0} - switchIcons_6: {fileID: 0} - switchIcons_7: {fileID: 0} - switchIcons_8: {fileID: 0} - switchIcons_9: {fileID: 0} - switchIcons_10: {fileID: 0} - switchIcons_11: {fileID: 0} - switchIcons_12: {fileID: 0} - switchIcons_13: {fileID: 0} - switchIcons_14: {fileID: 0} - switchSmallIcons_0: {fileID: 0} - switchSmallIcons_1: {fileID: 0} - switchSmallIcons_2: {fileID: 0} - switchSmallIcons_3: {fileID: 0} - switchSmallIcons_4: {fileID: 0} - switchSmallIcons_5: {fileID: 0} - switchSmallIcons_6: {fileID: 0} - switchSmallIcons_7: {fileID: 0} - switchSmallIcons_8: {fileID: 0} - switchSmallIcons_9: {fileID: 0} - switchSmallIcons_10: {fileID: 0} - switchSmallIcons_11: {fileID: 0} - switchSmallIcons_12: {fileID: 0} - switchSmallIcons_13: {fileID: 0} - switchSmallIcons_14: {fileID: 0} - switchManualHTML: - switchAccessibleURLs: - switchLegalInformation: - switchMainThreadStackSize: 1048576 - switchPresenceGroupId: 0x01004b9000490000 - switchLogoHandling: 0 - switchReleaseVersion: 0 - switchDisplayVersion: 1.0.0 - switchStartupUserAccount: 0 - switchTouchScreenUsage: 0 - switchSupportedLanguagesMask: 0 - switchLogoType: 0 - switchApplicationErrorCodeCategory: - switchUserAccountSaveDataSize: 0 - switchUserAccountSaveDataJournalSize: 0 - switchApplicationAttribute: 0 - switchCardSpecSize: 4 - switchCardSpecClock: 25 - switchRatingsMask: 0 - switchRatingsInt_0: 0 - switchRatingsInt_1: 0 - switchRatingsInt_2: 0 - switchRatingsInt_3: 0 - switchRatingsInt_4: 0 - switchRatingsInt_5: 0 - switchRatingsInt_6: 0 - switchRatingsInt_7: 0 - switchRatingsInt_8: 0 - switchRatingsInt_9: 0 - switchRatingsInt_10: 0 - switchRatingsInt_11: 0 - switchRatingsInt_12: 0 - switchLocalCommunicationIds_0: 0x01004b9000490000 - switchLocalCommunicationIds_1: - switchLocalCommunicationIds_2: - switchLocalCommunicationIds_3: - switchLocalCommunicationIds_4: - switchLocalCommunicationIds_5: - switchLocalCommunicationIds_6: - switchLocalCommunicationIds_7: - switchParentalControl: 0 - switchAllowsScreenshot: 1 - switchAllowsVideoCapturing: 1 - switchAllowsRuntimeAddOnContentInstall: 0 - switchDataLossConfirmation: 0 - switchUserAccountLockEnabled: 0 - switchSystemResourceMemory: 16777216 - switchSupportedNpadStyles: 3 - switchNativeFsCacheSize: 32 - switchIsHoldTypeHorizontal: 0 - switchSupportedNpadCount: 8 - switchSocketConfigEnabled: 0 - switchTcpInitialSendBufferSize: 32 - switchTcpInitialReceiveBufferSize: 64 - switchTcpAutoSendBufferSizeMax: 256 - switchTcpAutoReceiveBufferSizeMax: 256 - switchUdpSendBufferSize: 9 - switchUdpReceiveBufferSize: 42 - switchSocketBufferEfficiency: 4 - switchSocketInitializeEnabled: 1 - switchNetworkInterfaceManagerInitializeEnabled: 1 - switchPlayerConnectionEnabled: 1 - ps4NPAgeRating: 12 - ps4NPTitleSecret: - ps4NPTrophyPackPath: - ps4ParentalLevel: 11 - ps4ContentID: ED1633-NPXX51362_00-0000000000000000 - ps4Category: 0 - ps4MasterVersion: 01.00 - ps4AppVersion: 01.00 - ps4AppType: 0 - ps4ParamSfxPath: - ps4VideoOutPixelFormat: 0 - ps4VideoOutInitialWidth: 1920 - ps4VideoOutBaseModeInitialWidth: 1920 - ps4VideoOutReprojectionRate: 120 - ps4PronunciationXMLPath: - ps4PronunciationSIGPath: - ps4BackgroundImagePath: - ps4StartupImagePath: - ps4StartupImagesFolder: - ps4IconImagesFolder: - ps4SaveDataImagePath: - ps4SdkOverride: - ps4BGMPath: - ps4ShareFilePath: - ps4ShareOverlayImagePath: - ps4PrivacyGuardImagePath: - ps4NPtitleDatPath: - ps4RemotePlayKeyAssignment: -1 - ps4RemotePlayKeyMappingDir: - ps4PlayTogetherPlayerCount: 0 - ps4EnterButtonAssignment: 1 - ps4ApplicationParam1: 0 - ps4ApplicationParam2: 0 - ps4ApplicationParam3: 0 - ps4ApplicationParam4: 0 - ps4DownloadDataSize: 0 - ps4GarlicHeapSize: 2048 - ps4ProGarlicHeapSize: 2560 - playerPrefsMaxSize: 32768 - ps4Passcode: frAQBc8Wsa1xVPfvJcrgRYwTiizs2trQ - ps4pnSessions: 1 - ps4pnPresence: 1 - ps4pnFriends: 1 - ps4pnGameCustomData: 1 - playerPrefsSupport: 0 - enableApplicationExit: 0 - resetTempFolder: 1 - restrictedAudioUsageRights: 0 - ps4UseResolutionFallback: 0 - ps4ReprojectionSupport: 0 - ps4UseAudio3dBackend: 0 - ps4SocialScreenEnabled: 0 - ps4ScriptOptimizationLevel: 0 - ps4Audio3dVirtualSpeakerCount: 14 - ps4attribCpuUsage: 0 - ps4PatchPkgPath: - ps4PatchLatestPkgPath: - ps4PatchChangeinfoPath: - ps4PatchDayOne: 0 - ps4attribUserManagement: 0 - ps4attribMoveSupport: 0 - ps4attrib3DSupport: 0 - ps4attribShareSupport: 0 - ps4attribExclusiveVR: 0 - ps4disableAutoHideSplash: 0 - ps4videoRecordingFeaturesUsed: 0 - ps4contentSearchFeaturesUsed: 0 - ps4attribEyeToEyeDistanceSettingVR: 0 - ps4IncludedModules: [] - ps4attribVROutputEnabled: 0 - monoEnv: - splashScreenBackgroundSourceLandscape: {fileID: 0} - splashScreenBackgroundSourcePortrait: {fileID: 0} - blurSplashScreenBackground: 1 - spritePackerPolicy: - webGLMemorySize: 256 - webGLExceptionSupport: 1 - webGLNameFilesAsHashes: 0 - webGLDataCaching: 0 - webGLDebugSymbols: 0 - webGLEmscriptenArgs: - webGLModulesDirectory: - webGLTemplate: APPLICATION:Default - webGLAnalyzeBuildSize: 0 - webGLUseEmbeddedResources: 0 - webGLCompressionFormat: 1 - webGLLinkerTarget: 1 - webGLThreadsSupport: 0 - webGLWasmStreaming: 0 - scriptingDefineSymbols: - 1: MYCOMPANY;MYCOMPANY_MYPACKAGE - platformArchitecture: {} - scriptingBackend: {} - il2cppCompilerConfiguration: {} - managedStrippingLevel: {} - incrementalIl2cppBuild: {} - allowUnsafeCode: 0 - additionalIl2CppArgs: - scriptingRuntimeVersion: 1 - gcIncremental: 0 - gcWBarrierValidation: 0 - apiCompatibilityLevelPerPlatform: {} - m_RenderingPath: 1 - m_MobileRenderingPath: 1 - metroPackageName: UnityLibrary - metroPackageVersion: - metroCertificatePath: - metroCertificatePassword: - metroCertificateSubject: - metroCertificateIssuer: - metroCertificateNotAfter: 0000000000000000 - metroApplicationDescription: UnityLibrary - wsaImages: {} - metroTileShortName: - metroTileShowName: 0 - metroMediumTileShowName: 0 - metroLargeTileShowName: 0 - metroWideTileShowName: 0 - metroSupportStreamingInstall: 0 - metroLastRequiredScene: 0 - metroDefaultTileSize: 1 - metroTileForegroundText: 2 - metroTileBackgroundColor: {r: 0.13333334, g: 0.17254902, b: 0.21568628, a: 0} - metroSplashScreenBackgroundColor: {r: 0.12941177, g: 0.17254902, b: 0.21568628, - a: 1} - metroSplashScreenUseBackgroundColor: 0 - platformCapabilities: {} - metroTargetDeviceFamilies: {} - metroFTAName: - metroFTAFileTypes: [] - metroProtocolName: - XboxOneProductId: - XboxOneUpdateKey: - XboxOneSandboxId: - XboxOneContentId: - XboxOneTitleId: - XboxOneSCId: - XboxOneGameOsOverridePath: - XboxOnePackagingOverridePath: - XboxOneAppManifestOverridePath: - XboxOneVersion: 1.0.0.0 - XboxOnePackageEncryption: 0 - XboxOnePackageUpdateGranularity: 2 - XboxOneDescription: - XboxOneLanguage: - - enus - XboxOneCapability: [] - XboxOneGameRating: {} - XboxOneIsContentPackage: 0 - XboxOneEnableGPUVariability: 0 - XboxOneSockets: {} - XboxOneSplashScreen: {fileID: 0} - XboxOneAllowedProductIds: [] - XboxOnePersistentLocalStorageSize: 0 - XboxOneXTitleMemory: 8 - XboxOneOverrideIdentityName: - vrEditorSettings: - daydream: - daydreamIconForeground: {fileID: 0} - daydreamIconBackground: {fileID: 0} - cloudServicesEnabled: {} - luminIcon: - m_Name: - m_ModelFolderPath: - m_PortalFolderPath: - luminCert: - m_CertPath: - m_SignPackage: 1 - luminIsChannelApp: 0 - luminVersion: - m_VersionCode: 1 - m_VersionName: - apiCompatibilityLevel: 6 - cloudProjectId: - framebufferDepthMemorylessMode: 0 - projectName: - organizationId: - cloudEnabled: 0 - enableNativePlatformBackendsForNewInputSystem: 0 - disableOldInputManagerSupport: 0 - legacyClampBlendShapeWeights: 1 diff --git a/ProjectSettings/ProjectVersion.txt b/ProjectSettings/ProjectVersion.txt deleted file mode 100644 index a8d6725..0000000 --- a/ProjectSettings/ProjectVersion.txt +++ /dev/null @@ -1,2 +0,0 @@ -m_EditorVersion: 2019.3.3f1 -m_EditorVersionWithRevision: 2019.3.3f1 (7ceaae5f7503) diff --git a/ProjectSettings/QualitySettings.asset b/ProjectSettings/QualitySettings.asset deleted file mode 100644 index 86c047f..0000000 --- a/ProjectSettings/QualitySettings.asset +++ /dev/null @@ -1,193 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!47 &1 -QualitySettings: - m_ObjectHideFlags: 0 - serializedVersion: 5 - m_CurrentQuality: 5 - m_QualitySettings: - - serializedVersion: 2 - name: Very Low - pixelLightCount: 0 - shadows: 0 - shadowResolution: 0 - shadowProjection: 1 - shadowCascades: 1 - shadowDistance: 15 - shadowNearPlaneOffset: 3 - shadowCascade2Split: 0.33333334 - shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} - shadowmaskMode: 0 - blendWeights: 1 - textureQuality: 1 - anisotropicTextures: 0 - antiAliasing: 0 - softParticles: 0 - softVegetation: 0 - realtimeReflectionProbes: 0 - billboardsFaceCameraPosition: 0 - vSyncCount: 0 - lodBias: 0.3 - maximumLODLevel: 0 - particleRaycastBudget: 4 - asyncUploadTimeSlice: 2 - asyncUploadBufferSize: 4 - resolutionScalingFixedDPIFactor: 1 - excludedTargetPlatforms: [] - - serializedVersion: 2 - name: Low - pixelLightCount: 0 - shadows: 0 - shadowResolution: 0 - shadowProjection: 1 - shadowCascades: 1 - shadowDistance: 20 - shadowNearPlaneOffset: 3 - shadowCascade2Split: 0.33333334 - shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} - shadowmaskMode: 0 - blendWeights: 2 - textureQuality: 0 - anisotropicTextures: 0 - antiAliasing: 0 - softParticles: 0 - softVegetation: 0 - realtimeReflectionProbes: 0 - billboardsFaceCameraPosition: 0 - vSyncCount: 0 - lodBias: 0.4 - maximumLODLevel: 0 - particleRaycastBudget: 16 - asyncUploadTimeSlice: 2 - asyncUploadBufferSize: 4 - resolutionScalingFixedDPIFactor: 1 - excludedTargetPlatforms: [] - - serializedVersion: 2 - name: Medium - pixelLightCount: 1 - shadows: 1 - shadowResolution: 0 - shadowProjection: 1 - shadowCascades: 1 - shadowDistance: 20 - shadowNearPlaneOffset: 3 - shadowCascade2Split: 0.33333334 - shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} - shadowmaskMode: 0 - blendWeights: 2 - textureQuality: 0 - anisotropicTextures: 1 - antiAliasing: 0 - softParticles: 0 - softVegetation: 0 - realtimeReflectionProbes: 0 - billboardsFaceCameraPosition: 0 - vSyncCount: 1 - lodBias: 0.7 - maximumLODLevel: 0 - particleRaycastBudget: 64 - asyncUploadTimeSlice: 2 - asyncUploadBufferSize: 4 - resolutionScalingFixedDPIFactor: 1 - excludedTargetPlatforms: [] - - serializedVersion: 2 - name: High - pixelLightCount: 2 - shadows: 2 - shadowResolution: 1 - shadowProjection: 1 - shadowCascades: 2 - shadowDistance: 40 - shadowNearPlaneOffset: 3 - shadowCascade2Split: 0.33333334 - shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} - shadowmaskMode: 1 - blendWeights: 2 - textureQuality: 0 - anisotropicTextures: 1 - antiAliasing: 0 - softParticles: 0 - softVegetation: 1 - realtimeReflectionProbes: 1 - billboardsFaceCameraPosition: 1 - vSyncCount: 1 - lodBias: 1 - maximumLODLevel: 0 - particleRaycastBudget: 256 - asyncUploadTimeSlice: 2 - asyncUploadBufferSize: 4 - resolutionScalingFixedDPIFactor: 1 - excludedTargetPlatforms: [] - - serializedVersion: 2 - name: Very High - pixelLightCount: 3 - shadows: 2 - shadowResolution: 2 - shadowProjection: 1 - shadowCascades: 2 - shadowDistance: 70 - shadowNearPlaneOffset: 3 - shadowCascade2Split: 0.33333334 - shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} - shadowmaskMode: 1 - blendWeights: 4 - textureQuality: 0 - anisotropicTextures: 2 - antiAliasing: 2 - softParticles: 1 - softVegetation: 1 - realtimeReflectionProbes: 1 - billboardsFaceCameraPosition: 1 - vSyncCount: 1 - lodBias: 1.5 - maximumLODLevel: 0 - particleRaycastBudget: 1024 - asyncUploadTimeSlice: 2 - asyncUploadBufferSize: 4 - resolutionScalingFixedDPIFactor: 1 - excludedTargetPlatforms: [] - - serializedVersion: 2 - name: Ultra - pixelLightCount: 4 - shadows: 2 - shadowResolution: 2 - shadowProjection: 1 - shadowCascades: 4 - shadowDistance: 150 - shadowNearPlaneOffset: 3 - shadowCascade2Split: 0.33333334 - shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} - shadowmaskMode: 1 - blendWeights: 4 - textureQuality: 0 - anisotropicTextures: 2 - antiAliasing: 2 - softParticles: 1 - softVegetation: 1 - realtimeReflectionProbes: 1 - billboardsFaceCameraPosition: 1 - vSyncCount: 1 - lodBias: 2 - maximumLODLevel: 0 - particleRaycastBudget: 4096 - asyncUploadTimeSlice: 2 - asyncUploadBufferSize: 4 - resolutionScalingFixedDPIFactor: 1 - excludedTargetPlatforms: [] - m_PerPlatformDefaultQuality: - Android: 2 - Nintendo 3DS: 5 - Nintendo Switch: 5 - PS4: 5 - PSM: 5 - PSP2: 2 - Samsung TV: 2 - Standalone: 5 - Tizen: 2 - Web: 5 - WebGL: 3 - WiiU: 5 - Windows Store Apps: 5 - XboxOne: 5 - iPhone: 2 - tvOS: 2 diff --git a/ProjectSettings/TagManager.asset b/ProjectSettings/TagManager.asset deleted file mode 100644 index 1c92a78..0000000 --- a/ProjectSettings/TagManager.asset +++ /dev/null @@ -1,43 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!78 &1 -TagManager: - serializedVersion: 2 - tags: [] - layers: - - Default - - TransparentFX - - Ignore Raycast - - - - Water - - UI - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - m_SortingLayers: - - name: Default - uniqueID: 0 - locked: 0 diff --git a/ProjectSettings/TimeManager.asset b/ProjectSettings/TimeManager.asset deleted file mode 100644 index 558a017..0000000 --- a/ProjectSettings/TimeManager.asset +++ /dev/null @@ -1,9 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!5 &1 -TimeManager: - m_ObjectHideFlags: 0 - Fixed Timestep: 0.02 - Maximum Allowed Timestep: 0.33333334 - m_TimeScale: 1 - Maximum Particle Timestep: 0.03 diff --git a/ProjectSettings/UnityConnectSettings.asset b/ProjectSettings/UnityConnectSettings.asset deleted file mode 100644 index 1cc5485..0000000 --- a/ProjectSettings/UnityConnectSettings.asset +++ /dev/null @@ -1,34 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!310 &1 -UnityConnectSettings: - m_ObjectHideFlags: 0 - m_Enabled: 0 - m_TestMode: 0 - m_TestEventUrl: - m_TestConfigUrl: - m_TestInitMode: 0 - CrashReportingSettings: - m_EventUrl: https://perf-events.cloud.unity3d.com/api/events/crashes - m_Enabled: 0 - m_CaptureEditorExceptions: 1 - UnityPurchasingSettings: - m_Enabled: 0 - m_TestMode: 0 - UnityAnalyticsSettings: - m_Enabled: 0 - m_InitializeOnStartup: 1 - m_TestMode: 0 - m_TestEventUrl: - m_TestConfigUrl: - UnityAdsSettings: - m_Enabled: 0 - m_InitializeOnStartup: 1 - m_TestMode: 0 - m_EnabledPlatforms: 4294967295 - m_IosGameId: - m_AndroidGameId: - m_GameIds: {} - m_GameId: - PerformanceReportingSettings: - m_Enabled: 0 diff --git a/ProjectSettings/VFXManager.asset b/ProjectSettings/VFXManager.asset deleted file mode 100644 index 3a95c98..0000000 --- a/ProjectSettings/VFXManager.asset +++ /dev/null @@ -1,12 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!937362698 &1 -VFXManager: - m_ObjectHideFlags: 0 - m_IndirectShader: {fileID: 0} - m_CopyBufferShader: {fileID: 0} - m_SortShader: {fileID: 0} - m_StripUpdateShader: {fileID: 0} - m_RenderPipeSettingsPath: - m_FixedTimeStep: 0.016666668 - m_MaxDeltaTime: 0.05 diff --git a/ProjectSettings/XRSettings.asset b/ProjectSettings/XRSettings.asset deleted file mode 100644 index 482590c..0000000 --- a/ProjectSettings/XRSettings.asset +++ /dev/null @@ -1,10 +0,0 @@ -{ - "m_SettingKeys": [ - "VR Device Disabled", - "VR Device User Alert" - ], - "m_SettingValues": [ - "False", - "False" - ] -} \ No newline at end of file From a1c9b17f7deda3a0e948dc45fc44f3cc5ee28b5e Mon Sep 17 00:00:00 2001 From: NafeeJ Date: Tue, 4 Aug 2020 01:12:50 -0400 Subject: [PATCH 163/231] Made ScreenEdgeColliders more efficient. AddCollider() is more efficient than StandaloneAddCollider() by using cached variables set upon Awake() but StandaloneAddCollider() is still theoretically a little bit better. When used in Update() on an i5 3570k, AddCollider() averages 0.02 Time ms and 0.03 Time ms for StandaloneAddCollider() according to Unity Profiler --- .../2D/Colliders/ScreenEdgeColliders.cs | 78 ++++++++++++++----- 1 file changed, 58 insertions(+), 20 deletions(-) diff --git a/Assets/Scripts/2D/Colliders/ScreenEdgeColliders.cs b/Assets/Scripts/2D/Colliders/ScreenEdgeColliders.cs index bf94311..ac771b7 100644 --- a/Assets/Scripts/2D/Colliders/ScreenEdgeColliders.cs +++ b/Assets/Scripts/2D/Colliders/ScreenEdgeColliders.cs @@ -1,35 +1,73 @@ // adds EdgeCollider2D colliders to screen edges // only works with orthographic camera +//Includes two different ways of implementation into your project +//One is a method that uses cached fields on Awake() that requires this entire class but is more slightly more efficient (should use this if you plan to use the method in Update()) +//The other is a standalone method that doesn't need the rest of the class and can be copy-pasted directly into any project but is slightly less efficient + using UnityEngine; -using System.Collections; namespace UnityLibrary { - public class ScreenEdgeColliders : MonoBehaviour - { - void Awake () + public class ScreenEdgeColliders : MonoBehaviour { - AddCollider(); - } + Camera cam; + EdgeCollider2D edge; + Vector2[] edgePoints; - void AddCollider () - { - if (Camera.main==null) {Debug.LogError("Camera.main not found, failed to create edge colliders"); return;} + void Awake() + { + if (Camera.main == null) Debug.LogError("Camera.main not found, failed to create edge colliders"); + else cam = Camera.main; + + if (!cam.orthographic) Debug.LogError("Camera.main is not Orthographic, failed to create edge colliders"); + + // add or use existing EdgeCollider2D + edge = GetComponent() == null ? gameObject.AddComponent() : GetComponent(); + + edgePoints = new Vector2[5]; + + AddCollider(); + } + + //Use this if you're okay with using the global fields and code in Awake() (more efficient) + void AddCollider() + { + //Vector2's for the corners of the screen + Vector2 bottomLeft = cam.ScreenToWorldPoint(new Vector3(0, 0, cam.nearClipPlane)); + Vector2 topRight = cam.ScreenToWorldPoint(new Vector3(cam.pixelWidth, cam.pixelHeight, cam.nearClipPlane)); + Vector2 topLeft = new Vector2(bottomLeft.x, topRight.y); + Vector2 bottomRight = new Vector2(topRight.x, bottomLeft.y); + + //Update Vector2 array for edge collider + edgePoints[0] = bottomLeft; + edgePoints[1] = topLeft; + edgePoints[2] = topRight; + edgePoints[3] = bottomRight; + edgePoints[4] = bottomLeft; + + edge.points = edgePoints; + } + + //Use this if you want a single function to handle everything (less efficient) + //You can just ignore/delete the rest of this class if thats the case + void StandaloneAddCollider() + { + if (Camera.main == null) { Debug.LogError("Camera.main not found, failed to create edge colliders"); return; } - var cam = Camera.main; - if (!cam.orthographic) {Debug.LogError("Camera.main is not Orthographic, failed to create edge colliders"); return;} + var cam = Camera.main; + if (!cam.orthographic) { Debug.LogError("Camera.main is not Orthographic, failed to create edge colliders"); return; } - var bottomLeft = (Vector2)cam.ScreenToWorldPoint(new Vector3(0, 0, cam.nearClipPlane)); - var topLeft = (Vector2)cam.ScreenToWorldPoint(new Vector3(0, cam.pixelHeight, cam.nearClipPlane)); - var topRight = (Vector2)cam.ScreenToWorldPoint(new Vector3(cam.pixelWidth, cam.pixelHeight, cam.nearClipPlane)); - var bottomRight = (Vector2)cam.ScreenToWorldPoint(new Vector3(cam.pixelWidth, 0, cam.nearClipPlane)); + Vector2 bottomLeft = cam.ScreenToWorldPoint(new Vector3(0, 0, cam.nearClipPlane)); + Vector2 topRight = cam.ScreenToWorldPoint(new Vector3(cam.pixelWidth, cam.pixelHeight, cam.nearClipPlane)); + Vector2 topLeft = new Vector2(bottomLeft.x, topRight.y); + Vector2 bottomRight = new Vector2(topRight.x, bottomLeft.y); - // add or use existing EdgeCollider2D - var edge = GetComponent()==null?gameObject.AddComponent():GetComponent(); + // add or use existing EdgeCollider2D + var edge = GetComponent() == null ? gameObject.AddComponent() : GetComponent(); - var edgePoints = new [] {bottomLeft,topLeft,topRight,bottomRight, bottomLeft}; - edge.points = edgePoints; + var edgePoints = new[] { bottomLeft, topLeft, topRight, bottomRight, bottomLeft }; + edge.points = edgePoints; + } } - } } From c262d680bd77dc98588ce2e4e189984f6ff86b28 Mon Sep 17 00:00:00 2001 From: NafeeJ Date: Wed, 5 Aug 2020 04:23:07 -0400 Subject: [PATCH 164/231] Should have made class variables private. A little bit more documentation. --- Assets/Scripts/2D/Colliders/ScreenEdgeColliders.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Assets/Scripts/2D/Colliders/ScreenEdgeColliders.cs b/Assets/Scripts/2D/Colliders/ScreenEdgeColliders.cs index ac771b7..a3ae1c5 100644 --- a/Assets/Scripts/2D/Colliders/ScreenEdgeColliders.cs +++ b/Assets/Scripts/2D/Colliders/ScreenEdgeColliders.cs @@ -11,9 +11,9 @@ namespace UnityLibrary { public class ScreenEdgeColliders : MonoBehaviour { - Camera cam; - EdgeCollider2D edge; - Vector2[] edgePoints; + private Camera cam; + private EdgeCollider2D edge; + private Vector2[] edgePoints; void Awake() { @@ -31,6 +31,7 @@ void Awake() } //Use this if you're okay with using the global fields and code in Awake() (more efficient) + //You can just ignore/delete StandaloneAddCollider() if thats the case void AddCollider() { //Vector2's for the corners of the screen From 68e74b17266b2473be6f109ebc08a4cace9948de Mon Sep 17 00:00:00 2001 From: LesserKnownThings Date: Fri, 11 Sep 2020 13:29:49 -0400 Subject: [PATCH 165/231] Adding Object Pooling --- Assets/Scripts/ObjectPooling/IPoolActions.cs | 10 +++ .../ObjectPooling/IPoolActions.cs.meta | 11 +++ Assets/Scripts/ObjectPooling/Pool.cs | 84 +++++++++++++++++++ Assets/Scripts/ObjectPooling/Pool.cs.meta | 11 +++ Assets/Scripts/ObjectPooling/PoolObject.cs | 22 +++++ .../Scripts/ObjectPooling/PoolObject.cs.meta | 11 +++ 6 files changed, 149 insertions(+) create mode 100644 Assets/Scripts/ObjectPooling/IPoolActions.cs create mode 100644 Assets/Scripts/ObjectPooling/IPoolActions.cs.meta create mode 100644 Assets/Scripts/ObjectPooling/Pool.cs create mode 100644 Assets/Scripts/ObjectPooling/Pool.cs.meta create mode 100644 Assets/Scripts/ObjectPooling/PoolObject.cs create mode 100644 Assets/Scripts/ObjectPooling/PoolObject.cs.meta diff --git a/Assets/Scripts/ObjectPooling/IPoolActions.cs b/Assets/Scripts/ObjectPooling/IPoolActions.cs new file mode 100644 index 0000000..846d211 --- /dev/null +++ b/Assets/Scripts/ObjectPooling/IPoolActions.cs @@ -0,0 +1,10 @@ +namespace UnityHelper.Pooling +{ + /// + /// Interface to remind you to add the return to pool function + /// + public interface IPoolActions + { + void ReturnObjectToPool(); + } +} diff --git a/Assets/Scripts/ObjectPooling/IPoolActions.cs.meta b/Assets/Scripts/ObjectPooling/IPoolActions.cs.meta new file mode 100644 index 0000000..50206f2 --- /dev/null +++ b/Assets/Scripts/ObjectPooling/IPoolActions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3e21db0c60302f24b927bcadd6fc6112 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/ObjectPooling/Pool.cs b/Assets/Scripts/ObjectPooling/Pool.cs new file mode 100644 index 0000000..817ca60 --- /dev/null +++ b/Assets/Scripts/ObjectPooling/Pool.cs @@ -0,0 +1,84 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + +namespace UnityHelper.Pooling +{ + [Serializable] + public class Pool + { + /// + /// The objects that you want to add to the pool + /// + public List objects_to_pool = new List(); + + /// + /// All the objects that were added to the pool + /// + private List pool_objects = new List(); + + /// + /// Initializes the pool in your scene + /// + public void Start_Pool() + { + var pool = new GameObject("Pool"); + + foreach (var item in objects_to_pool) + { + var sub_parent = new GameObject(item.obj_to_pool.name); + + for (int i = 0; i < item.amount_to_pool; i++) + { + var _obj = UnityEngine.Object.Instantiate(item.obj_to_pool); + _obj.transform.SetParent(sub_parent.transform, false); + _obj.SetActive(false); + pool_objects.Add(_obj); + } + + sub_parent.transform.SetParent(pool.transform, false); + } + } + + /// + /// Gets the item from the pool and spawns it at the required position + /// + /// The type of script in the pool that you need to spawn + /// The position where you want the item to spawn + /// A component of the needed type + public Component Spawn_Item(Type type, Vector3 position, Quaternion direction) + { + foreach (GameObject item in pool_objects) + { + Component comp = null; + item.TryGetComponent(type, out comp); + + if (comp == null) + continue; + + if (item.activeSelf) + continue; + + item.transform.position = position; + item.transform.rotation = direction; + item.SetActive(true); + return comp; + + } + + return null; + } + + /// + /// Brings the item back to the pool + /// + /// The item to bring back to the pool + public void Return_Item(GameObject item) + { + item.SetActive(false); + item.transform.position = Vector3.zero; + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/ObjectPooling/Pool.cs.meta b/Assets/Scripts/ObjectPooling/Pool.cs.meta new file mode 100644 index 0000000..ac6cbc2 --- /dev/null +++ b/Assets/Scripts/ObjectPooling/Pool.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fa158cddf415eb0449d203dbd26ec022 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/ObjectPooling/PoolObject.cs b/Assets/Scripts/ObjectPooling/PoolObject.cs new file mode 100644 index 0000000..fa2cdf6 --- /dev/null +++ b/Assets/Scripts/ObjectPooling/PoolObject.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; + +namespace UnityHelper.Pooling +{ + [Serializable] + public class PoolObject + { + /// + /// The gameobject that you want to spawn + /// + public GameObject obj_to_pool; + /// + /// The amount of objects that you want to spawn + /// + public int amount_to_pool; + } +} \ No newline at end of file diff --git a/Assets/Scripts/ObjectPooling/PoolObject.cs.meta b/Assets/Scripts/ObjectPooling/PoolObject.cs.meta new file mode 100644 index 0000000..a654e61 --- /dev/null +++ b/Assets/Scripts/ObjectPooling/PoolObject.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b201e930468ede54195a559247b03027 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From 13215a516fd00dc70b72c8d6e2cac41270eda80f Mon Sep 17 00:00:00 2001 From: LesserKnownThings Date: Fri, 11 Sep 2020 13:32:22 -0400 Subject: [PATCH 166/231] Adding Additional Files --- .../ObjectPooling/Images/Initialization.PNG | Bin 0 -> 5171 bytes .../ObjectPooling/Images/PoolObjectLook.PNG | Bin 0 -> 7692 bytes .../Scripts/ObjectPooling/Images/SpawnObject.PNG | Bin 0 -> 5356 bytes Assets/Scripts/ObjectPooling/README.md | 4 ++++ Assets/Scripts/ObjectPooling/README.md.meta | 7 +++++++ 5 files changed, 11 insertions(+) create mode 100644 Assets/Scripts/ObjectPooling/Images/Initialization.PNG create mode 100644 Assets/Scripts/ObjectPooling/Images/PoolObjectLook.PNG create mode 100644 Assets/Scripts/ObjectPooling/Images/SpawnObject.PNG create mode 100644 Assets/Scripts/ObjectPooling/README.md create mode 100644 Assets/Scripts/ObjectPooling/README.md.meta diff --git a/Assets/Scripts/ObjectPooling/Images/Initialization.PNG b/Assets/Scripts/ObjectPooling/Images/Initialization.PNG new file mode 100644 index 0000000000000000000000000000000000000000..62f31dc57010e447e9546bac0e7f39191299d94b GIT binary patch literal 5171 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 H>yZBelI;`d literal 0 HcmV?d00001 diff --git a/Assets/Scripts/ObjectPooling/Images/SpawnObject.PNG b/Assets/Scripts/ObjectPooling/Images/SpawnObject.PNG new file mode 100644 index 0000000000000000000000000000000000000000..8641e8d9351cd4c0f077327729068257b922c5ec GIT binary patch literal 5356 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 Object pooling helper class +
+
These scripts help you set up an object pooling system in your game. It's pretty simple to use, let me show you how +![alt text]("Images/Initialization.png); \ No newline at end of file diff --git a/Assets/Scripts/ObjectPooling/README.md.meta b/Assets/Scripts/ObjectPooling/README.md.meta new file mode 100644 index 0000000..a7a1a90 --- /dev/null +++ b/Assets/Scripts/ObjectPooling/README.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 39978d1555c9ede47adb909257a1bb01 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: From 0000f663c7ae09e746824f8d74c6d0c8a600bd94 Mon Sep 17 00:00:00 2001 From: LesserKnownThings Date: Fri, 11 Sep 2020 14:11:33 -0400 Subject: [PATCH 167/231] Created readme --- .../ObjectPooling/Images/PoolObject.PNG | Bin 0 -> 12614 bytes Assets/Scripts/ObjectPooling/README.md | 39 ++++++++++++++++-- 2 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 Assets/Scripts/ObjectPooling/Images/PoolObject.PNG diff --git a/Assets/Scripts/ObjectPooling/Images/PoolObject.PNG b/Assets/Scripts/ObjectPooling/Images/PoolObject.PNG new file mode 100644 index 0000000000000000000000000000000000000000..f5302875f031ffdee6ab16668b0287b3548c3081 GIT binary patch literal 12614 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 aF3*eLxwZX63EPDPUAuhiQklMe`2PW_gL?!3 literal 0 HcmV?d00001 diff --git a/Assets/Scripts/ObjectPooling/README.md b/Assets/Scripts/ObjectPooling/README.md index 9b848b0..fb3ca95 100644 --- a/Assets/Scripts/ObjectPooling/README.md +++ b/Assets/Scripts/ObjectPooling/README.md @@ -1,4 +1,37 @@ -

Object pooling helper class

+

Object pooling helper class


- These scripts help you set up an object pooling system in your game. It's pretty simple to use, let me show you how -![alt text]("Images/Initialization.png); \ No newline at end of file +

These scripts help you set up an object pooling system in your game. It's pretty simple to use, let me show you how:

+ +
+ + +

1. Initializing the pool

+ As you can see in the image bellow, you can initialize the pool by creating a new pool and then calling it in the start. + +![Init Image](https://github.com/LesserKnownThings/UnityLibrary/blob/object_pooling/Assets/Scripts/ObjectPooling/Images/Initialization.PNG) + + You'll also have to add the namespace that the pool class is in **using UnityHelper.Pooling;** + +

2. Before you start the game

+ You will have to add the objects that you want the pool to instantiate when it starts. As you can see in the image bellow, the pool object looks like this in the editor: + + ![Look Image](https://github.com/LesserKnownThings/UnityLibrary/blob/object_pooling/Assets/Scripts/ObjectPooling/Images/PoolObjectLook.PNG) + + The pool contains a List of objects that you want to instantiate in the scene. The objects are of type **PoolObject** which you can see here: + + ![List Image](https://github.com/LesserKnownThings/UnityLibrary/blob/object_pooling/Assets/Scripts/ObjectPooling/Images/PoolObject.PNG) + + The **obj_to_pool** is the gameobject that you want to instantiate and the **amount_to_pool** is the amount of objects that you want to instantiate. + +

3. Spawning the objects in the scene

+ Spawning an object is very easy, the **Pool** class comes with a function called **Spawn_Item(Type type, Vector3 position, Quaternion direction)** it returns a **Component** so you can get direct reference to the object. Here's how you do it: + + ![Spawn Image](https://github.com/LesserKnownThings/UnityLibrary/blob/object_pooling/Assets/Scripts/ObjectPooling/Images/SpawnObject.PNG) + + In my example I have a custom Object created by me called **CubeObj** it doesn't do much, but it helps with the example. So when you spawn an item in the scene you have to give the function the following parameters: + + >**Type** the typeof object that the list needs to look for and spawn it in the scene + >**Position** the position where the item should spawn + >**Rotation** the rotation of the item + + One more thing to remember. Pool has a functio to bring back the objects to the pool, but it requires the object as a parameter. That's why I made an interface called **IPoolActions** that comes with **ReturnObjectToPool** void and will help you return the items to the pool. It's pretty easy, to return an item you simply have to **gameobject.SetActive(false)** and also reset its position **transform.position = Vector3.zero**. \ No newline at end of file From 566ae0cf702e755241274fe092e244e6501c7d5b Mon Sep 17 00:00:00 2001 From: LesserKnownThings Date: Fri, 11 Sep 2020 14:13:25 -0400 Subject: [PATCH 168/231] Update README.md --- Assets/Scripts/ObjectPooling/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Assets/Scripts/ObjectPooling/README.md b/Assets/Scripts/ObjectPooling/README.md index fb3ca95..695b61d 100644 --- a/Assets/Scripts/ObjectPooling/README.md +++ b/Assets/Scripts/ObjectPooling/README.md @@ -31,7 +31,9 @@ In my example I have a custom Object created by me called **CubeObj** it doesn't do much, but it helps with the example. So when you spawn an item in the scene you have to give the function the following parameters: >**Type** the typeof object that the list needs to look for and spawn it in the scene + >**Position** the position where the item should spawn + >**Rotation** the rotation of the item - One more thing to remember. Pool has a functio to bring back the objects to the pool, but it requires the object as a parameter. That's why I made an interface called **IPoolActions** that comes with **ReturnObjectToPool** void and will help you return the items to the pool. It's pretty easy, to return an item you simply have to **gameobject.SetActive(false)** and also reset its position **transform.position = Vector3.zero**. \ No newline at end of file + One more thing to remember. Pool has a function to bring back the objects to the pool, but it requires the object as a parameter. That's why I made an interface called **IPoolActions** that comes with **ReturnObjectToPool** void and will help you return the items to the pool. It's pretty easy, to return an item you simply have to **gameobject.SetActive(false)** and also reset its position **transform.position = Vector3.zero**. From 315c0417285dfd1e3dff0e5b0de9ec696eaee6af Mon Sep 17 00:00:00 2001 From: pkunjam Date: Thu, 1 Oct 2020 01:58:32 +0530 Subject: [PATCH 169/231] Get sprite color in realtime --- Assets/Scripts/ImageEffects/SpriteColor.cs | 78 ++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 Assets/Scripts/ImageEffects/SpriteColor.cs diff --git a/Assets/Scripts/ImageEffects/SpriteColor.cs b/Assets/Scripts/ImageEffects/SpriteColor.cs new file mode 100644 index 0000000..bf7cad6 --- /dev/null +++ b/Assets/Scripts/ImageEffects/SpriteColor.cs @@ -0,0 +1,78 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +// This script gets the color of a sprite in realtime +// Usage: Attach this script to any gameobject having a sprite renderer component + +public class SpriteColor : MonoBehaviour +{ + public static Color GetColor { get; set; } + + public SpriteRenderer targetSprite; + + Color finalColor; + + void Update() + { + GetSpritePixelColorUnderMousePointer(targetSprite, out finalColor); + } + + public bool GetSpritePixelColorUnderMousePointer(SpriteRenderer spriteRenderer, out Color color) + { + color = new Color(); + Camera cam = Camera.main; + Vector2 mousePos = Input.mousePosition; + Vector2 viewportPos = cam.ScreenToViewportPoint(mousePos); + if (viewportPos.x < 0.0f || viewportPos.x > 1.0f || viewportPos.y < 0.0f || viewportPos.y > 1.0f) return false; // out of viewport bounds + + // Cast a ray from viewport point into world + Ray ray = cam.ViewportPointToRay(viewportPos); + + // Check for intersection with sprite and get the color + return IntersectsSprite(spriteRenderer, ray, out color); + } + + private bool IntersectsSprite(SpriteRenderer spriteRenderer, Ray ray, out Color color) + { + color = new Color(); + if (spriteRenderer == null) return false; + + Sprite sprite = spriteRenderer.sprite; + if (sprite == null) return false; + + Texture2D texture = sprite.texture; + if (texture == null) return false; + + + // Craete a plane so it has the same orientation as the sprite transform + Plane plane = new Plane(transform.forward, transform.position); + + // Intersect the ray and the plane + float rayIntersectDist; // the distance from the ray origin to the intersection point + if (!plane.Raycast(ray, out rayIntersectDist)) return false; + + // Convert world position to sprite position + // worldToLocalMatrix.MultiplyPoint3x4 returns a value from based on the texture dimensions (+/- half texDimension / pixelsPerUnit) ) + // 0, 0 corresponds to the center of the TEXTURE ITSELF, not the center of the trimmed sprite textureRect + + Vector3 spritePos = spriteRenderer.worldToLocalMatrix.MultiplyPoint3x4(ray.origin + (ray.direction * rayIntersectDist)); + Rect textureRect = sprite.textureRect; + float pixelsPerUnit = sprite.pixelsPerUnit; + float halfRealTexWidth = texture.width * 0.5f; // use the real texture width here because center is based on this -- probably won't work right for atlases + float halfRealTexHeight = texture.height * 0.5f; + // Convert to pixel position, offsetting so 0,0 is in lower left instead of center + int texPosX = (int)(spritePos.x * pixelsPerUnit + halfRealTexWidth); + int texPosY = (int)(spritePos.y * pixelsPerUnit + halfRealTexHeight); + // Check if pixel is within texture + if (texPosX < 0 || texPosX < textureRect.x || texPosX >= Mathf.FloorToInt(textureRect.xMax)) return false; // out of bounds + if (texPosY < 0 || texPosY < textureRect.y || texPosY >= Mathf.FloorToInt(textureRect.yMax)) return false; // out of bounds + // Get pixel color + color = texture.GetPixel(texPosX, texPosY); + GetColor = color; + + return true; + } + +} From 615275b0bf71dcee1a5c82cdbeb3ed181f1000e5 Mon Sep 17 00:00:00 2001 From: atknssl Date: Thu, 1 Oct 2020 21:43:02 +0300 Subject: [PATCH 170/231] Deleted Javascript Templates --- ...avascript Editor Window-NewEditorScript.js.txt | 14 -------------- ...ipt Custom Editor-NewCustomEditorScript.js.txt | 15 --------------- ...Property Drawer-NewPropertyDrawerScript.js.txt | 10 ---------- 3 files changed, 39 deletions(-) delete mode 100644 ScriptTemplates/82a-Javascript Editor Window-NewEditorScript.js.txt delete mode 100644 ScriptTemplates/82b-Javascript Custom Editor-NewCustomEditorScript.js.txt delete mode 100644 ScriptTemplates/82c-Javascript Property Drawer-NewPropertyDrawerScript.js.txt diff --git a/ScriptTemplates/82a-Javascript Editor Window-NewEditorScript.js.txt b/ScriptTemplates/82a-Javascript Editor Window-NewEditorScript.js.txt deleted file mode 100644 index a0fa1bf..0000000 --- a/ScriptTemplates/82a-Javascript Editor Window-NewEditorScript.js.txt +++ /dev/null @@ -1,14 +0,0 @@ -#pragma strict - -class #SCRIPTNAME# extends EditorWindow { - - @MenuItem ("Window/#SCRIPTNAME#") - static function Initialize () { - EditorWindow.GetWindow (#SCRIPTNAME#); - } - - function OnGUI () { - - } - -} diff --git a/ScriptTemplates/82b-Javascript Custom Editor-NewCustomEditorScript.js.txt b/ScriptTemplates/82b-Javascript Custom Editor-NewCustomEditorScript.js.txt deleted file mode 100644 index e7ec9bb..0000000 --- a/ScriptTemplates/82b-Javascript Custom Editor-NewCustomEditorScript.js.txt +++ /dev/null @@ -1,15 +0,0 @@ -#pragma strict - -@CustomEditor (#SCRIPTNAME#) -@CanEditMultipleObjects -class #SCRIPTNAME# extends Editor { - - function OnEnable () { - - } - - function OnInspectorGUI () { - - } - -} diff --git a/ScriptTemplates/82c-Javascript Property Drawer-NewPropertyDrawerScript.js.txt b/ScriptTemplates/82c-Javascript Property Drawer-NewPropertyDrawerScript.js.txt deleted file mode 100644 index 1a79b09..0000000 --- a/ScriptTemplates/82c-Javascript Property Drawer-NewPropertyDrawerScript.js.txt +++ /dev/null @@ -1,10 +0,0 @@ -#pragma strict - -@CustomPropertyDrawer (#SCRIPTNAME#) -class #SCRIPTNAME# extends PropertyDrawer { - - function OnGUI () { - - } - -} From 3c2c49dbef7349e5847171f63197fe4796e42002 Mon Sep 17 00:00:00 2001 From: HuangWei Date: Tue, 12 Jan 2021 17:45:55 +0800 Subject: [PATCH 171/231] Add thousand separators in GetSelectedMeshInfo --- Assets/Scripts/Editor/Tools/GetSelectedMeshInfo.cs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Assets/Scripts/Editor/Tools/GetSelectedMeshInfo.cs b/Assets/Scripts/Editor/Tools/GetSelectedMeshInfo.cs index d8ddcf3..f9479f9 100644 --- a/Assets/Scripts/Editor/Tools/GetSelectedMeshInfo.cs +++ b/Assets/Scripts/Editor/Tools/GetSelectedMeshInfo.cs @@ -1,5 +1,6 @@ // display selected gameobject mesh stats (should work on prefabs,models in project window also) +using System; using System.Collections.Generic; using System.Linq; using UnityEditor; @@ -69,9 +70,10 @@ void OnGUI() } // display stats - EditorGUILayout.LabelField("Meshes: " + totalMeshes); - EditorGUILayout.LabelField("Vertices: " + totalVertices); - EditorGUILayout.LabelField("Triangles: " + totalTris); + // String.Format("{0:n0}", 9876); // No digits after the decimal point. Output: 9,876 + EditorGUILayout.LabelField("Meshes: " + $"{totalMeshes:n0}"); + EditorGUILayout.LabelField("Vertices: " + $"{totalVertices:n0}"); + EditorGUILayout.LabelField("Triangles: " + $"{totalTris:n0}"); EditorGUILayout.Space(); EditorGUILayout.LabelField("TOP 20", EditorStyles.boldLabel); @@ -88,7 +90,7 @@ void OnGUI() { EditorGUIUtility.PingObject(meshes[item.Key].transform); } - EditorGUILayout.LabelField(meshes[item.Key].name + " = " + item.Value + " (" + percent + "%)"); + EditorGUILayout.LabelField(meshes[item.Key].name + " = " + $"{item.Value:n0}" + " (" + percent + "%)"); GUILayout.ExpandWidth(true); EditorGUILayout.EndHorizontal(); From a6b46fcb6a8bc4daaa24c2c3f207ce4c0977953d Mon Sep 17 00:00:00 2001 From: HuangWei Date: Tue, 12 Jan 2021 17:48:24 +0800 Subject: [PATCH 172/231] Remove unused import --- Assets/Scripts/Editor/Tools/GetSelectedMeshInfo.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/Assets/Scripts/Editor/Tools/GetSelectedMeshInfo.cs b/Assets/Scripts/Editor/Tools/GetSelectedMeshInfo.cs index f9479f9..e12f971 100644 --- a/Assets/Scripts/Editor/Tools/GetSelectedMeshInfo.cs +++ b/Assets/Scripts/Editor/Tools/GetSelectedMeshInfo.cs @@ -1,6 +1,5 @@ // display selected gameobject mesh stats (should work on prefabs,models in project window also) -using System; using System.Collections.Generic; using System.Linq; using UnityEditor; From 2f8b6abad9830359677de506d400d42c45d0aee4 Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Thu, 11 Mar 2021 19:20:56 +0330 Subject: [PATCH 173/231] Create GlobalVariables.cs https://gist.github.com/hasanbayatme/f3ddf56cf261a6b40efc14ecb9881a98 --- Assets/Scripts/Utilities/GlobalVariables.cs | 65 +++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 Assets/Scripts/Utilities/GlobalVariables.cs diff --git a/Assets/Scripts/Utilities/GlobalVariables.cs b/Assets/Scripts/Utilities/GlobalVariables.cs new file mode 100644 index 0000000..6c40aa9 --- /dev/null +++ b/Assets/Scripts/Utilities/GlobalVariables.cs @@ -0,0 +1,65 @@ +using System.Collections.Generic; + +/// +/// A simple static class to get and set globally accessible variables through a key-value approach. +/// +/// +/// Uses a key-value approach (dictionary) for storing and modifying variables. +/// It also uses a lock to ensure consistency between the threads. +/// +public static class GlobalVariables +{ + + private static readonly object lockObject = new object(); + private static Dictionary variablesDictionary = new Dictionary(); + + /// + /// The underlying key-value storage (dictionary). + /// + /// Gets the underlying variables dictionary + public static Dictionary VariablesDictionary => variablesDictionary; + + /// + /// Retrieves all global variables. + /// + /// The global variables dictionary object. + public static Dictionary GetAll() + { + return variablesDictionary; + } + + /// + /// Gets a variable and casts it to the provided type argument. + /// + /// The type of the variable + /// The variable key + /// The casted variable value + public static T Get(string key) + { + if (variablesDictionary == null || !variablesDictionary.ContainsKey(key)) + { + return default(T); + } + + return (T)variablesDictionary[key]; + } + + /// + /// Sets the variable, the existing value gets overridden. + /// + /// It uses a lock under the hood to ensure consistensy between threads + /// The variable name/key + /// The variable value + public static void Set(string key, string value) + { + lock (lockObject) + { + if (variablesDictionary == null) + { + variablesDictionary = new Dictionary(); + } + variablesDictionary[key] = value; + } + } + +} From 541004d0950b4f48fb4a88b0f33e7e3cd79ca555 Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Thu, 11 Mar 2021 19:33:38 +0330 Subject: [PATCH 174/231] Update GlobalVariables.cs Fixed GlobalVariables.cs Set method 2nd parameter type https://gist.github.com/hasanbayatme/f3ddf56cf261a6b40efc14ecb9881a98 --- Assets/Scripts/Utilities/GlobalVariables.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Assets/Scripts/Utilities/GlobalVariables.cs b/Assets/Scripts/Utilities/GlobalVariables.cs index 6c40aa9..b1ab699 100644 --- a/Assets/Scripts/Utilities/GlobalVariables.cs +++ b/Assets/Scripts/Utilities/GlobalVariables.cs @@ -50,7 +50,7 @@ public static T Get(string key) /// It uses a lock under the hood to ensure consistensy between threads /// The variable name/key /// The variable value - public static void Set(string key, string value) + public static void Set(string key, object value) { lock (lockObject) { From ac3ae833ee4b1636c521ca01b7e2d0c452fe37e7 Mon Sep 17 00:00:00 2001 From: mika Date: Tue, 11 May 2021 08:07:06 +0300 Subject: [PATCH 175/231] add MobileCamera.cs --- Assets/Scripts/Camera/MobileCamera.cs | 135 ++++++++++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 Assets/Scripts/Camera/MobileCamera.cs diff --git a/Assets/Scripts/Camera/MobileCamera.cs b/Assets/Scripts/Camera/MobileCamera.cs new file mode 100644 index 0000000..99fd6f5 --- /dev/null +++ b/Assets/Scripts/Camera/MobileCamera.cs @@ -0,0 +1,135 @@ +// https://forum.unity.com/threads/mobile-touch-to-orbit-pan-and-zoom-camera-without-fix-target-in-one-script.522607/#post-3531342 + +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class MobileCamera : MonoBehaviour +{ + public Transform target; + public Vector3 targetOffset; + public float distance = 5.0f; + public float maxDistance = 20; + public float minDistance = .6f; + public float xSpeed = 5.0f; + public float ySpeed = 5.0f; + public int yMinLimit = -80; + public int yMaxLimit = 80; + public float zoomRate = 10.0f; + public float panSpeed = 0.3f; + public float zoomDampening = 5.0f; + + private float xDeg = 0.0f; + private float yDeg = 0.0f; + private float currentDistance; + private float desiredDistance; + private Quaternion currentRotation; + private Quaternion desiredRotation; + private Quaternion rotation; + private Vector3 position; + + private Vector3 FirstPosition; + private Vector3 SecondPosition; + private Vector3 delta; + private Vector3 lastOffset; + private Vector3 lastOffsettemp; + //private Vector3 CameraPosition; + //private Vector3 Targetposition; + //private Vector3 MoveDistance; + + public float offsetSpeed = 0.03f; + + void Start() { Init(); } + void OnEnable() { Init(); } + + public void Init() + { + //If there is no target, create a temporary target at 'distance' from the cameras current viewpoint + if (!target) + { + GameObject go = new GameObject("Cam Target"); + go.transform.position = transform.position + (transform.forward * distance); + target = go.transform; + } + + distance = Vector3.Distance(transform.position, target.position); + currentDistance = distance; + desiredDistance = distance; + + //be sure to grab the current rotations as starting points. + position = transform.position; + rotation = transform.rotation; + currentRotation = transform.rotation; + desiredRotation = transform.rotation; + + //xDeg = Vector3.Angle(Vector3.right, transform.right); + //yDeg = Vector3.Angle(Vector3.up, transform.up); + + xDeg = transform.eulerAngles.y + Vector3.Angle(Vector3.right, transform.right); + yDeg = transform.eulerAngles.x + Vector3.Angle(Vector3.up, transform.up); + + } + + void LateUpdate() + { + // If Control and Alt and Middle button? ZOOM! + if (Input.touchCount == 2) + { + Touch touchZero = Input.GetTouch(0); + Touch touchOne = Input.GetTouch(1); + Vector2 touchZeroPreviousPosition = touchZero.position - touchZero.deltaPosition; + Vector2 touchOnePreviousPosition = touchOne.position - touchOne.deltaPosition; + float prevTouchDeltaMag = (touchZeroPreviousPosition - touchOnePreviousPosition).magnitude; + float TouchDeltaMag = (touchZero.position - touchOne.position).magnitude; + float deltaMagDiff = prevTouchDeltaMag - TouchDeltaMag; + desiredDistance += deltaMagDiff * Time.deltaTime * zoomRate * 0.0025f * Mathf.Abs(desiredDistance); + } + + // If middle mouse and left alt are selected? ORBIT + if (Input.touchCount == 1 && Input.GetTouch(0).phase == TouchPhase.Moved) + { + Vector2 touchposition = Input.GetTouch(0).deltaPosition; + xDeg += touchposition.x * xSpeed * 0.002f; + yDeg -= touchposition.y * ySpeed * 0.002f; + yDeg = ClampAngle(yDeg, yMinLimit, yMaxLimit); + + } + + desiredRotation = Quaternion.Euler(yDeg, xDeg, 0); + currentRotation = transform.rotation; + rotation = Quaternion.Lerp(currentRotation, desiredRotation, Time.deltaTime * zoomDampening); + transform.rotation = rotation; + + if (Input.GetMouseButtonDown(1)) + { + FirstPosition = Input.mousePosition; + lastOffset = targetOffset; + } + + if (Input.GetMouseButton(1)) + { + SecondPosition = Input.mousePosition; + delta = SecondPosition - FirstPosition; + targetOffset = lastOffset + transform.right * delta.x * offsetSpeed + transform.up * delta.y * offsetSpeed; + + } + + ////////Orbit Position + // affect the desired Zoom distance if we roll the scrollwheel + desiredDistance = Mathf.Clamp(desiredDistance, minDistance, maxDistance); + currentDistance = Mathf.Lerp(currentDistance, desiredDistance, Time.deltaTime * zoomDampening); + position = target.position - (rotation * Vector3.forward * currentDistance); + position = position - targetOffset; + transform.position = position; + } + + private static float ClampAngle(float angle, float min, float max) + { + if (angle < -360) + angle += 360; + if (angle > 360) + angle -= 360; + return Mathf.Clamp(angle, min, max); + } +} + From c068ce60b0953a20998328d4f8efb8426a5ed0ed Mon Sep 17 00:00:00 2001 From: mika Date: Tue, 5 Oct 2021 09:53:16 +0300 Subject: [PATCH 176/231] add EditorCardboardCamera script --- .../Scripts/Camera/EditorCardboardCamera.cs | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 Assets/Scripts/Camera/EditorCardboardCamera.cs diff --git a/Assets/Scripts/Camera/EditorCardboardCamera.cs b/Assets/Scripts/Camera/EditorCardboardCamera.cs new file mode 100644 index 0000000..c73bd45 --- /dev/null +++ b/Assets/Scripts/Camera/EditorCardboardCamera.cs @@ -0,0 +1,23 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +// editor only Google Carboard VR cam simulation with left alt + mouse + +public class EditorCardboardCamera : MonoBehaviour +{ +#if UNITY_EDITOR + Vector2 rotation = Vector2.zero; + public float speed = 3; + + void Update() + { + if (Input.GetKey(KeyCode.LeftAlt)) + { + rotation.y += Input.GetAxis("Mouse X"); + rotation.x += -Input.GetAxis("Mouse Y"); + transform.eulerAngles = (Vector2)rotation * speed; + } + } +#endif +} From 2507ed97251fb7734b504a295953abe4e99e0a7c Mon Sep 17 00:00:00 2001 From: tanghuipang <34344955+tanghuipang@users.noreply.github.com> Date: Tue, 26 Oct 2021 16:07:54 +0800 Subject: [PATCH 177/231] drawline: fix issue fix z position --- Assets/Scripts/Drawing/DrawLine.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Assets/Scripts/Drawing/DrawLine.cs b/Assets/Scripts/Drawing/DrawLine.cs index 44d6c53..6ffbfbd 100644 --- a/Assets/Scripts/Drawing/DrawLine.cs +++ b/Assets/Scripts/Drawing/DrawLine.cs @@ -53,8 +53,9 @@ protected virtual void Update() } if (Input.GetMouseButton(0)) { - Vector3 mousePosition = m_Camera.ScreenToWorldPoint(Input.mousePosition); - mousePosition.z = m_LineRenderer.transform.position.z; + var pos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, lineRenderer.transform.position.z - m_Camera.transform.position.z); + Vector3 mousePosition = m_Camera.ScreenToWorldPoint(pos); + mousePosition.z = 0; if (!m_Points.Contains(mousePosition)) { m_Points.Add(mousePosition); From 0ffc6ebea55c69514cce93d13edfddaad9a361e0 Mon Sep 17 00:00:00 2001 From: mika Date: Mon, 29 Nov 2021 19:52:42 +0200 Subject: [PATCH 178/231] Add initial SimpleSmoothMouseLook camera controller for new input system --- .../Camera/SimpleSmoothMouseLookNewInput.cs | 260 ++++++++++++++++++ 1 file changed, 260 insertions(+) create mode 100644 Assets/Scripts/Camera/SimpleSmoothMouseLookNewInput.cs diff --git a/Assets/Scripts/Camera/SimpleSmoothMouseLookNewInput.cs b/Assets/Scripts/Camera/SimpleSmoothMouseLookNewInput.cs new file mode 100644 index 0000000..5e8d776 --- /dev/null +++ b/Assets/Scripts/Camera/SimpleSmoothMouseLookNewInput.cs @@ -0,0 +1,260 @@ +using UnityEngine; +using UnityEngine.InputSystem; + +namespace UnityLibrary +{ + public class SimpleSmoothMouseLookNewInput : MonoBehaviour + { + [Header("Mouse Look")] + [Tooltip("Hold right mouse button down to rotate")] + public bool rotateWithRightMouse = true; + public Vector2 clampInDegrees = new Vector2(360, 180); + public bool lockCursor = false; + public Vector2 sensitivity = new Vector2(2, 2); + public Vector2 smoothing = new Vector2(3, 3); + Vector2 targetDirection; + Vector2 _mouseAbsolute; + Vector2 _smoothMouse; + + [Header("Camera Pan")] + public bool enablePanning = true; + public float panSpeed = 40; + + [Header("Camera Orbit")] + public bool enableOrbit = false; + public KeyCode orbitKey = KeyCode.LeftAlt; + [Tooltip("Set this to -1, if you dont require any mousebutton pressed for orbit")] + public int orbitMouseKey = 2; + public float orbitXSpeed = 400; + public float orbitYSpeed = 400; + Vector3 targetposition; + float orbitDistance = 10.0f; + private float xDeg = 0.0f; + private float yDeg = 0.0f; + + [Header("Camera Zoom")] + public bool scrollZoom = false; + public int zoomRate = 40; + public float zoomDampening = 5.0f; + public KeyCode zoomExtends = KeyCode.F; // whole cloud + + [Header("Camera Fly")] + public float flySpeed = 20; // default speed + public float accelerationRatio = 5; // when shift is pressed + public float slowDownRatio = 0.5f; // when ctrl is pressed + public KeyCode increaseSpeedKey = KeyCode.LeftShift; + public KeyCode decreaseSpeedKey = KeyCode.LeftControl; + public KeyCode upKey = KeyCode.E; + public KeyCode downKey = KeyCode.Q; + public string horizontalAxisKey = "Horizontal"; + public string verticalAxisKey = "Vertical"; + + public bool moveRoot = false; + Transform moveTransform; + + Camera cam; + + void Awake() + { + cam = Camera.main; + + moveTransform = moveRoot ? transform.root : transform; + } + + private void Start() + { + if (ReferenceManager.instance != null) ReferenceManager.instance.mouseControls = this; + } + + private void OnEnable() + { + // Set target direction to the camera's initial orientation, NOTE need to do this if you move camera manually elsewhere + targetDirection = transform.localRotation.eulerAngles; + } + + void Update() + { + Framing(); + if (MouseOrbit() == true) return; + MouseLook(); + CameraFly(); + } + + void Framing() + { + + } + + public void GetOrbitTarget() + { + targetposition = transform.forward * orbitDistance; + //orbitDistance = Vector3.Distance(transform.position, targetposition); + } + + + bool MouseOrbit() + { + // early exit, if not enabled, or no key is pressed, or if mousekey is set, but not pressed + if (enableOrbit == false || Input.GetKey(orbitKey) == false || (orbitMouseKey > -1 == true && Input.GetMouseButton(orbitMouseKey) == false)) + { + return false; + } + + orbitDistance += Input.GetAxis("Mouse ScrollWheel") * zoomRate * Time.deltaTime; + + xDeg = (Input.GetAxis("Mouse X") * orbitXSpeed); + yDeg = -(Input.GetAxis("Mouse Y") * orbitYSpeed); + transform.RotateAround(targetposition, Vector3.up, xDeg * Time.deltaTime); + transform.RotateAround(targetposition, transform.right, yDeg * Time.deltaTime); + + targetDirection = transform.rotation.eulerAngles; + + return true; + } + + static float ClampAngle(float angle, float min, float max) + { + if (angle < -360) + angle += 360; + if (angle > 360) + angle -= 360; + return Mathf.Clamp(angle, min, max); + } + + void MouseLook() + { + // Get raw mouse input for a cleaner reading on more sensitive mice. + //var mouseDelta = new Vector2(Input.GetAxisRaw("Mouse X"), Input.GetAxisRaw("Mouse Y")); + var mouseDelta = Mouse.current.delta.ReadValue() * Time.deltaTime*3; + + // panning with middle moouse button + if (enablePanning == true) + { + //if (Input.GetMouseButton(2)) + if (Mouse.current.middleButton.isPressed) + { + transform.Translate(-mouseDelta * panSpeed * Time.deltaTime, Space.Self); + GetOrbitTarget(); // update orbit target + } + } + + // Ensure the cursor is always locked when set + if (lockCursor == true) Cursor.lockState = CursorLockMode.Locked; + + //if (rotateWithRightMouse == true && !Input.GetMouseButton(1)) return; + if (rotateWithRightMouse == true && !Mouse.current.rightButton.isPressed) return; + + // Allow the script to clamp based on a desired target value. + Quaternion targetOrientation = Quaternion.Euler(targetDirection); + + // Scale input against the sensitivity setting and multiply that against the smoothing value. + mouseDelta = Vector2.Scale(mouseDelta, new Vector2(sensitivity.x * smoothing.x, sensitivity.y * smoothing.y)); + // Interpolate mouse movement over time to apply smoothing delta. + _smoothMouse.x = Mathf.Lerp(_smoothMouse.x, mouseDelta.x, 1f / smoothing.x); + _smoothMouse.y = Mathf.Lerp(_smoothMouse.y, mouseDelta.y, 1f / smoothing.y); + // Find the absolute mouse movement value from point zero. + _mouseAbsolute += _smoothMouse; + + // Clamp and apply the local x value first, so as not to be affected by world transforms. + if (clampInDegrees.x < 360) _mouseAbsolute.x = Mathf.Clamp(_mouseAbsolute.x, -clampInDegrees.x * 0.5f, clampInDegrees.x * 0.5f); + + var xRotation = Quaternion.AngleAxis(-_mouseAbsolute.y, targetOrientation * Vector3.right); + transform.localRotation = xRotation; + + // Then clamp and apply the global y value. + if (clampInDegrees.y < 360) _mouseAbsolute.y = Mathf.Clamp(_mouseAbsolute.y, -clampInDegrees.y * 0.5f, clampInDegrees.y * 0.5f); + + var yRotation = Quaternion.AngleAxis(_mouseAbsolute.x, transform.InverseTransformDirection(Vector3.up)); + transform.localRotation *= yRotation; + transform.rotation *= targetOrientation; + } + + void CameraFly() + { + bool moved = false; + // shift was pressed down + //if (Input.GetKeyDown(increaseSpeedKey)) + if (Keyboard.current.leftShiftKey.wasPressedThisFrame) + { + flySpeed *= accelerationRatio; // increase flyspeed + } + + //if (Input.GetKeyUp(increaseSpeedKey)) + if (Keyboard.current.leftShiftKey.wasReleasedThisFrame) + { + flySpeed /= accelerationRatio; // flyspeed back to normal + } + + //if (Input.GetKeyDown(decreaseSpeedKey)) + if (Keyboard.current.leftCtrlKey.wasPressedThisFrame) + { + flySpeed *= slowDownRatio; // decrease flyspeed + } + //if (Input.GetKeyUp(decreaseSpeedKey)) + if (Keyboard.current.leftCtrlKey.wasReleasedThisFrame) + { + flySpeed /= slowDownRatio; // flyspeed back to normal + } + + var vert = -Keyboard.current.sKey.ReadValue() + Keyboard.current.wKey.ReadValue(); + if (vert != 0) + { + moveTransform.Translate(transform.forward * flySpeed * EloManager.instance.camSpeedMultiplier * vert * Time.deltaTime, Space.World); + moved = true; + } + + var horz = -Keyboard.current.aKey.ReadValue() + Keyboard.current.dKey.ReadValue(); + if (horz != 0) + { + moveTransform.Translate(transform.right * flySpeed * EloManager.instance.camSpeedMultiplier * horz * Time.deltaTime, Space.World); + moved = true; + } + + // annoying in editor as it works from any window +#if !UNITY_EDITOR + if (scrollZoom == true) + { + //if (Input.GetAxis("Mouse ScrollWheel") != 0) + var scrollY = Mouse.current.scroll.ReadValue().y; + if (scrollY != 0) + { + transform.Translate(transform.forward * zoomRate * scrollY * Time.deltaTime, Space.World); + moved = true; + } + } +#endif + + //if (Input.GetKey(upKey)) + if (Keyboard.current.qKey.isPressed) + { + moveTransform.Translate(moveTransform.up * flySpeed * 0.5f * Time.deltaTime, Space.World); + moved = true; + } + //else if (Input.GetKey(downKey)) + else if (Keyboard.current.eKey.isPressed) + { + moveTransform.Translate(-moveTransform.up * flySpeed * 0.5f * Time.deltaTime, Space.World); + moved = true; + } + if (moved == true) GetOrbitTarget(); + } // CameraFly() + + // https://stackoverflow.com/questions/25368259/making-an-object-fit-exactly-inside-the-camera-frustum-in-three-js + public void FocusCameraOnGameObject(Bounds b) + { + var height = b.max.y; + var width = b.max.x - b.min.x; + var vertical_FOV = cam.fieldOfView * (Mathf.PI / 180f); + var aspectRatio = Screen.width / Screen.height; + var horizontal_FOV = 2 * Mathf.Atan(Mathf.Tan(vertical_FOV / 2) * aspectRatio); + var distance_vertical = height / (2 * Mathf.Tan(vertical_FOV / 2)); + var distance_horizontal = width / (2 * Mathf.Tan(horizontal_FOV / 2)); + var z_distance = distance_vertical >= distance_horizontal ? distance_vertical : distance_horizontal; + // current viewdir + var viewDir = transform.forward; + // move camera so that object is in front + cam.transform.position = b.center - viewDir * z_distance * 2; + } + + } // class +} // namespace From 0cd5d2f2c00a3b66c96a67f5306069426b224e06 Mon Sep 17 00:00:00 2001 From: mika Date: Mon, 29 Nov 2021 19:54:56 +0200 Subject: [PATCH 179/231] Update SimpleSmoothMouseLookNewInput.cs --- Assets/Scripts/Camera/SimpleSmoothMouseLookNewInput.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Assets/Scripts/Camera/SimpleSmoothMouseLookNewInput.cs b/Assets/Scripts/Camera/SimpleSmoothMouseLookNewInput.cs index 5e8d776..2864d24 100644 --- a/Assets/Scripts/Camera/SimpleSmoothMouseLookNewInput.cs +++ b/Assets/Scripts/Camera/SimpleSmoothMouseLookNewInput.cs @@ -63,7 +63,7 @@ void Awake() private void Start() { - if (ReferenceManager.instance != null) ReferenceManager.instance.mouseControls = this; + } private void OnEnable() @@ -199,14 +199,14 @@ void CameraFly() var vert = -Keyboard.current.sKey.ReadValue() + Keyboard.current.wKey.ReadValue(); if (vert != 0) { - moveTransform.Translate(transform.forward * flySpeed * EloManager.instance.camSpeedMultiplier * vert * Time.deltaTime, Space.World); + moveTransform.Translate(transform.forward * flySpeed * vert * Time.deltaTime, Space.World); moved = true; } var horz = -Keyboard.current.aKey.ReadValue() + Keyboard.current.dKey.ReadValue(); if (horz != 0) { - moveTransform.Translate(transform.right * flySpeed * EloManager.instance.camSpeedMultiplier * horz * Time.deltaTime, Space.World); + moveTransform.Translate(transform.right * flySpeed * horz * Time.deltaTime, Space.World); moved = true; } From d92e853dcaee5c585645b7f0acf8a07c11c194c5 Mon Sep 17 00:00:00 2001 From: mika Date: Tue, 28 Dec 2021 15:38:40 +0200 Subject: [PATCH 180/231] Create WindowAlwaysOnTop.cs --- .../Helpers/Windows/WindowAlwaysOnTop.cs | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 Assets/Scripts/Helpers/Windows/WindowAlwaysOnTop.cs diff --git a/Assets/Scripts/Helpers/Windows/WindowAlwaysOnTop.cs b/Assets/Scripts/Helpers/Windows/WindowAlwaysOnTop.cs new file mode 100644 index 0000000..6d2a7ed --- /dev/null +++ b/Assets/Scripts/Helpers/Windows/WindowAlwaysOnTop.cs @@ -0,0 +1,39 @@ +// keep executable window always on top, good for multiplayer testing + +using System; +using System.Runtime.InteropServices; +using UnityEngine; + +namespace UnityLibrary +{ + public class WindowAlwaysOnTop : MonoBehaviour + { + // https://stackoverflow.com/a/34703664/5452781 + private static readonly IntPtr HWND_TOPMOST = new IntPtr(-1); + private const UInt32 SWP_NOSIZE = 0x0001; + private const UInt32 SWP_NOMOVE = 0x0002; + private const UInt32 TOPMOST_FLAGS = SWP_NOMOVE | SWP_NOSIZE; + + [DllImport("user32.dll")] + [return: MarshalAs(UnmanagedType.Bool)] + public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags); + + // https://forum.unity.com/threads/unity-window-handle.115364/#post-1650240 + [DllImport("user32.dll")] + private static extern IntPtr GetActiveWindow(); + + public static IntPtr GetWindowHandle() + { + return GetActiveWindow(); + } + + void Awake() + { + // TODO save current window pos to player prefs on exit, then can open into same position next time +#if !UNITY_EDITOR + Debug.Log("Make window stay on top"); + SetWindowPos(GetActiveWindow(), HWND_TOPMOST, 0, 0, 0, 0, TOPMOST_FLAGS); +#endif + } + } +} From 8296e3dfb9d3f3f7a968bb3e056e1e3354e38d53 Mon Sep 17 00:00:00 2001 From: mika Date: Fri, 31 Dec 2021 11:29:20 +0200 Subject: [PATCH 181/231] Update WindowAlwaysOnTop.cs --- Assets/Scripts/Helpers/Windows/WindowAlwaysOnTop.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Assets/Scripts/Helpers/Windows/WindowAlwaysOnTop.cs b/Assets/Scripts/Helpers/Windows/WindowAlwaysOnTop.cs index 6d2a7ed..1946cc3 100644 --- a/Assets/Scripts/Helpers/Windows/WindowAlwaysOnTop.cs +++ b/Assets/Scripts/Helpers/Windows/WindowAlwaysOnTop.cs @@ -8,6 +8,8 @@ namespace UnityLibrary { public class WindowAlwaysOnTop : MonoBehaviour { +#if !UNITY_STANDALONE_LINUX + // https://stackoverflow.com/a/34703664/5452781 private static readonly IntPtr HWND_TOPMOST = new IntPtr(-1); private const UInt32 SWP_NOSIZE = 0x0001; @@ -26,11 +28,12 @@ public static IntPtr GetWindowHandle() { return GetActiveWindow(); } +#endif void Awake() { // TODO save current window pos to player prefs on exit, then can open into same position next time -#if !UNITY_EDITOR +#if !UNITY_EDITOR && !UNITY_STANDALONE_LINUX Debug.Log("Make window stay on top"); SetWindowPos(GetActiveWindow(), HWND_TOPMOST, 0, 0, 0, 0, TOPMOST_FLAGS); #endif From eae9ec892e7a4755fdae81401b2a0fb2abe0a869 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Nie=C5=9Bciur?= <63786641+factuall@users.noreply.github.com> Date: Sun, 30 Jan 2022 07:40:20 +0100 Subject: [PATCH 182/231] Create MoveAround.cs --- Assets/Scripts/Editor/Hierarchy/MoveAround.cs | 77 +++++++++++++++++++ .../Editor/Hierarchy/MoveAround.cs.meta | 11 +++ 2 files changed, 88 insertions(+) create mode 100644 Assets/Scripts/Editor/Hierarchy/MoveAround.cs create mode 100644 Assets/Scripts/Editor/Hierarchy/MoveAround.cs.meta diff --git a/Assets/Scripts/Editor/Hierarchy/MoveAround.cs b/Assets/Scripts/Editor/Hierarchy/MoveAround.cs new file mode 100644 index 0000000..1ac886c --- /dev/null +++ b/Assets/Scripts/Editor/Hierarchy/MoveAround.cs @@ -0,0 +1,77 @@ +// Simple shortcuts for moving selected GameObject around in hierarchy by Factuall +// SHIFT + CTRL + ALT + +// W - Move it up in hierarchy +// S - Move it down in hierarchy +// A - Unparent it down +// D - Parent it to next object in hierarchy + +using UnityEditor; + +namespace UnityLibrary +{ + public class UnparentMe + { + [MenuItem("GameObject/Unparent %#&a")] + static void Detach() + { + + if (Selection.activeGameObject != null && Selection.activeGameObject.transform.parent != null) + { + int newIndex = Selection.activeGameObject.transform.parent.GetSiblingIndex(); + Undo.SetTransformParent(Selection.activeGameObject.transform, Selection.activeGameObject.transform.parent.parent, "unparent selection"); + Selection.activeGameObject.transform.SetSiblingIndex(newIndex + 1); + } + } + [MenuItem("GameObject/ParentDown %#&d")] + static void ParentDown() + { + if (Selection.activeGameObject != null) + { + int parentChildCount = Selection.activeGameObject.transform.parent == null ? + Selection.activeGameObject.scene.rootCount : Selection.activeGameObject.transform.parent.childCount; + if (Selection.activeGameObject.transform.GetSiblingIndex() == parentChildCount - 1) return; + if (Selection.activeGameObject.transform.parent != null) + { + if (Selection.activeGameObject.transform.parent.childCount + 1 > Selection.activeGameObject.transform.GetSiblingIndex()) + Undo.SetTransformParent(Selection.activeGameObject.transform, Selection.activeGameObject.transform.parent.GetChild(Selection.activeGameObject.transform.GetSiblingIndex() + 1), "parent selection down in hierarchy"); + + } + else + { + if (Selection.activeGameObject.scene.rootCount + 1 > Selection.activeGameObject.transform.GetSiblingIndex()) + Undo.SetTransformParent(Selection.activeGameObject.transform, Selection.activeGameObject.scene.GetRootGameObjects()[Selection.activeGameObject.transform.GetSiblingIndex() + 1].transform, "parent selection down in hierarchy"); + } + } + + } + [MenuItem("GameObject/Moveup %#&w")] + static void MoveUp() + { + if (Selection.activeGameObject != null) + { + + if (Selection.activeGameObject.transform.GetSiblingIndex() != 0) + { + Undo.RegisterCompleteObjectUndo(Selection.activeGameObject.transform, "move selction up in hierarchy"); + Selection.activeGameObject.transform.SetSiblingIndex(Selection.activeGameObject.transform.GetSiblingIndex() - 1); + } + + } + } + [MenuItem("GameObject/Movedown %#&s")] + static void MoveDown() + { + if (Selection.activeGameObject != null) + { + int parentChildCount = Selection.activeGameObject.transform.parent == null ? + Selection.activeGameObject.scene.rootCount : Selection.activeGameObject.transform.parent.childCount; + if (Selection.activeGameObject.transform.GetSiblingIndex() != parentChildCount - 1) + { + Undo.RegisterCompleteObjectUndo(Selection.activeGameObject.transform, "move selction down in hierarchy"); + Selection.activeGameObject.transform.SetSiblingIndex(Selection.activeGameObject.transform.GetSiblingIndex() + 1); + } + + } + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/Editor/Hierarchy/MoveAround.cs.meta b/Assets/Scripts/Editor/Hierarchy/MoveAround.cs.meta new file mode 100644 index 0000000..41e518a --- /dev/null +++ b/Assets/Scripts/Editor/Hierarchy/MoveAround.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 18fe530f4fbd8b74096f07f377a4b9ff +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From d7d1beaa3e30259be2c4ac79f69152ee646771fb Mon Sep 17 00:00:00 2001 From: Kaustubh Mayekar <67229974+Kaustubh01@users.noreply.github.com> Date: Mon, 28 Feb 2022 22:39:26 +0530 Subject: [PATCH 183/231] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d5b8e6a..aca75b1 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ Useful scripts, snippets and shaders here it is gathered for free. -We have collected most scripts from external sources like Unity Communities (Forums, Answers) and we made it ourselves a little. +We have collected most of the scripts from external sources like Unity Communities (Forums, Answers) and some of them are made by us. ## Getting Started @@ -16,7 +16,7 @@ You can [browse this repository](#content) and find your desired utility or you git clone https://github.com/UnityCommunity/UnityLibrary.git ``` -and then open the folder in unity or you can find useful stuff by [browsing awesome resources in the below](#resources). +then open the folder in unity or you can find useful stuff by [browsing awesome resources in the below](#resources). [:sparkles: Contribution is Welcome](#contribution) From 35f52fc67f4ce37807bcc2edd9225a63ac294744 Mon Sep 17 00:00:00 2001 From: wbm1113 <46951987+wbm1113@users.noreply.github.com> Date: Mon, 7 Mar 2022 16:36:14 -0500 Subject: [PATCH 184/231] Triangle2D --- Assets/Scripts/2D/Geometry/Triangle2D.cs | 58 +++++++++++++++++++ Assets/Scripts/2D/Geometry/Triangle2D.cs.meta | 11 ++++ 2 files changed, 69 insertions(+) create mode 100644 Assets/Scripts/2D/Geometry/Triangle2D.cs create mode 100644 Assets/Scripts/2D/Geometry/Triangle2D.cs.meta diff --git a/Assets/Scripts/2D/Geometry/Triangle2D.cs b/Assets/Scripts/2D/Geometry/Triangle2D.cs new file mode 100644 index 0000000..9268d3a --- /dev/null +++ b/Assets/Scripts/2D/Geometry/Triangle2D.cs @@ -0,0 +1,58 @@ +using UnityEngine; +using UCL; + +// if you need to run collision checks within a triangular area, the easiest +// way to do that in Unity is to use a polygon collider. this is not very +// performant. this class allows you to run those collision checks without +// the performance overhead. + +public class Triangle2D +{ + Vector2[] vertices = new Vector2[3]; + + public Triangle2D(Vector2 v1, Vector2 v2, Vector2 v3) { + Update(v1, v2, v3); + } + + // update triangle by defining all its vertices + public void Update(Vector2 v1, Vector2 v2, Vector2 v3) { + vertices[0] = v1; + vertices[1] = v2; + vertices[2] = v3; + } + + // update triangle by redefining its origin (remaining points update relative to that) + public void Update(Vector2 v1) { + Vector2 delta = v1 - vertices[0]; + vertices[0] = v1; + vertices[1] += delta; + vertices[2] += delta; + } + + // update triangle with rotation and pivot point + public void Update(Vector2 v1, Vector2 v2, Vector2 v3, float rotation, Vector2 pivot) { + vertices[0] = v1.Rotate(rotation, pivot); + vertices[1] = v2.Rotate(rotation, pivot); + vertices[2] = v3.Rotate(rotation, pivot); + } + + float Sign(Vector2 p1, Vector2 p2, Vector2 p3) { + return (p1.x - p3.x) * (p2.y - p3.y) - (p2.x - p3.x) * (p1.y - p3.y); + } + + public bool Contains(Vector2 pt, bool debug = false) { + float d1, d2, d3; + bool has_neg, has_pos; + + d1 = Sign(pt, vertices[0], vertices[1]); + d2 = Sign(pt, vertices[1], vertices[2]); + d3 = Sign(pt, vertices[2], vertices[0]); + + has_neg = (d1 < 0) || (d2 < 0) || (d3 < 0); + has_pos = (d1 > 0) || (d2 > 0) || (d3 > 0); + + bool contains = ! (has_neg && has_pos); + + return contains; + } +} \ No newline at end of file diff --git a/Assets/Scripts/2D/Geometry/Triangle2D.cs.meta b/Assets/Scripts/2D/Geometry/Triangle2D.cs.meta new file mode 100644 index 0000000..db09c09 --- /dev/null +++ b/Assets/Scripts/2D/Geometry/Triangle2D.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5b3d23802c4b0df4db68d12d425fb251 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From 0bfa89e430b39e5ff219d6e2ee4101039d063319 Mon Sep 17 00:00:00 2001 From: wbm1113 <46951987+wbm1113@users.noreply.github.com> Date: Mon, 7 Mar 2022 16:43:22 -0500 Subject: [PATCH 185/231] Vector2Extensions --- Assets/Scripts/2D/Geometry/Triangle2D.cs | 97 ++++++++++--------- .../Scripts/Extensions/Vector2Extensions.cs | 15 +++ .../Extensions/Vector2Extensions.cs.meta | 11 +++ 3 files changed, 79 insertions(+), 44 deletions(-) create mode 100644 Assets/Scripts/Extensions/Vector2Extensions.cs create mode 100644 Assets/Scripts/Extensions/Vector2Extensions.cs.meta diff --git a/Assets/Scripts/2D/Geometry/Triangle2D.cs b/Assets/Scripts/2D/Geometry/Triangle2D.cs index 9268d3a..6d16785 100644 --- a/Assets/Scripts/2D/Geometry/Triangle2D.cs +++ b/Assets/Scripts/2D/Geometry/Triangle2D.cs @@ -1,58 +1,67 @@ using UnityEngine; -using UCL; -// if you need to run collision checks within a triangular area, the easiest -// way to do that in Unity is to use a polygon collider. this is not very -// performant. this class allows you to run those collision checks without -// the performance overhead. - -public class Triangle2D +namespace UnityLibrary { - Vector2[] vertices = new Vector2[3]; + // if you need to run collision checks within a triangular area, the easiest + // way to do that in Unity is to use a polygon collider. this is not very + // performant. this class allows you to run those collision checks without + // the performance overhead. - public Triangle2D(Vector2 v1, Vector2 v2, Vector2 v3) { - Update(v1, v2, v3); - } + public class Triangle2D + { + Vector2[] vertices = new Vector2[3]; - // update triangle by defining all its vertices - public void Update(Vector2 v1, Vector2 v2, Vector2 v3) { - vertices[0] = v1; - vertices[1] = v2; - vertices[2] = v3; - } + public Triangle2D(Vector2 v1, Vector2 v2, Vector2 v3) + { + Update(v1, v2, v3); + } - // update triangle by redefining its origin (remaining points update relative to that) - public void Update(Vector2 v1) { - Vector2 delta = v1 - vertices[0]; - vertices[0] = v1; - vertices[1] += delta; - vertices[2] += delta; - } + // update triangle by defining all its vertices + public void Update(Vector2 v1, Vector2 v2, Vector2 v3) + { + vertices[0] = v1; + vertices[1] = v2; + vertices[2] = v3; + } - // update triangle with rotation and pivot point - public void Update(Vector2 v1, Vector2 v2, Vector2 v3, float rotation, Vector2 pivot) { - vertices[0] = v1.Rotate(rotation, pivot); - vertices[1] = v2.Rotate(rotation, pivot); - vertices[2] = v3.Rotate(rotation, pivot); - } + // update triangle by redefining its origin (remaining points update relative to that) + public void Update(Vector2 v1) + { + Vector2 delta = v1 - vertices[0]; + vertices[0] = v1; + vertices[1] += delta; + vertices[2] += delta; + } - float Sign(Vector2 p1, Vector2 p2, Vector2 p3) { - return (p1.x - p3.x) * (p2.y - p3.y) - (p2.x - p3.x) * (p1.y - p3.y); - } + // update triangle with rotation and pivot point + public void Update(Vector2 v1, Vector2 v2, Vector2 v3, float rotation, Vector2 pivot) + { + vertices[0] = v1.Rotate(rotation, pivot); + vertices[1] = v2.Rotate(rotation, pivot); + vertices[2] = v3.Rotate(rotation, pivot); + } - public bool Contains(Vector2 pt, bool debug = false) { - float d1, d2, d3; - bool has_neg, has_pos; + float Sign(Vector2 p1, Vector2 p2, Vector2 p3) + { + return (p1.x - p3.x) * (p2.y - p3.y) - (p2.x - p3.x) * (p1.y - p3.y); + } - d1 = Sign(pt, vertices[0], vertices[1]); - d2 = Sign(pt, vertices[1], vertices[2]); - d3 = Sign(pt, vertices[2], vertices[0]); + public bool Contains(Vector2 pt, bool debug = false) + { + float d1, d2, d3; + bool has_neg, has_pos; - has_neg = (d1 < 0) || (d2 < 0) || (d3 < 0); - has_pos = (d1 > 0) || (d2 > 0) || (d3 > 0); + d1 = Sign(pt, vertices[0], vertices[1]); + d2 = Sign(pt, vertices[1], vertices[2]); + d3 = Sign(pt, vertices[2], vertices[0]); - bool contains = ! (has_neg && has_pos); + has_neg = (d1 < 0) || (d2 < 0) || (d3 < 0); + has_pos = (d1 > 0) || (d2 > 0) || (d3 > 0); - return contains; + bool contains = ! (has_neg && has_pos); + + return contains; + } } -} \ No newline at end of file +} + diff --git a/Assets/Scripts/Extensions/Vector2Extensions.cs b/Assets/Scripts/Extensions/Vector2Extensions.cs new file mode 100644 index 0000000..e85b0dd --- /dev/null +++ b/Assets/Scripts/Extensions/Vector2Extensions.cs @@ -0,0 +1,15 @@ +using UnityEngine; + +namespace UnityLibrary +{ + static class Vector2Extensions + { + public static Vector2 Round(this Vector2 vector, int to = 0) => new Vector2(vector.x.Round(to), vector.y.Round(to)); + + public static Vector2 Rotate(this Vector2 vector, float angle, Vector2 pivot = default(Vector2)) + { + Vector2 rotated = Quaternion.Euler(new Vector3(0f, 0f, angle)) * (vector - pivot); + return rotated + pivot; + } + } +} diff --git a/Assets/Scripts/Extensions/Vector2Extensions.cs.meta b/Assets/Scripts/Extensions/Vector2Extensions.cs.meta new file mode 100644 index 0000000..0fef0ef --- /dev/null +++ b/Assets/Scripts/Extensions/Vector2Extensions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 058da80b535be1d469c9998e5629a60e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From 4d4b3ee01093ec5bb62815c83b92d2530807d82e Mon Sep 17 00:00:00 2001 From: wbm1113 <46951987+wbm1113@users.noreply.github.com> Date: Wed, 9 Mar 2022 21:00:16 -0500 Subject: [PATCH 186/231] Create StringExtensions.cs --- Assets/Scripts/Extensions/StringExtensions.cs | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 Assets/Scripts/Extensions/StringExtensions.cs diff --git a/Assets/Scripts/Extensions/StringExtensions.cs b/Assets/Scripts/Extensions/StringExtensions.cs new file mode 100644 index 0000000..ca32336 --- /dev/null +++ b/Assets/Scripts/Extensions/StringExtensions.cs @@ -0,0 +1,23 @@ +using UnityEngine; +using System.Globalization; + +namespace UnityLibrary +{ + public static class StringExtensions + { + public static Color ToColor(this string hex) { + hex = hex.Replace("0x", ""); + hex = hex.Replace("#", ""); + + byte a = 255; + byte r = byte.Parse(hex.Substring(0,2), NumberStyles.HexNumber); + byte g = byte.Parse(hex.Substring(2,2), NumberStyles.HexNumber); + byte b = byte.Parse(hex.Substring(4,2), NumberStyles.HexNumber); + + if (hex.Length == 8) + a = byte.Parse(hex.Substring(6,2), NumberStyles.HexNumber); + + return new Color32(r,g,b,a); + } + } +} \ No newline at end of file From a856fdcd55f34d20cf4e36dd527af4de2d3c4f2a Mon Sep 17 00:00:00 2001 From: wbm1113 <46951987+wbm1113@users.noreply.github.com> Date: Wed, 9 Mar 2022 21:06:50 -0500 Subject: [PATCH 187/231] Update StringExtensions.cs --- Assets/Scripts/Extensions/StringExtensions.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Assets/Scripts/Extensions/StringExtensions.cs b/Assets/Scripts/Extensions/StringExtensions.cs index ca32336..e5ecb6a 100644 --- a/Assets/Scripts/Extensions/StringExtensions.cs +++ b/Assets/Scripts/Extensions/StringExtensions.cs @@ -1,6 +1,8 @@ using UnityEngine; using System.Globalization; +// e.g. "#FFFFFF".ToColor() + namespace UnityLibrary { public static class StringExtensions @@ -20,4 +22,4 @@ public static Color ToColor(this string hex) { return new Color32(r,g,b,a); } } -} \ No newline at end of file +} From 73823b09b9254771a583a95854f5e92b51d866a5 Mon Sep 17 00:00:00 2001 From: mika Date: Tue, 19 Apr 2022 10:49:40 +0300 Subject: [PATCH 188/231] Create PostBuildCopyEmptyFolders.cs --- .../BuildProcess/PostBuildCopyEmptyFolders.cs | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 Assets/Scripts/Editor/BuildProcess/PostBuildCopyEmptyFolders.cs diff --git a/Assets/Scripts/Editor/BuildProcess/PostBuildCopyEmptyFolders.cs b/Assets/Scripts/Editor/BuildProcess/PostBuildCopyEmptyFolders.cs new file mode 100644 index 0000000..da29025 --- /dev/null +++ b/Assets/Scripts/Editor/BuildProcess/PostBuildCopyEmptyFolders.cs @@ -0,0 +1,51 @@ +using System.IO; +using UnityEditor; +using UnityEditor.Callbacks; +using UnityEngine; + +// copies empty StreamingAssets/ folders into build, as they are not automatically included + +namespace UnityLibrary +{ + public class PostBuildCopyEmptyFolders : MonoBehaviour + { + [PostProcessBuildAttribute(1)] + public static void OnPostprocessBuild(BuildTarget target, string pathToBuiltProject) + { + Debug.Log("### POSTBUILD : COPY EMPTY STREAMINGASSETS-FOLDERS ###"); + Debug.Log("Build done: " + pathToBuiltProject); + + // get output root + var root = Path.GetDirectoryName(pathToBuiltProject); + var appName = Path.GetFileNameWithoutExtension(pathToBuiltProject); + + // copy empty streaming asset folders to build + var sourcePath = Application.streamingAssetsPath; + var targetPath = Path.Combine(root, appName + "_Data", "StreamingAssets"); + //Debug.Log("sourcePath= "+ sourcePath); + //Debug.Log("targetPath= " + targetPath); + CopyFolderStructure(sourcePath, targetPath); + } + + // recursive folder copier + static public void CopyFolderStructure(string sourceFolder, string destFolder) + { + if (Directory.Exists(destFolder)) + { + + } + else + { + Directory.CreateDirectory(destFolder); + } + + string[] folders = Directory.GetDirectories(sourceFolder); + foreach (string folder in folders) + { + string name = Path.GetFileName(folder); + string dest = Path.Combine(destFolder, name); + CopyFolderStructure(folder, dest); + } + } + } +} From 2b455662d8a6cdd6a47955491b75e5a323d5ffa9 Mon Sep 17 00:00:00 2001 From: mika Date: Wed, 27 Apr 2022 12:20:01 +0300 Subject: [PATCH 189/231] OnPostprocessBuild copy for windows only (otherwise android build fails) --- .../Scripts/Editor/BuildProcess/PostBuildCopyEmptyFolders.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Assets/Scripts/Editor/BuildProcess/PostBuildCopyEmptyFolders.cs b/Assets/Scripts/Editor/BuildProcess/PostBuildCopyEmptyFolders.cs index da29025..186265b 100644 --- a/Assets/Scripts/Editor/BuildProcess/PostBuildCopyEmptyFolders.cs +++ b/Assets/Scripts/Editor/BuildProcess/PostBuildCopyEmptyFolders.cs @@ -12,6 +12,9 @@ public class PostBuildCopyEmptyFolders : MonoBehaviour [PostProcessBuildAttribute(1)] public static void OnPostprocessBuild(BuildTarget target, string pathToBuiltProject) { + // only for windows + if (target != BuildTarget.StandaloneWindows) return; + Debug.Log("### POSTBUILD : COPY EMPTY STREAMINGASSETS-FOLDERS ###"); Debug.Log("Build done: " + pathToBuiltProject); From 6fc5b5cfd89c8e531d6c1b7b3846692d2a391165 Mon Sep 17 00:00:00 2001 From: Bart Huylebroeck Date: Sun, 15 May 2022 09:37:27 +0200 Subject: [PATCH 190/231] fractional part should be calculated AFTER gray value has been added for continuous cycling effect --- Assets/Shaders/2D/Effects/ColorCycle.shader | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Assets/Shaders/2D/Effects/ColorCycle.shader b/Assets/Shaders/2D/Effects/ColorCycle.shader index a41acc0..3d0c754 100644 --- a/Assets/Shaders/2D/Effects/ColorCycle.shader +++ b/Assets/Shaders/2D/Effects/ColorCycle.shader @@ -51,10 +51,10 @@ Shader "UnityLibrary/2D/Effects/ColorCycle" float gray = tex2D(_MainTex, i.uv).r; // get scrolling - float scroll = frac(_Time.x*_Speed); + float scroll = frac(gray + _Time.x*_Speed); // get gradient color from texture - fixed4 col = tex2D(_GradientTex,float2(gray+scroll,0.5)); + fixed4 col = tex2D(_GradientTex,float2(scroll,0.5)); return col; } From f1a9afac9d24b93bd8455b1e47ff409999b1eda8 Mon Sep 17 00:00:00 2001 From: mika Date: Thu, 2 Jun 2022 10:21:49 +0300 Subject: [PATCH 191/231] fix triangles error from point/line-topology meshes --- Assets/Scripts/Editor/Tools/GetSelectedMeshInfo.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Assets/Scripts/Editor/Tools/GetSelectedMeshInfo.cs b/Assets/Scripts/Editor/Tools/GetSelectedMeshInfo.cs index e12f971..066da8d 100644 --- a/Assets/Scripts/Editor/Tools/GetSelectedMeshInfo.cs +++ b/Assets/Scripts/Editor/Tools/GetSelectedMeshInfo.cs @@ -59,7 +59,8 @@ void OnGUI() { int verts = meshes[i].sharedMesh.vertexCount; totalVertices += verts; - totalTris += meshes[i].sharedMesh.triangles.Length / 3; + // not for point/line meshes + if (meshes[i].sharedMesh.GetTopology(0) == MeshTopology.Triangles) totalTris += meshes[i].sharedMesh.triangles.Length / 3; totalMeshes++; topList.Add(i, verts); } From 8aaf2274a42d48c1023a8ea0572f094ddeaef633 Mon Sep 17 00:00:00 2001 From: mousedoc Date: Thu, 23 Jun 2022 12:28:46 +0900 Subject: [PATCH 192/231] Add legacy animation creator --- Assets/Scripts/Editor/Animation.meta | 8 ++++++ .../Animation/LegacyAnimationCreator.meta | 8 ++++++ .../LegacyAnimationCreator.cs | 28 +++++++++++++++++++ .../LegacyAnimationCreator.cs.meta | 11 ++++++++ 4 files changed, 55 insertions(+) create mode 100644 Assets/Scripts/Editor/Animation.meta create mode 100644 Assets/Scripts/Editor/Animation/LegacyAnimationCreator.meta create mode 100644 Assets/Scripts/Editor/Animation/LegacyAnimationCreator/LegacyAnimationCreator.cs create mode 100644 Assets/Scripts/Editor/Animation/LegacyAnimationCreator/LegacyAnimationCreator.cs.meta diff --git a/Assets/Scripts/Editor/Animation.meta b/Assets/Scripts/Editor/Animation.meta new file mode 100644 index 0000000..a9393f4 --- /dev/null +++ b/Assets/Scripts/Editor/Animation.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 344c9e72d34584041b61214522912d71 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Editor/Animation/LegacyAnimationCreator.meta b/Assets/Scripts/Editor/Animation/LegacyAnimationCreator.meta new file mode 100644 index 0000000..9fc6b69 --- /dev/null +++ b/Assets/Scripts/Editor/Animation/LegacyAnimationCreator.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e78d070eb9ba01749a33425b62b0fe5c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Editor/Animation/LegacyAnimationCreator/LegacyAnimationCreator.cs b/Assets/Scripts/Editor/Animation/LegacyAnimationCreator/LegacyAnimationCreator.cs new file mode 100644 index 0000000..35f7ff2 --- /dev/null +++ b/Assets/Scripts/Editor/Animation/LegacyAnimationCreator/LegacyAnimationCreator.cs @@ -0,0 +1,28 @@ +using System.IO; +using UnityEditor; +using UnityEngine; + +public class LegacyAnimationCreator +{ + [MenuItem("Assets/Create/Legacy Animation", priority = 402)] + public static void CompressSelectedAnimationClips() + { + var clip = new AnimationClip(); + clip.legacy = true; + clip.name = "New Legacy Animation"; + + string path; + var selection = Selection.activeObject; + if (selection == null) + path = "Assets"; + else + path = AssetDatabase.GetAssetPath(selection.GetInstanceID()); + + path = Path.GetDirectoryName(path); + path += $"/{clip.name}.anim"; + + ProjectWindowUtil.CreateAsset(clip, path); + Selection.activeObject = clip; + EditorUtility.SetDirty(clip); + } +} \ No newline at end of file diff --git a/Assets/Scripts/Editor/Animation/LegacyAnimationCreator/LegacyAnimationCreator.cs.meta b/Assets/Scripts/Editor/Animation/LegacyAnimationCreator/LegacyAnimationCreator.cs.meta new file mode 100644 index 0000000..5bd716f --- /dev/null +++ b/Assets/Scripts/Editor/Animation/LegacyAnimationCreator/LegacyAnimationCreator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d536889e20faa9d47b7def4f46203b81 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From 70073f18dd40bc1b94da3ef53627c21ddb722d33 Mon Sep 17 00:00:00 2001 From: emir Date: Mon, 5 Sep 2022 01:09:28 +0300 Subject: [PATCH 193/231] =?UTF-8?q?Added=20SaveUtility=20static=20class=20?= =?UTF-8?q?with=20generic=20methods.=20->=20#=20For:=C2=A0Sav&Load=20any?= =?UTF-8?q?=20serialized=20class=20#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/Scripts/Utilities/SaveUtility.cs | 70 ++++++++++++++++++++ Assets/Scripts/Utilities/SaveUtility.cs.meta | 11 +++ 2 files changed, 81 insertions(+) create mode 100644 Assets/Scripts/Utilities/SaveUtility.cs create mode 100644 Assets/Scripts/Utilities/SaveUtility.cs.meta diff --git a/Assets/Scripts/Utilities/SaveUtility.cs b/Assets/Scripts/Utilities/SaveUtility.cs new file mode 100644 index 0000000..96bb9b0 --- /dev/null +++ b/Assets/Scripts/Utilities/SaveUtility.cs @@ -0,0 +1,70 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace Utilities +{ + public static class SaveUtility + { + /* --- Usage ---- + + -- Lets say we have a serialized class called Save -- + + [System.Serializable] + public class Save + { + public int testInt; + public List TestStrings = new List(); + } + + -- For saving this class we would do the following -->> -- + + Save save = new Save(); + save.testInt = 5; + save.TestStrings.Add("Hello"); + + SaveUtility.Save(save, "testPath"); + + -- For loading this class we would do the following --> -- + + Save save = SaveUtility.Load("testPath"); + + Important : Since save operation uses PlayerPrefs and does not contain any encrypting. Dont save&load any confidential data using this class. + + --- End of Usage ---- */ + + + /// + /// Saves any serialized class on the specified savepath. + /// + public static void Save(this T save, string savePath) + where T : class + { + var data = JsonUtility.ToJson(save); + PlayerPrefs.SetString(savePath, data); + } + + /// + /// Loads and returns the saved class on the specified savepath. + /// If no save is found, it will return a new instance of the class. + /// + /// Loaded serialized save class + public static T Load(TSt path) + where T : class, new() + where TSt : IComparable, ICloneable, IConvertible, IComparable, IEnumerable, IEnumerable, IEquatable + { + var data = new T(); + + if (PlayerPrefs.HasKey(path as string) == false) + { + data.Save(path as string); + } + + { + data = JsonUtility.FromJson(PlayerPrefs.GetString(path as string)); + } + return data; + } + } +} diff --git a/Assets/Scripts/Utilities/SaveUtility.cs.meta b/Assets/Scripts/Utilities/SaveUtility.cs.meta new file mode 100644 index 0000000..390ab63 --- /dev/null +++ b/Assets/Scripts/Utilities/SaveUtility.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7d8aad24cf3d7485c9507bf763b79d42 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From e12d3618ed22105e1a38038120a756e9d3345d53 Mon Sep 17 00:00:00 2001 From: mika Date: Sat, 3 Dec 2022 13:43:18 +0200 Subject: [PATCH 194/231] add LineRenderer_ClipStartEnd.shader --- .../LineRenderer_ClipStartEnd.shader | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 Assets/Shaders/2D/LineRenderer/LineRenderer_ClipStartEnd.shader diff --git a/Assets/Shaders/2D/LineRenderer/LineRenderer_ClipStartEnd.shader b/Assets/Shaders/2D/LineRenderer/LineRenderer_ClipStartEnd.shader new file mode 100644 index 0000000..7971f3c --- /dev/null +++ b/Assets/Shaders/2D/LineRenderer/LineRenderer_ClipStartEnd.shader @@ -0,0 +1,62 @@ +Shader "UnityLibrary/LineRenderer/ClipStartEnd" +{ + Properties + { + _MainTex ("Texture", 2D) = "white" {} + _Start ("Start", Range (0.0,1.0)) = 0.25 + _End ("End", Range (0.0,1.0)) = 0.75 + } + + SubShader + { + Tags { "RenderType"="Opaque" } + LOD 100 + + Pass + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + #include "UnityCG.cginc" + + struct appdata + { + float4 vertex : POSITION; + float2 uv : TEXCOORD0; + float4 color : COLOR; + }; + + struct v2f + { + float2 uv : TEXCOORD0; + float4 vertex : SV_POSITION; + float4 color : COLOR; + }; + + sampler2D _MainTex; + float4 _MainTex_ST; + float _Start; + float _End; + + + v2f vert (appdata v) + { + v2f o; + o.vertex = UnityObjectToClipPos(v.vertex); + o.uv = TRANSFORM_TEX(v.uv, _MainTex); + o.color = v.color; + return o; + } + + fixed4 frag(v2f i) : SV_Target + { + fixed4 col = tex2D(_MainTex, i.uv)*i.color; + clip(-(i.uv.x <_Start || i.uv.x > _End)); + // return fixed4(i.uv.x,0,0,0); // view UV x + return col; + } + ENDCG + } + } +} \ No newline at end of file From 1a555e190570b4c86b8e35090bd4acada9cd904d Mon Sep 17 00:00:00 2001 From: mika Date: Sat, 3 Dec 2022 21:50:06 +0200 Subject: [PATCH 195/231] add NavMeshAgentExample.cs --- .../Docs/UnityEngine/NavMeshAgentExample.cs | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 Assets/Scripts/Docs/UnityEngine/NavMeshAgentExample.cs diff --git a/Assets/Scripts/Docs/UnityEngine/NavMeshAgentExample.cs b/Assets/Scripts/Docs/UnityEngine/NavMeshAgentExample.cs new file mode 100644 index 0000000..bae418b --- /dev/null +++ b/Assets/Scripts/Docs/UnityEngine/NavMeshAgentExample.cs @@ -0,0 +1,23 @@ +// made with chatGPT + +using UnityEngine; +using UnityEngine.AI; + +namespace UnityLibrary +{ + public class NavMeshAgentExample : MonoBehaviour + { + public Transform target; + + private NavMeshAgent agent; + + void Start() + { + // Get the NavMeshAgent component on this game object + agent = GetComponent(); + + // Set the destination of the NavMeshAgent to the target Transform + agent.destination = target.position; + } + } +} From a60e3cf7f40a816f3d06ed392e30080b6afb9c3c Mon Sep 17 00:00:00 2001 From: ForlornU <101473036+ForlornU@users.noreply.github.com> Date: Sat, 15 Apr 2023 06:42:02 +0200 Subject: [PATCH 196/231] Rewrite of cameraShake Lots of changes and improvements, the original purpose remains but in a better format Class that calls for the camera to shake passes along the values for intensity and duration to the camera which has "influence modifers" for how sensetive it is to shaking Based on a timed duration instead of a dickle decay value magical numbers, bools and such are gone --- Assets/Scripts/Camera/CameraShake.cs | 78 +++++++++++++++------------- 1 file changed, 43 insertions(+), 35 deletions(-) diff --git a/Assets/Scripts/Camera/CameraShake.cs b/Assets/Scripts/Camera/CameraShake.cs index d8814bb..48a88e6 100644 --- a/Assets/Scripts/Camera/CameraShake.cs +++ b/Assets/Scripts/Camera/CameraShake.cs @@ -1,58 +1,66 @@ using UnityEngine; using System.Collections; -// usage: attach this script into camera, call Shake() method to start -// source: http://answers.unity3d.com/answers/992509/view.html +/* + * Usage: attach this script to a camera or any other object, call Shake() method to start shaking it +* To turn off, change influence to zero +* Attach the camera to an empty game object to keep its local position and rotation +*/ namespace UnityLibrary { public class CameraShake : MonoBehaviour { - public bool shakePosition; - public bool shakeRotation; - - public float shakeIntensityMin = 0.1f; - public float shakeIntensityMax = 0.5f; - public float shakeDecay = 0.02f; + [Range(0f, 1f)] + public float shakeInfluence = 0.5f; + [Range(0f, 10f)] + public float rotationInfluence = 0f; private Vector3 OriginalPos; private Quaternion OriginalRot; - private bool isShakeRunning = false; - // call this function to start shaking - public void Shake() +/// +/// Will shake the camera with a random value between minIntensity and maxIntensity for duration +/// +/// +/// +/// + public void Shake(float minIntensity, float maxIntensity, float duration) { + if (isShakeRunning) + return; + OriginalPos = transform.position; OriginalRot = transform.rotation; - StartCoroutine("ProcessShake"); + + float shake = Random.Range(minIntensity, maxIntensity) * shakeInfluence; + duration *= shakeInfluence; + + StartCoroutine(ProcessShake(shake, duration)); } - IEnumerator ProcessShake() + IEnumerator ProcessShake(float shake, float duration) { - if (!isShakeRunning) + isShakeRunning = true; + float countdown = duration; + float initialShake = shake; + + while (countdown > 0) { - isShakeRunning = true; - float currentShakeIntensity = Random.Range(shakeIntensityMin, shakeIntensityMax); - - while (currentShakeIntensity > 0) - { - if (shakePosition) - { - transform.position = OriginalPos + Random.insideUnitSphere * currentShakeIntensity; - } - if (shakeRotation) - { - transform.rotation = new Quaternion(OriginalRot.x + Random.Range(-currentShakeIntensity, currentShakeIntensity) * .2f, - OriginalRot.y + Random.Range(-currentShakeIntensity, currentShakeIntensity) * .2f, - OriginalRot.z + Random.Range(-currentShakeIntensity, currentShakeIntensity) * .2f, - OriginalRot.w + Random.Range(-currentShakeIntensity, currentShakeIntensity) * .2f); - } - currentShakeIntensity -= shakeDecay; - yield return null; - } - - isShakeRunning = false; + countdown -= Time.deltaTime; + + float lerpIntensity = countdown / duration; + shake = Mathf.Lerp(0f, initialShake, lerpIntensity); + + transform.position = OriginalPos + Random.insideUnitSphere * shake; + transform.rotation = Quaternion.Euler(OriginalRot.eulerAngles + Random.insideUnitSphere * shake * rotationInfluence); + + yield return null; } + + transform.position = OriginalPos; + transform.rotation = OriginalRot; + isShakeRunning = false; } } } \ No newline at end of file From d4eeaeb201b8bd99342656dfe17b7f23a373afc8 Mon Sep 17 00:00:00 2001 From: Falcon Date: Fri, 28 Apr 2023 18:59:17 +0900 Subject: [PATCH 197/231] Auto Resolution Script It's useful for overcoming very slight differences. It is difficult to apply a large changes in which the resolution is reversed. It can be used appropriately in situations where resolution is important in mobile-like environments. Attach this script to the camera and enter the desired resolution. --- Assets/Scripts/Camera/AutoResolution.cs | 58 +++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 Assets/Scripts/Camera/AutoResolution.cs diff --git a/Assets/Scripts/Camera/AutoResolution.cs b/Assets/Scripts/Camera/AutoResolution.cs new file mode 100644 index 0000000..87fd874 --- /dev/null +++ b/Assets/Scripts/Camera/AutoResolution.cs @@ -0,0 +1,58 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class AutoResolution : MonoBehaviour +{ + public int setWidth = 1440; + public int setHeight = 2560; + + private void Start() + { + // Get the main camera and its current dimensions + Camera camera = Camera.main; + Rect rect = camera.rect; + + // Calculate the scale height and width of the screen + float scaleHeight = ((float)Screen.width / Screen.height) / ((float)9 / 16); + float scaleWidth = 1f / scaleHeight; + + // Adjust the camera's dimensions based on the scale height and width + if (scaleHeight < 1) + { + rect.height = scaleHeight; + rect.y = (1f - scaleHeight) / 2f; + } + else + { + rect.width = scaleWidth; + rect.x = (1f - scaleWidth) / 2f; + } + + camera.rect = rect; + + SetResolution(); + } + + public void SetResolution() + { + // Get the current device's screen dimensions + int deviceWidth = Screen.width; + int deviceHeight = Screen.height; + + // Set the screen resolution to the desired dimensions, while maintaining aspect ratio + Screen.SetResolution(setWidth, (int)(((float)deviceHeight / deviceWidth) * setWidth), true); + + // Adjust the camera's dimensions based on the new resolution + if ((float)setWidth / setHeight < (float)deviceWidth / deviceHeight) + { + float newWidth = ((float)setWidth / setHeight) / ((float)deviceWidth / deviceHeight); + Camera.main.rect = new Rect((1f - newWidth) / 2f, 0f, newWidth, 1f); + } + else + { + float newHeight = ((float)deviceWidth / deviceHeight) / ((float)setWidth / setHeight); + Camera.main.rect = new Rect(0f, (1f - newHeight) / 2f, 1f, newHeight); // 새로운 Rect 적용 + } + } +} From 02ac2cde7f6b7c127461e09fa58f0a5fce0b6f7d Mon Sep 17 00:00:00 2001 From: Chase Duffman <74204097+xXxT0SHIIIxXx@users.noreply.github.com> Date: Sat, 6 May 2023 20:24:37 -0700 Subject: [PATCH 198/231] Update README.md Added custom Logo for Unity Library --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index aca75b1..2facccc 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ -# Unity Library -:tada: Welcome to Unity Library :tada: +# ![Unity Library](https://i.imgur.com/btbDvqv.png) + +:tada: Welcome to Unity Library :tada: Useful scripts, snippets and shaders here it is gathered for free. From c06129b3beaa7b0552cdf52026472a446515d2d2 Mon Sep 17 00:00:00 2001 From: Chase Duffman <74204097+xXxT0SHIIIxXx@users.noreply.github.com> Date: Sun, 7 May 2023 10:06:20 -0400 Subject: [PATCH 199/231] Adding Logos for Light and Dark Mode Added Logos for users using Dark Mode and Light Mode --- Logos/Unity_Library_Black.png | Bin 0 -> 33584 bytes Logos/Unity_Library_White.png | Bin 0 -> 35506 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 Logos/Unity_Library_Black.png create mode 100644 Logos/Unity_Library_White.png diff --git a/Logos/Unity_Library_Black.png b/Logos/Unity_Library_Black.png new file mode 100644 index 0000000000000000000000000000000000000000..b5761a5ca1b6c229da5ca4c7c41e05a6239d70e2 GIT binary patch literal 33584 zcmdSA1z42bx<3qvf~cfOO9=>yzzkE83W(CJsN~QgEnNm(3P=h_hY|uJk_rqB0!oR5 zG!lYH$G09Z_kQ;|?>^uEIx%xGGtcv^b+0>qcdWo)NkRG;2|WoO9^SDlmnBv3@Ca7$ z@bJlr4}m)$j`OpDi(94=5=y36EFRwJ2M!O)WNVa;<2+X`NS$G_C%0)x`jo^%^6517 zY%;0k!JKoJvl1p|msL_elMygi_=-cB{pg{U=}CKVfS15+hdW zT2<3X^QC3np=L$?uCn!0lT%N5IUW^P3waO_PS-}gv$PXMGGvTzIH$_L_f>wM^Q|I1 z$Bx(X^V{xo!dY>T*w1$HmrO?oINo<%zG*AJCh1iB5dXeaWJ2~*+$W33s^d2nr;a+Q zDe``(&N|d>_lQ;atg!A_po`_nZyc}f^#nMJ6>p0nmD%ofTvj%CEKHiBa^#_=-O#nV zl4>6(d*`@_{MrW`T!R$Kft?6m1iQ=i1YwTI&0XQSmRhG`SN@|rS9`V@?^TONtlnH* zedo|@JnZiM`QpbaR*bxRVCB`GLm{k1$D&XUybgF*h2Cyja6U7TT54J`fPJyS*E&2^ z=^GMhrcrFymdH}cQ8h(M8mfDF-dAH6FQwafC~x9J0x-Z~>&u#Ucz8!Bp+Ef2j~-jV z99{NO*X&jF99gVwt&B`93|Z`*tqoZWolK4JNT5#=7U%^NfRP9yP-r9uiR1?_L5v^< zrU!nYp)2r0@$(D7_yzdk;J3iuouA(Vdf*P?*L@NsY`=kk{+|z!5JB*Qq5px<_x5lB za3A~@Fx+oPg8K0Q8X0;3jSgOz{V#qb294qu1Q*{q(u02g_CoU;Vfn$JB%n7C0Fq|^ z#*b@30i+<(2njI!B-X{VMX>(6!fQ{dDM`8qCdz?aA{!Ii!^jwjrpQ)_!H9trfhZ(bG{lH@Ptg9GURQ8-!<225@MIQc_`B=sGp19*7M z@BeZXCrfKQ67aD%2Iwb10>{FQP{1Zg0VEu$k3^sZVf>JGkwAAyL%0D9W@x0ZuWtl{ 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 nFG8?W-wdA;Qb-4=6 literal 0 HcmV?d00001 diff --git a/Logos/Unity_Library_White.png b/Logos/Unity_Library_White.png new file mode 100644 index 0000000000000000000000000000000000000000..f0d5651376829d2e549d105a38e30ac362637206 GIT binary patch literal 35506 zcmdSB2RxPU|3A)2IVqV%$etV zaa!%d0G`)nn}HXSx>6tM$1lDVAf=Kft2=SvTX-+;9xdy=pp+`Z&{)^o>>7YhKvy?Kk-Mx{>eqH}SPR zOY%cnBFo!^!Uc*a8ig4xl<)K zm*Z7!M>S&?TDv>8W){|_w2p3ernIK67G_v@m`^-f%nQa1!{gLIW1AcQKp84aO+ZdeT`|~^=KkR4#H{#a|{1}4Z1rzuSq3`2) zxWRewo7?ng93K3~1q^4*1q^ra5{@#IDp3(eDfZD3V>UzjbU@CAp3=IDD zJf8r@0Dr#ld@nK|0H5pr*1Z;Xjz}y#%;%ANX<__$ztxWiXa|V$2=Kyy%T0hJznBoO z<%7i#78Xs4{XP8%3}h9 znVKOG2s0QAoEPNh#hl@T^YHPS@Nn^(0AKQeu^!B> zeDlD8E#bU){M>K>m^i>7TZRnc@MboAH|fwFH1{To^?T?FEed&q(u{0QVo- z<_CE^jBWmr{@;-Y-ULj4#{};%3V7hWz+?PJYV!XJC4SEYNQ4PfI4~rL1~Wbo6Tq~< zc)*w-W-;VJ;pe*Wr}O_{ z^c|h}50e(a6i7`BS3V4{-wgj#F20{f{wO#wfR-3M0$)4=e7t|HIEUxqhxLf-H^fbV zl84@f3u1_a>_3v@2lanm&i+d9FnNu6f&K76m>t4Ah$keVYzC0$4^M#NatJa<76D$v zNC0Xk_=5q6g7NTSB9xyW;2EeQygWSo0P%o&{5%*?HvwqK1IY4#%U~!E4-WuA@X5`? z4gALsuKt4+F>>Jn7h|9j6We_MAcx?Q9Dpbia0j`H~0MtDk!h?|$j1UBWzm)@s@!cGFKO*yo9Dn8>#ugZx9mxY=<}b|%a0^Ct z05{+hxF56@Knh+U7p6vF>;ebBK|#QXkFg2(1;PW2;09wcHv!ea5g!=y2RgxjgGV4O zFlm5E3ErbvISf-!p#Hq=2c#T29!Lzb4HHM0m_95rn79U3`ppeLkdq$?68QUQK5#oI zQHKG-0|PMfqgosezyyXdpTO^KJY<6@f1qc=yg~6YJM6#?kMO{W-;omhPe}nnKa=_a zUO+0)#DItfn8POkTrBwAyBHsW@^xf{?~)w~f`_TDzr7ukiod&^|M#phk^P64K#z3P za2@%HAGr9?;eRTR!A1~Y{1~4C8G)NHvSAovz#opOX#B>Q%Ek}>vynJ#B@U7DdyWH` zKTIV+1TOfa-N0ysX@2kk4~(Bcj={NqzW8%T0-{Rrhi|_(8h_SiV@!f$+L}L%ci6fd z;WHnm?fWOU{wB>2TfaZ>=6jxl1o#KM0g3TX;Rf%YT}`Oj<1VI2L2FC2gd;DccTUWZNc(J0L4pDpU2Zuo-`#6Z+v#xMEuofhtT!6*!*|U47>)U_#15g zjqU!%XCNT|YkUT#5I=nJvlT#${H@P;kf7`Q-mL$eScilTFa8_p3EcjhT5?p7@O~=L z-wWg)8P4-_68{-HyqMV({O4p8cKR^0IqW}EXA9oz-@?Svc zh~WP$q2D>?e^#O&X8!s6-<0Tg%KS{`{}izOYi0fqsrH{L^S@a&j4uCXK>n)6?~eYb z3H_sE{--7SM=Sl?68)nxzY_bm3H^H8KOX&e5c*fj{3_LdheW?}{8vZ6Nc5j6^DF6J z2>p8LKRfy_BE)6Qg)hR6Rg)&99M|HoAOPn7vzuiF2+GXMKj z`&F0!AVn}s3cq<0k6C92D|29l9XxbCe2R|8rE%>R78Wg*yz~_f*PHWcxM<$1aeKzx zzUR3f-wQ!#zTf7VMYNxPZ(;EIS$Bs)o|LJ87#kTQympb#08P5hmvD6aJk~N3olm7 z)A08syi?d`6hy9cguzE#mpmPDANUYyKk(_e(?Q5!gaZz^AjhO1(yt7)EYeogO;AVA zGo~mxP1)}3Gqh?kdMKXZ`#|%_Xwc-xUPB~<2Pt#;SJT#s(bRzx`XcQIQc57BR8B3gCAu9jbWQ$YQqGoi8;%(N7^a*jU_fY|K++|D93Dt_Po2M1m%D z86v^umWVfro&||#>9(8fq;|~bW3yhm>)}rdr)+5vNzW|4*=9Zoe=syu@zDj@N+3EC z6;&$4(0L59fo{RR@TlcDSrP}!jO1MrviDzQ+_E@QU3U!dt{8=|j=9xkPnbnh$`!Kr zR}%8r$nfA$=YAFD6=r<8k^ZcQ9aW^`rnk3OO#3e72L1iF6et(AGroN+&w~iN4x&X^ zeQ)RSLS$%pAj}(~*ozd5_}tRa869@|XxH^R+U=(kxEqlZY0G>OEGGLWi9a@ug+=I8 zwx=bQX(t?ojdRU_jKNEfN4G^J+>2PZZRqzjt$^v6ajwmg9ZS2HdWANMOfkIEKc%{X zCMxwF8}m-9`F>ANLpbqmlg8GZi)@q17xfDIKt!z&y|k4iIr)xhZVh>I@VO<3BpB_d zOPuE=Zg%1{uJA=?$k#Hv6$b5_DT|-8RlRuW6{+>YQ5MMm|Ji-JlG4exT?I##LqU%Wko&r*SjzBh-|N-6M0M zr(YFExZOt3h?o@K0-9q%^l-Xo)J#`7aCfxVv}#f44D1!3npRwbr5>X6e>TV(_88)xt-p*P)DRQST}I7cUpy6S#j4%42y=_e-6u}hL$1{`m&&r=l+AC&U_j?-Uqg7_ z$jgmI3Yw@bpRexT7d-a^CkXjuEBjOF;(|SHt;^7gVLZ=$xo6fLp44`AA*K>-Q+1E} zo6U@eKel$PwnCaP6T%deuG--eUu%w|ZL|B-hTrX9%_xtn)@(NFieR#h{q%<0e8$Od zXp4|=Ngj3$A&%M^+i5U^*~aKwLrDsA!}th9J+q3|l4=w5ugxh^Ul=sQ2?(rDAWo^a zMeLEOi930YYK$)C;4LP6Q@fKmAD)#SK8VE!r%<(>Ix~jhwkz-4|GmXF?qV`D~^m97} zyK~iy*IVpUC+uYOwdSkkR-8^+oe;a^7HLu3GqCmB*^)UH)7?f5fe+bMTg=ge ziZ?mO!d}})AH)w`N9;#I9B1|2a5#!rpqEYPn|=<{~<%K#FDEDC4Wlc~{G-WI&1G>L&PZ(wFpbF$fCZH`};JM(!DT_qtf%79Q$0# zi24e1s}BAvA+7cPxZQB~`yOu{sl25`3vUBid=JeQi*hsI%wDKfF0Or85p)^tXM?P;NFsPZRqNAatR7rY1;+V1|t)wK(kkA&|X%# z@Yi>xOpTiRB2%f8Hdk(xePju(*OumMMj*tSuRCQtkZ^;hUW!R)ax0s70*adnVO72# z7iIPC+}^UNDEX&?LvoFWG7WLZ@Icoy=?8{RzoDttgk3JIsY`ZGnE1*dR^BY)A|qnG zkW55=22wi9*GJ`?qf{d`Z--T!En{??$d0ug@63)y0$s03n|vIl+qudYS5uJ8>v^Ji zLmnWZ4-1XVLoy69zOKD^v+scT^sM^(`T^zpFRtk2scM=oGP-c(~gJ5_QycEAc;jC`)6x` zb6%T}R>5d*x%Pa|mAcB*>wC64F^eR0vWsgj`(ic5y$LrqDi@fmLFvi;@=dSkvnJcx zlQZg_LrDq;t;;FOtxRhd#=K(|V>&{$4pR0fJPbHA_iR@xg7>{jOb&uk_#J`q>aPO- z>>30Kr_<0{X?G*U%G*1~9Ij@eyOH#^q$r&ii9A86rq8R2n4L*)PDpz_uoL3$46@1{ zp^hHJ>7}tMO>!^~d9%uYzs;0Gh)Hnd;qvpcHtj1ebw^gOhvvf|fFVW}9loq{ZE3UIo6iK_=$j}{ z3XwUaSrI8~<^5=}jBt`^RYO{8gWFKEw^0(A!F%GbD(+2~Mtd7T#GIba76WWZc4%$~ zwM`m&t%m#amE_@aTSnuA-gh?|4i0orR^7><-A0XQ?_Z9R$5c%pq96e7HT-&EA=9pL zM6lv~ziyo;$g^IXse1m`ooPH|AC?6ir$2zUdNRRd^o2U>9kQladqlNY*jl5a`Enxq zp5o9?TY>;Gk*aU>vWNPKZcM2(5yB|cSOzB+Dl)G+uxO!`ItX8G-;kB?+p1~6lDtqd z$6-oyhOze&x%Z0+w`jc=ypRj!&nB+!eDn3YI!zOoI;>`%_u6kN&FK@n-i7L|haP^P zayN>exYJm4ie(0%-sNR2oo6i&ed+(gA>^Vc>Y1yR=aV6>}S*bv8)_# zQ=F&hU4DN_T{^<*!+oZrs3F=ryYSdr0tIJHkAo*2oGNSPOP>s{+YF1|@lJlqps1BG zk7OTHmrJ=b)P1F8dUu1kcQBiExSJi)7bfmF9W7m)IYE7@5F~M|^M07l z?xTv&xDUA_s&{+gkbL9q7ZW_u=q#^FTa!c~iIp=aPkk~7@W+~YegMyG^}G9p!$c%h z>8p;pp0iNu`_}dAclnscWV;u$yGK0nDCGVv+C?H(-VEv_X&e{MA(?%(-o-^|lHjkO0?#K=jdGSTz8gvUXkuQ*0a;cG$ zMvdh~O=cf^4^rGw-=>b}DZ}&o`^)wx`>l332;#6grw5_sqfqQg-mfo|%h4sG0LFtjcJUQ*`rmP7S)0UIl8wo*7dEOR_zptoYdH@D}LUW(G>~ z=7MW{P`pDeCLOjt=X>R{SQBDD3O`X5kunb{KjvXpJlrNN{g4zvgHjB;5$7m%%ldBf zF-beT+?Wp&h!mJ|)0r@QN_bvw8MvQnMC{3Za)LjompQn6x=@St%!E4&Z-Xg0^zL=DeU7MHHjx=8 z^`gh#)|CBTfn(AqcoQnsf;=SzH&SKzreq~j0ynf3JCoY%T0k6HMq#}}Ju`(C69>dSyL;1juOOFp= zzA!1v+BGP~%#wqY?xG~SnGp}?InQDjx9itwe71BJb)$7I%t{KO8@;6vP6U-@g3$9X zr}M{L6L1N$hM)Rqa01|xr%pfV3864+XDOU-SlxtNT5yOu^z=;ax?KPKs;58~yoX-5 zS6}}U(dpT&1gZ_x+w*FTj~o+x=~dqzFYb707&z{yG!mJjE|>PaH^4AYBjSgzxgc$X zXqle0o#OLmp1sZLo@S6^9877sA8$6d2dp0Nch`lS&WDjevI%#u4X5=#AnORoq>&tu z`s!E8|4lcWBmII{@q#ZA`8kO7!!NMYIQz6bn+hhDA$C*?6{z5vk}<|)tcq?KmW|TO z;hcGOoHw_|={)8f+RAz?bAXc@u0L(R(XP`z+(W^=>3j(q`Qbi(U^;6>&BWK}HYRxN zkX~`h1j~8hP<)QpS7>htw0jauNQAtzy4t;KJ~IG+B$oFT+c%W)*6P5=ZGqN3#`4%m znXl)g2`=BtQ#oObpy59$S-t!t7J~PR9p>fl?Tbc-Duk0(jLK%v^g&8U0>l{?Ug6O$ zU0=61Z!MZ(KgE#qmWD6G`)M6PWMs(7K5_A^J{vbjxpKaE&Q3-iN{{c>l2MQ8W>4Z5 z@$9+!c)Va5L(N2*x>$WDou+`gQMuKK!1wCREj^RwQchMq$hzZO`Hlfb-OZXbF(-Z7 z8*5j-+Aw*z#ERH8%M)C2%{L)Jb#xCWwIx0ProDIQqGp3UlT-mML31{dM24zq5pl_k z>PP!Qekr@U!FEWBO}Q$U3c{@z3is4W21@+4%j&CfxI;C3MFd?eCd@a!@s#N+LFD}| zovDP1%Z)~5rV-Yf2lm>i60p2Z#t$wOuU_6x^uujLA1~V5Ww;ooG?#|YGX7~T`q^UxMYds;TAO;Sy~MedH1xZKL;#xz!^z@f%r>iivzF@dxo*UQ~*JegG-^bK`U zg+(&m<~Ky?I)l(wY6e%GYqeL_zn)OZN4&9WHnlww?~j}1*Ai;}x)XmH_8o{73`DBt z^!1zzVX)NI)ZLuv!6lb;BWr2EP}ei4G;yHc4yF>6$?HOgFdU8qb9q81zcm%x_@P{>9LZ{* z3*9b4-PF5WTat1ff28Lg%%mzcPoLqXrd`{o0bePjW36zox^bMD>_IT9pzJJ#E8P6EA))no0 zLEYR4Axbb$A-LYpD02H==)fS8wdYWi75v=@dIy0RZz?gq72x{$JCI1>HwAkZK8moy z>x<8L=Vte=VY8Hc|Gi!qH6htS5{`jsUmK}uD5*jLk06At!T$E8yeekupk+HQ{B(G> zf>_)N9~WKeC9%qD4Q9v~|HLOkq%5b~2tQJ*vE-MI_31XLrkXx(<_oY23niKk!Lra& zpBOY74IuT$FV+tT#L_`1D;qiYwLL>L_j#-A?Rwo4(=}CrUJLTHlq{QD_sS^pnL{mF ztb|qftBG#BYcDmOvg|Wf^emXM%!r^l0oi4Ot(t#)H|T?AGTVqom+6dB;gBXf6nc%* z!JKEt?dxJ61fOMAs+%i_5UmuQeRp+k9<}K9kb##*@{QzIX)aU3i*u+9(QD}p_Y-Tc zQnps~Fx7l1Zog2MFBv+D%oecz@Pc3_NCFR`GVrcUIksvBow#bz5x%vx)IgX>xZ54N zt-!pofeuu9ODK8nNadp}?VhsyYSmV}zr8ueAYrL+j{nKU39bl(IaEa0EoRS^fsCh5 z-mIK0A&hseipQ&R-JMm6&dYcpz`-C{Pwg?UAo^(8Q7gb#qSb+e55-xr_&QOv48}(! z$cEjR+mVOEtoMZ!!glUM8QnChOMhYPIyDWZPMF%)u|<`)h@Bq(MVdK%MI{Ll*|!;k z2dqQV8}f2G%8I!|mAJw6Ii~A|40du1LRp%uI11}%PRdkZuyFES zQVYUYVb-KfaY`iT)rC+hO4aJKD!kU3DdfJSV**NDH_Mh+I_@|1+YzfI)^;b1qYTec zM-tO`%wgc_Ou$j!h#@H4*Gw1^6OtG&GpF7kgIA|*zFsUiRGQXRb#ZC=vGk{uuRSXC zo7QyKGd3n?g@s*4+0=GZKWBtyy|cuVq9sGMoJt%ZL7&qFlq3J_)ULSBS;51prYyn* zqeBv((0{Zs7l!YUGM)8evsTLFS-&rZmr}sP4Z+hfzL_5}^j}KVHlYvao0rixX`m zsRFZ8J7XNNXWmVBm#XsD{GZe~l82j{5JD;tbKGVh8cGsb6jWPsF7|_tNgGOc>ZoIi z`-(C&(F$+M6hzFaoASwjp|cepRPSG%EjzI-z`%6}NBR0eEmcJXou8;#vSML`>zsj1 zh=g*4=b4Y4W{H^YOZSiND~@l>w~#*OTNaWqnV zMSetm6S#WwLP*Sg^a1mS#02TNa#fn5*oPUp)FH%)mT{P6hb8A0<+Bysxnd%f!zWR`|TyQ2pz+%ees2_3u+!WvSnoXoDNZn-y_oJ_c@B-OQHAbt!Y7`#Ux zQByK*LT(L@I_nFNFLdthvgYL$Dg5Q4TuFt6WT$g&whvwokuovs$Qx%kQTP%QeiEYS zvg(lB8hk&aoximclYQ`=ByR; zTPNGUpVHq4mz-Q|s|81@O%k2?g3RoH!Jdjjan==hi5GR7? zCQHvFNp`uqe`!VOO&n4mS4_TfAyLk}knJ%dS?DMEg!hNz+H2d4Nujq$#m>ejlVRG@Z2STVe=&Pq$HL1(vPgWz!rGGH z(`++paaxMpNtdGIXZlul+5MSZSM2?T7TlRh7IMy`YT~f)KD74|e6CT6V%6>$i}os>88(k-=gpoTh^c#ZZ~J#RPH{b*XFGo z4Lj8_nth-cJXb!@BlGD2&TyT-WBd!Bc#i1v=8JNk{^(Iv;?M4LT&Z&RVT^o&!JgrL z-)x@4QMUJ!BXk1l3Bd^mUN%$)H>==HDMQKm1s0v6=c$*g{3fqmsH&)~EB{D|#2$XM zy>onTtK5`ippMe_95jn|!@Au$@LXAz7^9}ZnZ|uHq6bXK4s(WSRERI#r=}7x{T4Dk ztks&0yL`Oe7r9OYmc%h=S45vfvLF`h!L8j@4bk;JT*)_uIrM}w-*f7oXK8O8glN8US%3oNT+)> z+rhrKsaQzZt-Glp5;Qkx5XMLDn*{yFOvDk9a8vS*`{mNkx)RfC4+1A<z zEkitkxSOd`JbM&r6W@b`4>{`LD9~+qV(L8&zlY?HP86)7>?!zZ4BRS#sYm(8##2onLxnv=}s%clqlDC;>{#I9|gnzRH2_pJZ>j%qC)Q4mH0! zwwMMBwdvI={U&|Ed*hk&$lk(n?D0{p0;;St86Tx`s0W;4j?)<-7MmP1ySNYi zVq^P$U7^WhE>qxrt^;FM=C!zhq6xQmlKp{-RN)#ctYIDeh<2?4yR>aNf;6)amvWs9 zG|7F{g1{P^rYmvyi`g?xNutl0M7o~~PdwIIIpx)@{BL1JRh66R>6e6bX8!X?bLSI&@&~} zsm*fI2%wq>SxbPAl)YKREeitg#h9c6=9yKB*gFd`;|}Gq_}b+}Pzj%xwrcr>x^(Lk zqcEodV}T?ej+&&@Mz7-Ynih!|7t_=ET{@D6PdWm?UuLRsetSAYzRjvQ?~-SK&UU6)1C;UVr_t=ar&*U{b3|kX!fV#Q zgn8JW`@*;pTJ7sudt&p%jT)u8>u`}q)zr9Ebe~Abglk=?UuPWM!qA&D8JxLtqMr8L zkZd};%G2%-{rt1@)Lhl=5e@BkigcP{ADyJTQ1%rx!#2>LwuqXA<}pPEh;$5nddj6#ZW!{0c)|S|?qj`j`<>)L=K)3y7?2tjRZDv=nlAUvcHK*J2 zi3!R17dkQz!?C1e%aM7+k_~1za_LDnmeyd9F6hKHml@Sm(@Y5~u#4SMQMDZfy!XEtCP!6JrjB{?&1KSj}V(G3bhlcekeL_;Mf<>b;ZZUT{H zhU9xANH4kK=`@u)mF6;1vR0wILfE>;q;)ETxWEdQpxs@iO zl;KXxMog`^bgzZeF`19SBQ6WUo}f@d{Lm?)|0=j z*IKYv5jOEGy3Ce&36ai7=QKPP7x{L96YbODAa`|RL4?bLdlTCFSmA}9t5=@J;J_z7 zzKo9U<*M0NNu9+uOa#&SF%m09XjS+WtFgrc2H|TomyEf$2PTz7<1Y}u7@oSXaBo4| z^zLQ5hNF<0SWmV;!lYMY{2th0V{ znO69XwD$AR1ag?<(~f|OE*_%u`#RIqr}2C(YgbiwPe@OZ^o6qDnEJ@K=2r2Qs?tx) zjXY5-Lb+$uWN=I$u_rH2(9jnznBNzy^YZrG1@%m)uwwweJTq<$fCA|C$0YM`vLq`i zdl3P#7tf6z>oD1@hpzegw6hdGt}C1v6ip&}+@I5^s@8={SZXcJvw^G@z|KP2Lmmh2 z9RIYj%}m#msAo$Jo(yY6qNkE{Z#RKwhS+rVl+`TE&-=g}-$&>~9A+WnfC<-2X z(w@dX_icnF-}15UT<#bG$BaHQ2AxoOB`(+#-AaU6NIF`QC*Hm4EI9mSX)4VFJb9K7 zgo?;NX{_ZejyTR{XYio@8V)mjrA#m(rT*GH2k3s zgAQV}Mf~%S6nJ(W&7hiHmGMl;|{(bVVbD&w^ z_FMZgr&~vNNb&bo%m~81Rm@X^rGw{GzPNdBdlIy)H0}?rw+D1Vi+l3)@lcDaGhK~d z>yw`0)Cmf6Q~joh45a2ue85!`8{4%hl-O~N^se z_s0{6CsnC|)`bpTf7r>08=}(LQLcbRY%IVbV?+n32=?SCGKw+AEJ+po+{B9$^y^PO znR>G{RfaKD{aqYrotrwuCp@~HZm~86i#RXUzusiox-ey4r05~2E#fT!61k0D=>{9< z2%8g?;^1NLgv_UpmP@CiFB9`tziXzn9b(Z^=w!;f=IaBd%RIhYj6&YM{vzM}yXCnf z6uWgUqRLxp8~YKMJw0#2v2?7TOw{gpway$|=6UM;?S{sIQL9qIg}(7k2FLeem%~@- z*ukSH>Rqu+mj|91(-Gx1E$9wvJ@Id0F75Dzehqht5pn|*>fRUJZ@M?y(=}pR9JYxH zQO}?vdKV5NCrYCu6!!_CI8^r%ci?hmr$wGvlxls&5~fIbRQ70H5%e_5+L)=$exxws zkELe-eF5U-kJgPsv`d=D%c85~f`|ehF4d{C8%w3$mwrI^mhG)l7HN^mTyYp_I;mdn zde}K%_B?aj7>SRYAGYly#Rw9pSOk?|6<)-5N@`5fOjufbPZ9}UtK3w1I{HjD;PBa+ zw$j|Lw0E@)#_x0szgSIz)>Fd{* z=;E$b)~96D$#Jl?###H6%@@#2Gk$$%-GUZw7IR$iKU_{OgRi+uF>F-a)<|a%ZJ*P< zw)ENb?a64efXJP<)*?HG@po_Dsi3YJe-b8f8^_M?c6w6x=iDi}fhH&pLu3j%A@OVr z_l9v7)1S?67^aLbO=c*=hI>eylvEZjd6_0AxB=@VK(eL7Ec+WHayn+>8Wk!yIZPge`j zAq5@Kd|HUNW=00{Obl58?cC>?Vkvu&_GxX0y%I)BEkHJKmQ`d!DuXw8zOHC32Q7kI z;-YL_)kEofL&9gbIfk)L+rPas!s76$__oPc@C?A=&j;<*uFf0e?%`|jau+!?FP&Hg zjGbvN;0C4dO(NGq-2>~Qb1#=)F{lFAAdw3kUkl!M9V}}ZX{>$G@44xBB5H7#|Kz$} zDG|9aq^K)7&BYZphYl3DV0o+Mukoc-od;`pD+A)B`G>L+v2vTKqgUX@oBxR?@wJ)MvsCVnP#fmKxG`-aV z-|AbKBvuH^(BeWoo<`-!?VOfx|DaMHb<%gJQ7l30`N_M?8^*VMyI=_0JKkdP*~GhU zkJDy{)~HSjk0Sbn;AIWxciLM!15&sk$SXb$(fI}uF{ym<$`v$w43WaariJe*l_J;2 z`|V!TTT)-q_Cva!`kbrtb-dpVIwb@LIh6F-`$oych;3Dubx=S9mQs%A}F2p=28`lyM6>* zki5Wp->)l|nZVX5_=b)<0O^j8{eoeM=)lLIJcZu?@OP7dDuhI=Osb&5Tk^FVgPkkr z|7>sq!t2X>uwm-MQg=Rf3L|&lU8My}aO;(IC&!sL#%?8{1Ce~Zh>Y1GM^@!6st^N* zA~askny1ca$2EWoVG@=&Ue8XbNfS^p)eyuEg?Ccslw1>i(3_Eh?pVcpB9J60+t(;Y zn)?Mj6XXl4Gs|rRS@Jo>ge z?a^w9(@;5MmBMYt3V)MDX#)J#=csY8`sx9&y>CxRrm<0s>M~ekM_r6Vcg$V^)dbi| zu)Bh}(exQBa^8*e<7l8fbKicujU2YHsicYigZhU=o!cvvPM?m&S!b>KhxHX+u1Gdv zKgnjm$<3rcb-*mBbg$)rC3;a&`)Td<`EQiq{}1sJ0J{NfUqqFR`*moM?AqlA#Gh?x z6uWC3sJ|+AKEixuI7$dR>ecHR1ddFgPmo~NUZR3bpSa7dRHy){xxK4=2Aw2Ry8y}V z(si~TBxr}1xT&n#HlHG^u1*heW_|XG7MJccJ$tl;jSw5tEBO_^&>T}uwVS^7Lpfj3 zjWMKfKr*Km3z~fDL44YFWq6gpNOFrCw~-=_XCi1%WN5L$w$u$YJW2D&a~;iZxi`if zSl!zO5U+-N>dT@x6||Sg)WX%XTND;9(oy$=mI<@Z4Nvl6EcvdO)Xi(W4J=u~o&uVo zmK%aoAY9B(w>@op;xy~Rso;89-j4_+o18o0@$oxYpa#G01!?$j8Dc7_? z7`{+o+E{f5OD{_(r?#`wpQ=~eUlTdAwVE;|M5VHC=S}do8g6-5zAic|ee144Z=yp- zl_TFm$_$C|)R!)H6d;z^voRz}Ku-wB$XgJq$80Z%X4m9wn}!P8eD1{ZPsI(pXE+oP@I%bxn};tA6* zjOIPR&&9&>R{gW*Nj|VSA8ZPV(KozPszAFMibvp-L;EpsPZqWjO~SYDc_(Fja+q|4 zEXKY(a!B`1wk7pa{ri^(S5~ZAuS6pmDY@3}tD__1CFfq}E2+;yOiKCf!@H$LZnoXI z;-d4-`8BF*s)KOyG})$Gwsig+%FvfbzprF4H>EFpsK-!#)OVWdRTvrZ0b{EaqaI)V z%=oiY+|ty{{Yon=V|(X4Ys)LCQxhmNLgeNjZg7r1yW|9x=&@;GmVWUJ7>yP8zw?G6XDkCz%o;trH#pexFPdrE3KBcG<$o;PZGFK zU3zV$BcLI05o&$rfG{Q~y7c!7|)YSBoY?yktCgS?4;(4z6Q{ce=le$uRbkhvgzy^?gCG@!*Tp`le<3 zrDqn1Ix5*dx%>4o+2?|FHWG^Y5aKUjS4o$sYW43N1bM#H_vdr{{K_+T!Y61)>c(>9 zt7D4q@3lXk#j|RheY>-VA1$kx9BCHR&V(cvHtm@Fh$~o~fwR&!n){Bg2aEBXpw7ze z{#9(x6*EME3G+_1|CaVWt46OYV^_B882hZy`zEOi4?o}hu!QdXT76?sZ6&Ak z*g$Vy8cknRy6E87WQU>LodXukVq9&Zu3WL>_=WseMxC~tV`qoM7)6FZuUAS=Twyav z3*I{}JMFTwiqjgwXhnUgHIsOplPpdQv%gG1{GGL-GR~4oozluyV;HgX^ST8l!;e#S zT76+djU4u5oDcUicS7N3{RU0g`NpMR64;)kT^*_;n}=l#$jI%_0t8!9ZA{gZ2~Z!5 zl@cc?UyKwfL?UOM?p{Q6NKJ_{R=d5?Sx9+^QVA(Zzk!ER>8vw~Q&e%rK7Rc*gOkyG z1NPX|JyE)EB4Nr1-23?Cs!cbTHe9upV+qBD>6TnSDcj80>j+J`Cz70Ln!$F2Cz1IM ztW$Q(<1%Tr-8!BLb%_?au@d}Xe$q0;1E+DFse&TERBHFr?%md7OrAp5&92l->O=Q= z7=;yTdr6e#lMB)e{fs@Ly~OS-C&79Ot%7VW!-{^ET-an?+XyS8=qCHg{o zPSJ;8Lxwxm8=v@ii#4Ah@aVq5qlP3TAMEoJr{4_JZ&sdjJG-fVl6yrw_PJf)al1u6>BXl(bN^fbN|{LuseKW zb^XhFG}#x}(=zfH*Dq7@WgR_UfzD;UD8snD1CVYlJX>nUt+V!P$?Juv@ zVx!RxhV5rXC2wt3YS(MHdp%L1KfzD9t1pctQ8Ix_i>ga-aG8&xa~IXg&W%Glo+-aC zJ-ZU!(U)#Sw{;0;tdt-_D_G=tZckVkx@4Ll;^e86EfKE|{x^_r*Kayp#j5B^okj2G zJA^sF$WV(Vix)Ci!G;N+ZQ1-q?{l4G)EsYcR$|X@HbUN8SvRx`(NpFY>9mXw!THNx zjvjM$IE9*0I#7-#-;DS2SnKFb>KaliAQ^yn&g#mVe1WFB z4ymLX!nO61NJOW2#dKuur{{zOCy{SYk_2}n)pG{a1sd+fiXhLBt({UXDusnKbBma7*-U5ClNZjtdl-UMSfiG5m4fAQgm7_jwnrcXr>E&+@u=;*`s>GePO6%wehM*@973dtH;wV{4y?fUl(eHECMYcB^m-H%do5PF5HHGSgE%G@dJZnlk-7hX_7IVd){n|3^ z*YH?zL1Vwq+1_NSF@^r1?!%RX#~TN-84pfLgB8JOk!>mZjR&6>qFvoa`Z3Q~vE_W4tShyuBO}cCe%%Gk#L}@TorB$C8Jk6T0 zyV4#?Fyk&+eB60NpFOw8km$+j6xXQQE~YaO+h_{OtMZv5FIEuesXQ272%U)RTaP9+ zHe51pcqE=ezJ(rfe?LqZ@S4Vxa5r`2RpIAj+)`-y$UdaLo!g@T-eUBMPmq1zs&)2d zzp!H0wyR?3TbWY$*r0zdSzl{mqEYr_$iEz4n=oKP#7ki4`q{zS{iEHRd(WmsSd`}O z2QDuu7}*w>KmdS$Tp{HZr2Oe}bHGPjRK}MJb3CLutYEZH!_o$JE`%@mrL119*8OVqO$mLHdCU7YD?z)6La#W zZ)Hp?x|*7&$MYT9sCUWV=*k8|3AHjBq~f0ysYH&i6RRDMzlnZmFGoO^{aFwd(b*;| zuU*a+D|vHYiRZjx^D9n8yZk1O$c0!7&i?Ce1}2X=c~y461JIiLQOi}4LQ4$aAUcCj z3~(YvrbnahD&7eS+SZkmn}9?y@#5ZVRdyx_&-YFTdzts9OlT{-Te)dUXVt0Qs+T6- z*Az@lMx%499t{j%*J*cvE%-Riy(FL!g-is~=+cc)<4Vq);gl1#NH-W~Sh|yIQgolr zbzX;eFKdhNQuoW7bx&wFvT7PFHfyB!D)QEv9kcAiwoHb5#e()CMK|b>_}J3alBPsW zU2Cr_O`-cE^p67lSd+AJWK0fJb}Rz@lU$ejn}tnhQqbNqX|JU^@^V;BL*7V@yB&jM z*5&#snKWz9p=drotyDouVwpFbiT1=>Al-zV^Qg?a@@Ypc^mVw$%^80KJ-SB0cT+v+ z3?>tk5QC)wu*C&6O1)yXnBau917!-@enIRZp+0?|b_5ko79>|JjP@c&|*&4_iHl~NM1?37qVZT}0ROr_$BH7?SL&1hc8PtA5m<1PhiQmDW=#!Fl zYh(H@J|#zZ?xzbZu^U-mS6y~YIxei_e2!zDJ!Qp5J1pR%RyV^~Z3=Bn&zGw>Ws$GL zg(rhL)wo}WWGz_6-%_93+BtP8ISoA&*dn&xN{AFu`|2YhRuFAy`H7&@C1{q+;su+1 zK@W=oONzdTE`+Goc_JLF9k9IdqSi1|9*OsSP139s+~;~}%U<65esZ(G+n9XZHs}K? zUwJ64aT-%RcceR17&U;a7#>Siu*-IkqW2_-LS*s`F$}W&1m5H{zhD`WFD0Hq-W^M0 zk}TlacD$DocvAqu8My%?4j+{7=#6sB3{bjmF1EFPWv+!fq|0Q8HeUF~$|+CkERv+N z{nci=?3Yzcg198#zE8}310L0szuTB9n>z^Le#+5E@KGG9L!Y9$pcSArDHUFMrm5Ap zc#xa|l1i3ufH1c!Y|3i?GTF{Yai{5C^N>zadM>{`q@q#kQ;}NJ;EIZz_OZ5McG;Z`R=524a z=$rukIPxA`!+=oPnO0gkZi!-JFIwijp{4XzMdi}nYeI6F&FZ)MqVJww!fd{`?OV$Oww<^lHi3F72j$HOl+_Ow)xYBpFooHkwsx+Yd zk>K0MJqr%qohMfMdp<%;EFmeez=DK;s7r^Gq#z;P2vPzr4NL9>eB@_JWU z_)~N+&T^UzNZN_5m;a?>3&>pvRz*?v$QmDq+J2M}#0B0|QzP}X^~`)TD=Z(rg7eXx zjCo$18qus{@UzJ6`%LeTA? zO1+w3aB({Y4pWuxFKH}2;FpCSsKrN5E(+_)EBdngyl^fbcD3=93QEZ>uerZ?gTr`m z7VlNob^@V6V4w7afjVpEo6FOLz0fyn&1(-l9BjQba2T=N+I+^|a$1GT^C(@KewQo6GLf${dBf4*I1)J( znP^8iH&dhF5_Mg*8lX2*Ef{W21zQ8SG8EbJ$VjoC?nU1S zu=sp47irf2HNTi6veD)&N$Lv-Crd#+cX8V>Bl#O?9S*#+nF7c+O^qIm6`enxSE}N9<teBq{gdA)88!z)d8YI&ZsD?9}L^(HNy2+a!5p+>W0vp4X;|y5@v%=cO zQ43b$Rhcz(#H?GD6Q@F(<+4R#QzvG@TM;@a0_P8_PpG}r!#dgwx}|#3A3IzpS=*f9 zVEmF#W$u=ZgB|aKIo@5wk`J%fbnw7K2w~&!7^KY z8hR~bXKE8W3u)a&G(`{k5zb$Q!h`BufRlXw6;2n%?75!f1mG3Xu$rab(+(t44y+X7kf@8A#qfs+~9> z1`zCX9j6*-L4jli-aMd-@kaJ^PbN5zWD4{FXx8?)L`-tdDWzlWDX0SOq{l7&`o509 zQCTTq$@_#6a;wq|rn$lQtvt7#(Ky3X5|_K*_>t5g7n*htT3d}+j)_|jI59hNtbzQa z*~cS`kB`UNf-}uM&3Zg5=8oU0x$W$6-j0EsVwHF0`00xlR`f3|&;@C2hlGM4IGgRy zX9?w#k`UAbI9%mOLC-YejZ+Z0ZP!|)%yZzSzNH{qh=Hf)`^&(P);n|Fv>GhiPjO!* zelz0dP*4=58x}gU?-VwftlfS$wM>1B6y26$JcTWA8Sp1Kh-h23-I6~eB%Cape+9JS zW}|I$QLS7Yf=@ZHR-xsPL7>Nf7?9`7x|Zdm%h+k1PQG<6NV>UAK!;& z_9v=TWA;<%!0QGYaeZKPYk-e5WWew!&4Zs?y|d|Fe1mN5Yph=D{NMm!7GPbs31w!q zqEY^q1R$U-q}DYt*>8qTKhQ@`{3FN1Ry>wu9)HvX`I+PWi|`;$MY%BywpXn47ciq0 zZv8$*ZY~Pem6AP4frnR$om>D<@VUOOHG5CeYXkcGzjt=pE<1B%^CkCaH8eX(c}%14 zNvcagOeH?LX?7PqdY4>z(KbP9ShIhJBvZV^L$+j@za}V{UVDTu*dngbe!fl0n;8ts znxh~!ZJU^kC{Xs|PB$;C)$-karU7&ncdYHaN@o##)vhj(Qn!C6zIgC`YS>!j6PYKP zgZA*yy5?mQrkWFrb$C>zlUURb{6bDTLK-FeBd?qYN6K5Q+w>MFkoT>4cyb_3n{)UM(?wl;k{$C z9eCNwo=quu*uuM{B3;`t&Ic@XXZIs)5>o^zx$DrZx}_BwotjaWl8+C*)s~jtN6u?a zR-!_r%|hGs=^jP-1ar))VCXlimY&0vb~N~!Zb+BS=>TWon6dx#tUEkU`%%hY4b zoi><^H~;w6wt8dkgWuc53NOFj!<6Dyb$V9Yc-zK=FY>DN`3lb-qFuZmJVEQ%73#98R=}^3cfg3#qqZf%)Fm4 z7E*N&+LS~pdWt9A&Xtt>!|}BMcP|zFQ{bB5*$KDooq~6t{Pz#LcpEZ_q~T;Ss8Nc7 zniSHj#DkNzIgijCQF6BKP?eIbLxpmQwNZ6?Z@F6`0z$QeA=|j=aOq1Rs?&J+)!&}(Fn`)TB3FDCzPaT@IHlH0R7GHhmg@bB);SwME{`~f%4m`dkp;nel zW^O-z|N5wWn$~S%?$v%e5Bt+^x$5GC!ihB+=5UT2!1RwBK^7gk{C*oN9x1cgoa2gU zVHk&zT14%oEaB1BK5CtnB&z%-FPWW~3l`p$Pj&;_*{=_5W0~-JQg&X>@Rg{}M@geR zyVxZYq)BEN1AHWDg#s+4LRwqBHAw2TNz=e74zh!G}Q(%a53Dd1Wq&W5opEOE^MxCI`tEqcle8*FA=R zS3{3j){l)01hn3f(Nb`#PJwezfa1SiTv&HtllRu-h zHej{$*gj6lH2=d9p};1?oy$L7MB+XEls@7P_H13K+KXGwoZsXv6Q!2G*?Zt2-~V0q zUZ>D)HR%Wguu~t5m2b0JC~Del2+wb6q+x+Ppai<)bB3*KGp5KqthTWS@?TB&X z6`S!Ir1MEWWBJJ!{jn3j7zl{9tiShec29xBhx`p(54DONY6z6c4R8M>P^>g@$+>O?Iva(Iaqh5w% zYq#=Yg1Tse{`R6yDf)FRLOa0P5l8F@y@eJggBrtGdSZtF&q(*OK=%pXPSxlM*?Q`N*=&e7St$({NZH`nE+ z%db6Ua-`iJACr}&Yv`<=fUc4#lRXp9ytu~Du8Z~bXN^11wb8Eynti)7Zdx-_m8;cn zHcw$6Orxff;nc|eBD-l;rF~+0-34?R=SRkKTXJ&t97G%!8N=@i%uQjN%QcaF+<}CW z8xrzS?8QH(w-TAS%tQu8@=@5nYZJqDTQW#yR-F#3btm?MktBvmaF`m=xSNKlWx#C? z(n%-iSGgmFQVrNNBo$VAUB&9~kPA_sT^zB^>+MXT)Wj1b$n^A>lXwY=ueuCUoL^KslJ13oIvdHd(khE% zh%%xLh>2~F)eCF5%Rm0KE{;0S-}cf|%K0rk=SCq^d9-f_0(~SWtLzhW>Z;#gEg!d| z@?*u%_Ry$zb!M>W=pCuHv`o%DajX3yVchgH zSY~^ZBollT3@twQnDAZV{iwN(w7)m=Gl0=+i^Dxk4AEzaU4-EG>0ci4+mOb!BW{9m zD;G+S4=|EA#=jzNF37^RdK5|fh4F<6DGq8G@;wc$LgLAsJ;$sa!Oc>VvME&eOjW|K zFL6`#?cGusvH;Ew7J4$Ls2Z7%7mff)wWq)>(2D$BVK6fx5B|Ikr!u1Xp7d&ez%e5j{3ZSQAMHSBj(y8&Sb% ze#>)?QLRg*52|Kr#8GADv`{|W(0gX>C|+4HhWhZK!{xApPoer*!dSh_WqGA+`dTPS z?}lBA!Lj`!X^)`%)2^s6F~v)KS11VNZ1m`ACy zYi8QljLDn<-8R`M=PAOX=A3xS%esA$4!t30@SXdC;rImDvhC`{#hVA6RXG_c-rMbK z8v14Ww@G{gr*ltO^0gVLXT_ooq<7o%#}*sS!laA&LOOdsms!3&7c_W)Ms5;%IEF)g z#}?og&$>Ag2OmE%Cm(W0+GkLm$I@TRlqIP*`KP;WY|@4#(!||YrGb3acv=^UW!k}osNIOVL<)RYJx1Q#w#|IJ24G$aEqp%asIhJatWB=2+S&RS2)y%Rc z8a%0T9QAT%k00RY9JkNVl65^}G?vVfkY9tx7D3N?0{Te}ZV?jOO$LT>_~-+F=~frj ztG9H*Ja=B|Rs3U^qh=2#gB^{Sx73ya%k>9n+y~vj@rh1soBvDzD7(Sy9S*T~(XT!W zC+DcVm+_PodhT08KctMNuDQyKcySbYo!RmHv>`dE^i$DlB*Dr!>nAaQC=L26hS>Wb ziCsuO(G*>)+SmC2*mJ$7S$FyMy7)#srkQy~tH)(i-d3z@QYZ@(eSb%lwNSEmy>Ai$ z4b7Cx!}eF?=urplMU@xnjJA)?V}k&zdoM+6-`$-Nh8rF0$yK6G@zcDBZAqoXPlh1w zP(0>xtmowrb}~Pz^e{e8iy{RnUu|uQs$6d2d_Rp|?1##B*S^Qg>|vS@5jpv}L6M;v z5MWdyHlVTO38xKe?Q3BmW`rs4E|Rp~6^?n5#lz7Ri%KO_JGgTNtykRV7fq~P08Cz{!q zTyS%CB8X5nu58s~v0fG)cTbbM`7+i$U_5d1^oVQU?R#HU&Cf5mWdO4}t!QUf*`&w| z;VxBHy0?udsA#iw9WdSk0f9f}=6L{&?7rUvNeO_<#8uTwLNt-Id2f6_YLK(6mu)`p zuDRlNPWKZL!83b(s&j@E{PL5t+$da@8X8vem<4&JdY(zPgB2T)Lr0NO{%>YbWBjyo z1ylmB8TgB9J5lRAEUYHiNTt8XGuGRfIr0W;r(_E_e_a~wiHkD$^oW};6+5PGur^YQ zL1jdqbO7%YSIlnsAVTR@%#+%C99MtVcArCOP0UK3WB_x{fzhoU|6~ah;kKvF|bWb>|-U$G`poR<~n9>O5gYW zZg#KylOvglIuw&EmCjW@&tA@pUIz6jghv4=FxfBSf?tolFnGy?-S%qj(FiQ6#Yw6l zcwogI|F()nPtonYFz`-m_>ABpqKe2d8`+i?kzR(jp+s8J7B_?&_rri!0PhEP|B_sBb^z_FBRy`0g;11i?725r% zc`oKPgPpSDqc2KV-`n}%{QRN=*z~vpukquS{GxwK+7`PY-q)i6TeyaDh@AWS>vxyARM|l2(#SX8BMhZ|TS7%eIsL z>MwLZP<7tw`K4V4{eHCo?1PC*EVM`|sZP?biZsh+@5eGh%&26XsJ!?%7eH&hp&@Qo zDJl|9I*eEEdVQ)|$-drvBoIbcU>h|x>eND=t)WbpIb{ZMos zI%084Qsm6*WgG~|0_neKW?yV4xx~#$yj2QgBVG}KG0w*qH?gKN-KOH{4>4YEo0ON} zw71v>&^s(9FPq|gV)7kbOG|DM{vA_$QZ;hiR=@Uvu?b`^qW);k@Je5h;TMWfO_;~6 zxF3(N{1@A}dHLK2{Dlqwh(;;rq&SGL|}Y;5Qim%X}Z-;C{=#jBmHNftxy1qFYp2%arLxwK;26| zerGeIJaOO^*VlR^4zUHpJxLjtBp!v@sF#P4MLvN2Y8J0U#AIiKveN$oM(_8(IV zp6hZ|M(}H7FPTryNWll&`W|Yp&U50m2GYLo?-0+g@g(d%;Dm=g1FFNs>bYJoP#5~I zC)}&D3ucl|uSwpE%${QiAad3pc)hSk(7F&tC>-S~&nr=UVi>KdxDaV9P*K1l63@F* zdhK8J*`Na`>YF(nx`aPUsw(2P+O16qHFm>A-B)p0V#tY%_E`dzt!F=Ct7ln zoiW2&OCDpX zl$Q4E(*~qb)yI<#9I+C3`e$>)7M$k%_^P6kPGZcNUFtH(NtZ6-<3H;JbOw0;yuN&@ zd|*OE!uU9k6KRiH`T2VoouGa5B+&~sNgBb7Dp;|Z<>EO*ry_RD0E54ESqiAsYi9sF^OPyYEgsQntS6@MY(v0OSp*SYn5O7IT z^=cbZnxe+5P(}6ra9UjCeBtzw`;K!tj4Xx9(R5ZHjiA&P#rgg!Od=c6vi?YPs-c!O zhQ2PMO5ME7x5`%#6F;c;5I*%89!<+pjiD^JkiO+Yw?C;xF3*m_!F z1oyQv8QsHI2QP`E;7G(x_9$%Nll?+J#!hNB8gcLblkgOCu|)XlTj!ew9gz)YaHK=3 z7y>$GD-h$zhgNy%e%F~C(n~Wn28Y3G%wvJ#H|Bjy+V3P&TUddXqSW>ZPs|5^HPFxG zUpsrrERLuN2#popBiS)sXa2Bv-0`m^SQl3ulEN@xS2~C`V4u9BeGS=}yXJUh<&i6h ze+Luebc}IZz{4>V>Le%33G>}$0=kM(Qi0PyC-qTb^|y~1szJt=w2_#4rqLdMvZRIp z`c#)FFZ+tq%%cr$zrToIIxJha)uGmlbIEOkPzfcR{pqu}a+X&S19J@Ww( zrc2VQa#r6b9F$4ZN_zkvb*z4%Uuyv$B;#l9q3>tNbNOdT6)YRIoZ<;KQA%Nk3RF;@ zn2VI1-uHebaI%kGk@2u&)e!CUm#5RVdK;Y3+&%uuj)4@Gb-}URr>SCpge22R7Lvow zm?maW=?yWB?i7#HqZ{K~h|1OX)kWfWTDK1JXBP!BRE=Wbvq`8kftcwR2881#KrXB2 z^8Kgxdx>W@#-35eNYv_-rxbok0e>h`&a^*{Y96t?-2IR6EgCJXqMtJCR`77T9AQj* zkJIG=b%0#0s;PTJ=wY`hDEy~sigxE`N>MF&ia;qmrELh2*;f~iuRh6Qu5ppLp=rmc zxq2(0_#WG;iBSUMnm1iN=-cqOA<9eX`3+{M^8;&ja)WvNVpc3$ksemb9Ev4RBcnpc zdow4mrd&)-PU$#39mMJ$5MzSHnD4oVAF98MeqoD3OQ-Oz*)4}y@4h0fuAkF9T*mD; zdgFW+TdvLjNA7f(PPd$Tri_d9jT}!k8^Uwg;6{&n z7~PfReQF!Ar@+7#$AYf0EVN+i19tR@3@UU-&?pR!TK_|MKo7Z;({?CmXZZ_;!`W{ZmRBe|>wgYV*ej3o%LW>r52Kez5+{Vz*#}r;1IljZkT&`{PPF5#*H27Q1?Mlnglj*(5 z;0a4-T6$xrQ1#%P7X7)M?ynEV!H{E9>1Ihm+;CpHofbsKR%R%Ez?jTf>FN{{?0o-H z^=P5x-GqVqAxAHo!?W~@_)%TUQgQm2>F)waKFrMG(Vsrq<6uUgw<)G_h9d zS4-GRWi(2MgE2uRMqf`7A3(@uFv9E*nOvI$i!ADxc86eK;C}gYM?hkT4z+l@rEi_Z6f1r&uxY2GbIa6SljO`N#5@ zfm*if@^ESn+|YPs9wNVKFSN{6N&Cx(JWJDcHQU#uV(h$`J5_+-_d7hb-n?&66b-hm z7V%K^qxX6@w>Z7nEc{khIOgdx^=R3DGo|FE;fh~%L7F!Wa<)z5Ucz~Mw@(vQuBBTL zel2AybJ4889J2A(n}iK8Z%L>@HMd<>!38-jgq~}_?z8KTN8%~x!%l;VL`1uK)|D6&6|7?b}nxRcEJeEjGTcD3+ zt!iUHD7W)^xCmUlTZaBlVB%{`ic8+J2b!oiZYhEj7FHGl2mO0nG!FHk73?IEiTyl5 zZ)~v`X*A*ruBi2cScqH`031K4?16rbNLrycPgaOYN9et^K7H$c4qtasr7Dd^j(fQm zUMjJ+C9YzyH`J67KLb{kPT+s|Y9#xqNA=!VNqEw!A&h?4;~yHtU*e=hmBqdTw3}Oa zVlJI!Cq?vBezEG)KlF@0mVP57fC~#~w=2_({G}3U$TcXTXD-B&IpWJWdT;tKkK@nA z@es4!!ITor!|cVQhiGbLPFei;{lA2eKU5F2$+uTuDCj%t+k2{qD_0V2(FeyaD6 z@{*DNwKL|$7txP5WF#}j>GR>CyOJInm4hRo%(ePc|1vYj&&Kb#2IeN}j3ht!CWS2WQe18w6k7Wq zZ~yc3AJ?e?fQx4MN-9q0?NdS509Cs>?Q;fWKq`^8YB%G~rzOa7 zILfZysi8F);CWj<^HJB5hj_g@(S7pxHE7;g^=`^p@ zNnZxtgU5CKSH%7Q$L9+vU(E(#`Ol0ei62epZ7~dH{x_Oh@qJrUSc2kl;Amb04bjZs zEaD%J9Dq3YA9M-6k)6|TZ~ql`smrB@_k-RuL*)M){u|(ok1;EDx6wKMVo*-mX0gEL zGZ(^tSuDRYe(k=|VqogJjpT9Eu#NfGJ44_%s>*1Q(>Pd;6mVocQk zd$GblFUPnGa9(+NrTsMaW=ZwZ&Qv@$sv_-QZJ;Gm{b)SOvF7y!<*9(t#(q(!$RRK(aOJiPdGuf+c}qWT!? zk2-{Gv@*+CWTX10=xiIo*Y_XBipYGLDkPd_FTKmewR@~PeDXifpc{}Nz}Hy0`dqQP z7M-F{%KnEu*t-f!h_uy(rk4(mvg9eeiM*CR>{rlcY#7!SIlg0XDmKFxH*Q1Y)-W*S MW!^}aN*eqBKjGKi`~Uy| literal 0 HcmV?d00001 From 9e876bc7e4ce9c0282b5e5da42caf0928057f39c Mon Sep 17 00:00:00 2001 From: Chase Duffman <74204097+xXxT0SHIIIxXx@users.noreply.github.com> Date: Sun, 7 May 2023 10:09:35 -0400 Subject: [PATCH 200/231] Update README.md Added Logos for light mode and dark mode --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 2facccc..e7f51b0 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ -# ![Unity Library](https://i.imgur.com/btbDvqv.png) - -:tada: Welcome to Unity Library :tada: +# ![Unity Library](https://raw.githubusercontent.com/xXxT0SHIIIxXx/UnityLibrary/master/Logos/Unity_Library_White.png#gh-dark-mode-only) +# ![Unity Library](https://raw.githubusercontent.com/xXxT0SHIIIxXx/UnityLibrary/master/Logos/Unity_Library_Black.png#gh-light-mode-only) +:tada: Welcome to Unity Library :tada: Useful scripts, snippets and shaders here it is gathered for free. From 3088d763e2446029ad68119f1eb516d943cd3625 Mon Sep 17 00:00:00 2001 From: Shubham Kumar <96144990+KatyaanShubham@users.noreply.github.com> Date: Sun, 16 Jul 2023 19:20:28 +0530 Subject: [PATCH 201/231] Update Glow.shader Explanation of changes: 1. Indentation: The entire code block inside Shader "Custom/Glow" is indented one level for better readability. 2. Spacing: Added proper spacing between the curly braces {} for clarity. --- Assets/Shaders/2D/Effects/Glow.shader | 94 ++------------------------- 1 file changed, 4 insertions(+), 90 deletions(-) diff --git a/Assets/Shaders/2D/Effects/Glow.shader b/Assets/Shaders/2D/Effects/Glow.shader index 775b7d2..97da796 100644 --- a/Assets/Shaders/2D/Effects/Glow.shader +++ b/Assets/Shaders/2D/Effects/Glow.shader @@ -1,117 +1,31 @@ -Shader "Custom/Glow" { - - - +@@ -1,117 +1,30 @@ +Shader "Custom/Glow" { Properties { - - - _Color ("Color", Color) = (1,1,1,1) - - - } - - SubShader { - - - Tags { "RenderType"="Transparent" } - - - LOD 200 - - - ZTest Always - - - Cull Off - - - - - - - - - - CGPROGRAM - - - #pragma surface surf Lambert decal:add - - - - - - float4 _Color; - - - - - - struct Input { - - - float3 viewDir; - - - float3 worldNormal; - - - }; - - - - - - void surf (Input IN, inout SurfaceOutput o) { - - - - o.Alpha = _Color.a * pow(abs(dot(normalize(IN.viewDir), - - - - normalize(IN.worldNormal))),4.0); - - - + o.Alpha = _Color.a * pow(abs(dot(normalize(IN.viewDir), normalize(IN.worldNormal))), 4.0); o.Emission = _Color.rgb * o.Alpha; - - - } - - - ENDCG - - - - } - - + } FallBack "Diffuse" - - - } From dda79f9892ef3668a5b2d19b3f416491f1e53c3e Mon Sep 17 00:00:00 2001 From: Shubham Kumar <96144990+KatyaanShubham@users.noreply.github.com> Date: Sun, 16 Jul 2023 19:25:50 +0530 Subject: [PATCH 202/231] Update AssetBundleLoader.cs Explanation of changes: 1. Added using UnityEngine.Networking; to import the required namespace. 2. Created a bundleName variable to specify the name of the asset bundle you are loading. Adjust it according to your asset bundle's name. 3. Added Caching.ClearOtherCachedVersions(bundleName, Hash128.Parse("0")); before starting the download. This line clears the cache for previous versions of the asset bundle with the specified name. --- .../Scripts/AssetBundles/AssetBundleLoader.cs | 76 +++++-------------- 1 file changed, 21 insertions(+), 55 deletions(-) diff --git a/Assets/Scripts/AssetBundles/AssetBundleLoader.cs b/Assets/Scripts/AssetBundles/AssetBundleLoader.cs index d31ae28..db53c54 100644 --- a/Assets/Scripts/AssetBundles/AssetBundleLoader.cs +++ b/Assets/Scripts/AssetBundles/AssetBundleLoader.cs @@ -2,47 +2,34 @@ using UnityEngine; using UnityEngine.Networking; -// AssetBundle cache checker & loader with caching -// worsk by loading .manifest file from server and parsing hash string from it - namespace UnityLibrary { public class AssetBundleLoader : MonoBehaviour { public string assetBundleURL = "http://localhost/bundle"; + private string bundleName = "bundle"; void Start() { - //StartCoroutine(DownloadAndCache(assetBundleURL)); + StartCoroutine(DownloadAndCache(assetBundleURL)); } - /// - /// load assetbundle manifest, check hash, load actual bundle with hash parameter to use caching - /// instantiate gameobject - /// - /// full url to assetbundle file - /// optional parameter to access specific asset from assetbundle - /// IEnumerator DownloadAndCache(string bundleURL, string assetName = "") { - // Wait for the Caching system to be ready while (!Caching.ready) { yield return null; } - // if you want to always load from server, can clear cache first - // Caching.CleanCache(); + // Clear cache for previous versions of the asset bundle + Caching.ClearOtherCachedVersions(bundleName, Hash128.Parse("0")); - // get current bundle hash from server, random value added to avoid caching UnityWebRequest www = UnityWebRequest.Get(bundleURL + ".manifest?r=" + (Random.value * 9999999)); - Debug.Log("Loading manifest:" + bundleURL + ".manifest"); + Debug.Log("Loading manifest: " + bundleURL + ".manifest"); - // wait for load to finish - yield return www.Send(); + yield return www.SendWebRequest(); - // if received error, exit - if (www.isNetworkError == true) + if (www.isNetworkError) { Debug.LogError("www error: " + www.error); www.Dispose(); @@ -50,43 +37,38 @@ IEnumerator DownloadAndCache(string bundleURL, string assetName = "") yield break; } - // create empty hash string - Hash128 hashString = (default(Hash128));// new Hash128(0, 0, 0, 0); + Hash128 hashString = default(Hash128); - // check if received data contains 'ManifestFileVersion' if (www.downloadHandler.text.Contains("ManifestFileVersion")) { - // extract hash string from the received data, TODO should add some error checking here var hashRow = www.downloadHandler.text.ToString().Split("\n".ToCharArray())[5]; hashString = Hash128.Parse(hashRow.Split(':')[1].Trim()); - if (hashString.isValid == true) + if (hashString.isValid) { - // we can check if there is cached version or not - if (Caching.IsVersionCached(bundleURL, hashString) == true) + if (Caching.IsVersionCached(bundleURL, hashString)) { Debug.Log("Bundle with this hash is already cached!"); - } else + } + else { - Debug.Log("No cached version founded for this hash.."); + Debug.Log("No cached version found for this hash.."); } - } else + } + else { - // invalid loaded hash, just try loading latest bundle - Debug.LogError("Invalid hash:" + hashString); + Debug.LogError("Invalid hash: " + hashString); yield break; } - - } else + } + else { Debug.LogError("Manifest doesn't contain string 'ManifestFileVersion': " + bundleURL + ".manifest"); yield break; } - // now download the actual bundle, with hashString parameter it uses cached version if available www = UnityWebRequestAssetBundle.GetAssetBundle(bundleURL + "?r=" + (Random.value * 9999999), hashString, 0); - // wait for load to finish yield return www.SendWebRequest(); if (www.error != null) @@ -97,42 +79,26 @@ IEnumerator DownloadAndCache(string bundleURL, string assetName = "") yield break; } - // get bundle from downloadhandler AssetBundle bundle = ((DownloadHandlerAssetBundle)www.downloadHandler).assetBundle; - GameObject bundlePrefab = null; - // if no asset name is given, take the first/main asset if (assetName == "") { bundlePrefab = (GameObject)bundle.LoadAsset(bundle.GetAllAssetNames()[0]); - } else - { // use asset name to access inside bundle + } + else + { bundlePrefab = (GameObject)bundle.LoadAsset(assetName); } - // if we got something out if (bundlePrefab != null) { - - // instantiate at 0,0,0 and without rotation Instantiate(bundlePrefab, Vector3.zero, Quaternion.identity); - - /* - // fix pink shaders, NOTE: not always needed.. - foreach (Renderer r in go.GetComponentsInChildren(includeInactive: true)) - { - // FIXME: creates multiple materials, not good - var material = Shader.Find(r.material.shader.name); - r.material.shader = null; - r.material.shader = material; - }*/ } www.Dispose(); www = null; - // try to cleanup memory Resources.UnloadUnusedAssets(); bundle.Unload(false); bundle = null; From d2ee8cfde0a18206086ca7917700fca25b163ca3 Mon Sep 17 00:00:00 2001 From: mika Date: Thu, 19 Oct 2023 09:14:56 +0300 Subject: [PATCH 203/231] Create Diffuse (2 Sided Light).shader --- .../2D/Sprites/Diffuse (2 Sided Light).shader | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 Assets/Shaders/2D/Sprites/Diffuse (2 Sided Light).shader diff --git a/Assets/Shaders/2D/Sprites/Diffuse (2 Sided Light).shader b/Assets/Shaders/2D/Sprites/Diffuse (2 Sided Light).shader new file mode 100644 index 0000000..cf47668 --- /dev/null +++ b/Assets/Shaders/2D/Sprites/Diffuse (2 Sided Light).shader @@ -0,0 +1,79 @@ +// Unity built-in shader source. Copyright (c) 2016 Unity Technologies. MIT license (see license.txt) +// lights up sprites from both sides + +Shader "Sprites/Diffuse (2 Sided Light)" +{ + Properties + { + [PerRendererData] _MainTex("Sprite Texture", 2D) = "white" {} + _Color("Tint", Color) = (1,1,1,1) + [MaterialToggle] PixelSnap("Pixel snap", Float) = 0 + [HideInInspector] _RendererColor("RendererColor", Color) = (1,1,1,1) + [HideInInspector] _Flip("Flip", Vector) = (1,1,1,1) + [PerRendererData] _AlphaTex("External Alpha", 2D) = "white" {} + [PerRendererData] _EnableExternalAlpha("Enable External Alpha", Float) = 0 + } + + SubShader + { + Tags + { + "Queue" = "Transparent" + "IgnoreProjector" = "True" + "RenderType" = "Transparent" + "PreviewType" = "Plane" + "CanUseSpriteAtlas" = "True" + } + + Cull Off + Lighting Off + ZWrite Off + Blend One OneMinusSrcAlpha + + CGPROGRAM + //#pragma surface surf Lambert vertex:vert nofog nolightmap nodynlightmap keepalpha noinstancing + #pragma surface surf TwoSidedLambert vertex:vert nofog nolightmap nodynlightmap keepalpha noinstancing + #pragma multi_compile_local _ PIXELSNAP_ON + #pragma multi_compile _ ETC1_EXTERNAL_ALPHA + #include "UnitySprites.cginc" + + struct Input + { + float2 uv_MainTex; + fixed4 color; + }; + + // added "abs" 2 sided lighting + half4 LightingTwoSidedLambert(SurfaceOutput s, half3 lightDir, half atten) { + half NdotL = abs(dot(s.Normal, lightDir)); + half4 c; + c.rgb = s.Albedo * _LightColor0.rgb * (NdotL * atten); + c.a = s.Alpha; + return c; + } + + void vert(inout appdata_full v, out Input o) + { + v.vertex = UnityFlipSprite(v.vertex, _Flip); + + #if defined(PIXELSNAP_ON) + v.vertex = UnityPixelSnap(v.vertex); + #endif + + //v.normal.z *= -1; + + UNITY_INITIALIZE_OUTPUT(Input, o); + o.color = v.color * _Color * _RendererColor; + } + + void surf(Input IN, inout SurfaceOutput o) + { + fixed4 c = SampleSpriteTexture(IN.uv_MainTex) * IN.color; + o.Albedo = c.rgb * c.a; + o.Alpha = c.a; + } + ENDCG + } + + Fallback "Transparent/VertexLit" +} From 329f7d8f2bb8306b5df409f5ab03d1cd44595455 Mon Sep 17 00:00:00 2001 From: mika Date: Fri, 17 May 2024 11:35:26 +0300 Subject: [PATCH 204/231] Add editor tool to replace string in selected gameobject names --- .../ReplaceCharacterInGameObjectNames.cs | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 Assets/Scripts/Editor/BatchTools/ReplaceCharacterInGameObjectNames.cs diff --git a/Assets/Scripts/Editor/BatchTools/ReplaceCharacterInGameObjectNames.cs b/Assets/Scripts/Editor/BatchTools/ReplaceCharacterInGameObjectNames.cs new file mode 100644 index 0000000..105bc74 --- /dev/null +++ b/Assets/Scripts/Editor/BatchTools/ReplaceCharacterInGameObjectNames.cs @@ -0,0 +1,69 @@ +// editor tool to replace string from selected GameObject names + +using UnityEngine; +using UnityEditor; +using UnityEditor.SceneManagement; + +namespace UnityLibrary.Tools +{ + public class ReplaceCharacterInGameObjectNames : EditorWindow + { + private string searchString = "|"; + private string replaceString = "@"; + + [MenuItem("Tools/Replace Characters in GameObject Names")] + public static void ShowWindow() + { + GetWindow("Replace Characters"); + } + + private void OnGUI() + { + GUILayout.Label("Replace Characters in Selected GameObject Names", EditorStyles.boldLabel); + + searchString = EditorGUILayout.TextField("Search String", searchString); + replaceString = EditorGUILayout.TextField("Replace String", replaceString); + + int selectedObjectCount = Selection.gameObjects.Length; + GUILayout.Label($"Selected GameObjects: {selectedObjectCount}", EditorStyles.label); + + if (GUILayout.Button("Replace")) + { + ReplaceCharacters(); + } + } + + private void ReplaceCharacters() + { + GameObject[] selectedObjects = Selection.gameObjects; + + if (selectedObjects.Length == 0) + { + Debug.LogWarning("No GameObjects selected."); + return; + } + + // Start a new undo group + Undo.IncrementCurrentGroup(); + Undo.SetCurrentGroupName("Replace Character in GameObject Names"); + int undoGroup = Undo.GetCurrentGroup(); + + foreach (GameObject obj in selectedObjects) + { + if (obj.name.Contains(searchString)) + { + Undo.RecordObject(obj, "Replace Character in GameObject Name"); + obj.name = obj.name.Replace(searchString, replaceString); + EditorUtility.SetDirty(obj); + } + } + + // End the undo group + Undo.CollapseUndoOperations(undoGroup); + + EditorSceneManager.MarkSceneDirty(EditorSceneManager.GetActiveScene()); + + Debug.Log($"Replaced '{searchString}' with '{replaceString}' in the names of selected GameObjects."); + } + } +} From 2296f02dabe31b8d5a1491308c82e9f13c761010 Mon Sep 17 00:00:00 2001 From: mika Date: Fri, 17 May 2024 11:55:08 +0300 Subject: [PATCH 205/231] add editor tool to copy selected gameobject names to clipboard as a list --- .../Editor/BatchTools/CopyGameObjectNames.cs | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 Assets/Scripts/Editor/BatchTools/CopyGameObjectNames.cs diff --git a/Assets/Scripts/Editor/BatchTools/CopyGameObjectNames.cs b/Assets/Scripts/Editor/BatchTools/CopyGameObjectNames.cs new file mode 100644 index 0000000..de28cd4 --- /dev/null +++ b/Assets/Scripts/Editor/BatchTools/CopyGameObjectNames.cs @@ -0,0 +1,55 @@ +// editor tool to copy names of selected GameObjects to clipboard as a list (so you can paste them in Excel or others..) + +using UnityEngine; +using UnityEditor; +using System.Text; +namespace UnityLibrary.Tools +{ + public class CopyGameObjectNames : EditorWindow + { + private string gameObjectNames = string.Empty; + + [MenuItem("Tools/Copy GameObject Names")] + public static void ShowWindow() + { + GetWindow("Copy GameObject Names"); + } + + private void OnGUI() + { + GUILayout.Label("Copy Names of Selected GameObjects", EditorStyles.boldLabel); + + if (GUILayout.Button("Fetch Names")) + { + FetchNames(); + } + + GUILayout.Label("GameObject Names:", EditorStyles.label); + gameObjectNames = EditorGUILayout.TextArea(gameObjectNames, GUILayout.Height(200)); + + if (GUILayout.Button("Copy to Clipboard")) + { + CopyToClipboard(); + } + } + + private void FetchNames() + { + StringBuilder sb = new StringBuilder(); + GameObject[] selectedObjects = Selection.gameObjects; + + foreach (GameObject obj in selectedObjects) + { + sb.AppendLine(obj.name); + } + + gameObjectNames = sb.ToString(); + } + + private void CopyToClipboard() + { + EditorGUIUtility.systemCopyBuffer = gameObjectNames; + Debug.Log("GameObject names copied to clipboard."); + } + } +} \ No newline at end of file From a39816f5b4a5a2a9d305ec13ac3aef017d49c9b9 Mon Sep 17 00:00:00 2001 From: mika Date: Fri, 17 May 2024 12:21:40 +0300 Subject: [PATCH 206/231] Fix CopyGameObjectNames.cs to copy in correct hierarchy order --- Assets/Scripts/Editor/BatchTools/CopyGameObjectNames.cs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Assets/Scripts/Editor/BatchTools/CopyGameObjectNames.cs b/Assets/Scripts/Editor/BatchTools/CopyGameObjectNames.cs index de28cd4..40bf0d0 100644 --- a/Assets/Scripts/Editor/BatchTools/CopyGameObjectNames.cs +++ b/Assets/Scripts/Editor/BatchTools/CopyGameObjectNames.cs @@ -3,6 +3,7 @@ using UnityEngine; using UnityEditor; using System.Text; +using System.Linq; namespace UnityLibrary.Tools { public class CopyGameObjectNames : EditorWindow @@ -38,7 +39,10 @@ private void FetchNames() StringBuilder sb = new StringBuilder(); GameObject[] selectedObjects = Selection.gameObjects; - foreach (GameObject obj in selectedObjects) + // Sort the selected objects by their sibling index + var sortedObjects = selectedObjects.OrderBy(go => go.transform.GetSiblingIndex()).ToArray(); + + foreach (GameObject obj in sortedObjects) { sb.AppendLine(obj.name); } @@ -52,4 +56,4 @@ private void CopyToClipboard() Debug.Log("GameObject names copied to clipboard."); } } -} \ No newline at end of file +} From f13f9beb250f96c99661b967b4fce3e92ccc8949 Mon Sep 17 00:00:00 2001 From: mika Date: Tue, 6 Aug 2024 13:17:11 +0300 Subject: [PATCH 207/231] Create RendererTypeCounter.cs --- .../Editor/Tools/RendererTypeCounter.cs | 108 ++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 Assets/Scripts/Editor/Tools/RendererTypeCounter.cs diff --git a/Assets/Scripts/Editor/Tools/RendererTypeCounter.cs b/Assets/Scripts/Editor/Tools/RendererTypeCounter.cs new file mode 100644 index 0000000..0cc0ce2 --- /dev/null +++ b/Assets/Scripts/Editor/Tools/RendererTypeCounter.cs @@ -0,0 +1,108 @@ +// shows renderer stats from selected objects in the editor + +using UnityEngine; +using UnityEditor; + +namespace UnityLibrary +{ + public class RendererTypeCounter : EditorWindow + { + private int activeMeshRendererCount; + private int inactiveMeshRendererCount; + private int activeSkinnedMeshRendererCount; + private int inactiveSkinnedMeshRendererCount; + private int activeSpriteRendererCount; + private int inactiveSpriteRendererCount; + private int totalGameObjectCount; + + [MenuItem("Tools/Renderer Type Counter")] + public static void ShowWindow() + { + GetWindow("Renderer Type Counter"); + } + + private void OnGUI() + { + if (GUILayout.Button("Count Renderers")) + { + CountRenderersInSelection(); + } + + GUILayout.Space(10); + + GUILayout.Label("Active Mesh Renderers: " + activeMeshRendererCount); + GUILayout.Label("Inactive Mesh Renderers: " + inactiveMeshRendererCount); + GUILayout.Label("Active Skinned Mesh Renderers: " + activeSkinnedMeshRendererCount); + GUILayout.Label("Inactive Skinned Mesh Renderers: " + inactiveSkinnedMeshRendererCount); + GUILayout.Label("Active Sprite Renderers: " + activeSpriteRendererCount); + GUILayout.Label("Inactive Sprite Renderers: " + inactiveSpriteRendererCount); + GUILayout.Label("Total GameObjects: " + totalGameObjectCount); + } + + private void CountRenderersInSelection() + { + activeMeshRendererCount = 0; + inactiveMeshRendererCount = 0; + activeSkinnedMeshRendererCount = 0; + inactiveSkinnedMeshRendererCount = 0; + activeSpriteRendererCount = 0; + inactiveSpriteRendererCount = 0; + totalGameObjectCount = 0; + + foreach (GameObject obj in Selection.gameObjects) + { + CountRenderersRecursively(obj); + } + + Repaint(); + } + + private void CountRenderersRecursively(GameObject obj) + { + totalGameObjectCount++; + + bool isActive = obj.activeInHierarchy; + + if (obj.GetComponent()) + { + if (isActive) + { + activeMeshRendererCount++; + } + else + { + inactiveMeshRendererCount++; + } + } + + if (obj.GetComponent()) + { + if (isActive) + { + activeSkinnedMeshRendererCount++; + } + else + { + inactiveSkinnedMeshRendererCount++; + } + } + + if (obj.GetComponent()) + { + if (isActive) + { + activeSpriteRendererCount++; + } + else + { + inactiveSpriteRendererCount++; + } + } + + foreach (Transform child in obj.transform) + { + CountRenderersRecursively(child.gameObject); + } + } + } +} From 4532dd6984ad76ed9b4ea0d1458be943307b6b7f Mon Sep 17 00:00:00 2001 From: Hasan Bayat Date: Fri, 4 Oct 2024 11:49:26 +0330 Subject: [PATCH 208/231] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e7f51b0..f185093 100644 --- a/README.md +++ b/README.md @@ -78,7 +78,7 @@ Feel free to [:postbox: Post your ideas/comments/improvements/recommendations](h ## Credits - [UnityCoder (mika)](https://github.com/unitycoder) (Owner) -- [EmpireWorld (Hasan Bayat)](https://github.com/EmpireWorld) (Owner) +- [hasanbayatme (Hasan Bayat)](https://github.com/hasanbayatme) (Owner) - [Lootheo (Manuel Otheo)](https://github.com/Lootheo) (Member) - [igorrafael (Igor Rafael de Sousa)](https://github.com/igorrafael) (Member) - [nrlnd](https://github.com/nrlnd) (Member) From 3e2d55b01d812be62b5239fc8f2d4c3b3edd2a2b Mon Sep 17 00:00:00 2001 From: mika Date: Tue, 22 Oct 2024 21:46:37 +0300 Subject: [PATCH 209/231] Create FindWhatButtonCallsMyMethod.cs --- .../Tools/FindWhatButtonCallsMyMethod.cs | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 Assets/Scripts/Editor/Tools/FindWhatButtonCallsMyMethod.cs diff --git a/Assets/Scripts/Editor/Tools/FindWhatButtonCallsMyMethod.cs b/Assets/Scripts/Editor/Tools/FindWhatButtonCallsMyMethod.cs new file mode 100644 index 0000000..e67f45b --- /dev/null +++ b/Assets/Scripts/Editor/Tools/FindWhatButtonCallsMyMethod.cs @@ -0,0 +1,69 @@ +// prints out which buttons in current scene are referencing your given method + +using UnityEngine; +using UnityEngine.UI; +using UnityEditor; +using UnityEngine.Events; +using System.Reflection; + +namespace UnityLibrary +{ + public class FindWhatButtonCallsMyMethod : EditorWindow + { + private string methodName = "MyMethodHere"; + + [MenuItem("Tools/Find Buttons with Method")] + public static void ShowWindow() + { + GetWindow("FindWhatButtonCallsMyMethod"); + } + + private void OnGUI() + { + GUILayout.Label("Find Buttons that call Method", EditorStyles.boldLabel); + methodName = EditorGUILayout.TextField("Method Name:", methodName); + + if (GUILayout.Button("Find Buttons")) + { + FindButtonsWithMethod(); + } + } + + private void FindButtonsWithMethod() + { + Button[] allButtons = FindObjectsOfType