├── CHANGELOG.md ├── LICENSE ├── README.md └── Unity-Twitch-Chat ├── .gitignore ├── Assets ├── ExampleProject.meta ├── ExampleProject │ ├── BoxController.cs │ ├── BoxController.cs.meta │ ├── BoxPrefab.prefab │ ├── BoxPrefab.prefab.meta │ ├── BoxSprite.png │ ├── BoxSprite.png.meta │ ├── ClickExplosionForce.cs │ ├── ClickExplosionForce.cs.meta │ ├── ColorNormalizationTester.cs │ ├── ColorNormalizationTester.cs.meta │ ├── ConnectionExample.cs │ ├── ConnectionExample.cs.meta │ ├── ListenerExample.cs │ ├── ListenerExample.cs.meta │ ├── Scenes.meta │ └── Scenes │ │ ├── ColorNormalizationTestScene.unity │ │ ├── ColorNormalizationTestScene.unity.meta │ │ ├── ExampleScene.unity │ │ └── ExampleScene.unity.meta ├── Package.meta ├── Package │ ├── Runtime.meta │ ├── Runtime │ │ ├── Chatter.cs │ │ ├── Chatter.cs.meta │ │ ├── Extensions.cs │ │ ├── Extensions.cs.meta │ │ ├── IRC.cs │ │ ├── IRC.cs.meta │ │ ├── IRCMessages.cs │ │ ├── IRCMessages.cs.meta │ │ ├── ParseHelper.cs │ │ ├── ParseHelper.cs.meta │ │ ├── RateLimit.cs │ │ ├── RateLimit.cs.meta │ │ ├── TwitchConnection.ReadThread.cs │ │ ├── TwitchConnection.ReadThread.cs.meta │ │ ├── TwitchConnection.WriteThread.cs │ │ ├── TwitchConnection.WriteThread.cs.meta │ │ ├── TwitchConnection.cs │ │ ├── TwitchConnection.cs.meta │ │ ├── Utils.cs │ │ ├── Utils.cs.meta │ │ ├── lexonegit.unity-twitch-chat.asmdef │ │ └── lexonegit.unity-twitch-chat.asmdef.meta │ ├── package.json │ └── package.json.meta ├── TextMesh Pro.meta └── TextMesh Pro │ ├── Documentation.meta │ ├── Documentation │ ├── TextMesh Pro User Guide 2016.pdf │ └── TextMesh Pro User Guide 2016.pdf.meta │ ├── Fonts.meta │ ├── Fonts │ ├── LiberationSans - OFL.txt │ ├── LiberationSans - OFL.txt.meta │ ├── LiberationSans.ttf │ └── LiberationSans.ttf.meta │ ├── Resources.meta │ ├── Resources │ ├── Fonts & Materials.meta │ ├── Fonts & Materials │ │ ├── LiberationSans SDF - Drop Shadow.mat │ │ ├── LiberationSans SDF - Drop Shadow.mat.meta │ │ ├── LiberationSans SDF - Fallback.asset │ │ ├── LiberationSans SDF - Fallback.asset.meta │ │ ├── LiberationSans SDF - Outline.mat │ │ ├── LiberationSans SDF - Outline.mat.meta │ │ ├── LiberationSans SDF.asset │ │ └── LiberationSans SDF.asset.meta │ ├── LineBreaking Following Characters.txt │ ├── LineBreaking Following Characters.txt.meta │ ├── LineBreaking Leading Characters.txt │ ├── LineBreaking Leading Characters.txt.meta │ ├── Sprite Assets.meta │ ├── Sprite Assets │ │ ├── EmojiOne.asset │ │ └── EmojiOne.asset.meta │ ├── Style Sheets.meta │ ├── Style Sheets │ │ ├── Default Style Sheet.asset │ │ └── Default Style Sheet.asset.meta │ ├── TMP Settings.asset │ └── TMP Settings.asset.meta │ ├── Shaders.meta │ ├── Shaders │ ├── TMP_Bitmap-Custom-Atlas.shader │ ├── TMP_Bitmap-Custom-Atlas.shader.meta │ ├── TMP_Bitmap-Mobile.shader │ ├── TMP_Bitmap-Mobile.shader.meta │ ├── TMP_Bitmap.shader │ ├── TMP_Bitmap.shader.meta │ ├── TMP_SDF Overlay.shader │ ├── TMP_SDF Overlay.shader.meta │ ├── TMP_SDF SSD.shader │ ├── TMP_SDF SSD.shader.meta │ ├── TMP_SDF-Mobile Masking.shader │ ├── TMP_SDF-Mobile Masking.shader.meta │ ├── TMP_SDF-Mobile Overlay.shader │ ├── TMP_SDF-Mobile Overlay.shader.meta │ ├── TMP_SDF-Mobile SSD.shader │ ├── TMP_SDF-Mobile SSD.shader.meta │ ├── TMP_SDF-Mobile.shader │ ├── TMP_SDF-Mobile.shader.meta │ ├── TMP_SDF-Surface-Mobile.shader │ ├── TMP_SDF-Surface-Mobile.shader.meta │ ├── TMP_SDF-Surface.shader │ ├── TMP_SDF-Surface.shader.meta │ ├── TMP_SDF.shader │ ├── TMP_SDF.shader.meta │ ├── TMP_Sprite.shader │ ├── TMP_Sprite.shader.meta │ ├── TMPro.cginc │ ├── TMPro.cginc.meta │ ├── TMPro_Mobile.cginc │ ├── TMPro_Mobile.cginc.meta │ ├── TMPro_Properties.cginc │ ├── TMPro_Properties.cginc.meta │ ├── TMPro_Surface.cginc │ └── TMPro_Surface.cginc.meta │ ├── Sprites.meta │ └── Sprites │ ├── EmojiOne Attribution.txt │ ├── EmojiOne Attribution.txt.meta │ ├── EmojiOne.json │ ├── EmojiOne.json.meta │ ├── EmojiOne.png │ └── EmojiOne.png.meta ├── Packages ├── manifest.json └── packages-lock.json └── ProjectSettings ├── AudioManager.asset ├── ClusterInputManager.asset ├── DynamicsManager.asset ├── EditorBuildSettings.asset ├── EditorSettings.asset ├── GraphicsSettings.asset ├── InputManager.asset ├── MemorySettings.asset ├── NavMeshAreas.asset ├── NetworkManager.asset ├── PackageManagerSettings.asset ├── Physics2DSettings.asset ├── PresetManager.asset ├── ProjectSettings.asset ├── ProjectVersion.txt ├── QualitySettings.asset ├── SceneTemplateSettings.json ├── TagManager.asset ├── TimeManager.asset ├── UnityConnectSettings.asset ├── VFXManager.asset ├── VersionControlSettings.asset └── XRSettings.asset /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | All notable changes to this project will be documented in this file. 3 | 4 | The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), 5 | and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). 6 | 7 | ## [1.2.3] - 2024-08-22 8 | 9 | ### Added 10 | - Added joinChannelOnStart property 11 | - Added TextMeshPro to ExampleProject 12 | 13 | ### Changed 14 | - Improved alert descriptions 15 | - Improved example scripts 16 | - Upgraded ExampleProject to Unity 2022.3.41f1 (LTS) 17 | 18 | ## [1.2.2] - 2023-03-27 19 | 20 | ### Added 21 | - Added JoinChannel and LeaveChannel methods 22 | 23 | ### Changed 24 | - Fixed decoded chars array being too small issue 25 | - Switched to using StringBuilder when decoding IRC messages 26 | - Upgraded ExampleProject to Unity 2021.3.21f1 (LTS) 27 | 28 | 29 | ## [1.2.1] - 2023-01-24 30 | 31 | ### Added 32 | - Native Twitch chat-like name color behavior 33 | - Users that have not set their name color will be assigned a random color (session based) 34 | - Chatter.GetNameColor() now normalizes the color if needed, meaning that if the color is either too bright or too dark, it will be adjusted to be more readable 35 | 36 | - Color normalization test scene (ExampleProject) 37 | 38 | 39 | ### Changed 40 | - Minor changes to ExampleProject 41 | 42 | ### Removed 43 | - Removed maxDataPerFrame from inspector 44 | 45 | ## [1.2.0] - 2023-01-03 46 | 47 | ### Added 48 | - Support for anonymous login 49 | - Support for limiting how many messages can be processed each frame 50 | - Remake example project 51 | - Extensions class 52 | - Utils class 53 | 54 | ### Changed 55 | - Chatter.emotes is now an array instead of a list 56 | - Updated package.json 57 | - Reorganized folder structure 58 | - Restructured the code in various ways (pretty much no functional changes) 59 | - Replaced asmdef file 60 | - Change namespace to Lexone.UnityTwitchChat 61 | - Fixed old connection not being terminated when a new connection is made 62 | - Renamed some files 63 | 64 | ### Removed 65 | - Removed priority rate limit check (for now) 66 | - Removed a bunch of unused files 67 | 68 | ## [1.1.0] - 2022-01-20 69 | ### Added 70 | - TwitchIRC.singleton, which when true enables DontDestroyOnLoad and destroys duplicate instances 71 | - TwitchIRC.IsConnected, which is true only while there is a stable connection to Twitch 72 | - TwitchIRC.debugThreads, which allows debug warnings for thread termination to be turned on/off 73 | - Rate limiting 74 | - RateLimit class 75 | - Client sets rate limit based on user's channel permissions 76 | - Client delays messages that exceeed the rate limit 77 | - Client sends a warning when a message is queued that will exceed the rate limits 78 | - IRCTags.ContainsEmote and IRCTags.HasBadge (previously exclusive to the Chatter object) 79 | - Unity Tooltips for all inspector fields of the TwitchIRC class 80 | ### Changed 81 | - Chatter.MessageContainsEmote -> Chatter.ContainsEmote 82 | - Client now uses a standard backoff interval (0s, 1s, 2s, 4s, 8s, ...) when reattempting a failed connection 83 | - Fixed issue where TwitchIRC did not end a failed connection 84 | - Fixed issue where TwitchIRC did not properly handle no internet connection 85 | - Client now checks that the connection still exists in the receive thread instead of a third thread 86 | - On disconnect, pending status updates and chat messages are now propogated before a connection is terminated 87 | - Reduced default write interval to 100ms for faster responsiveness 88 | - Settled on a versioning method for pre-release versions 89 | ### Removed 90 | - TwitchIRC.status, which overcomplicated checking the connection for basic cases (for more complex connection handling, listen to the ConnectionAlertEvent) 91 | 92 | ## [1.0.0] - 2021-11-02 93 | ### Added 94 | - TwitchIRC catches a failed authentication attempt 95 | - TwitchIRC checks its connection to the IRC socket on a third thread. 96 | - TwitchIRC.SendPing method (ContextMenu action) for debugging connection 97 | - TwitchIRC.BlockingDisconnect which blocks the main thread while any remainig send/receive threads close (important for closing connecting during OnDisable and OnDestroy) 98 | - TwitchIRC.taskQueue which replaces the functionality of the MainThread class 99 | - XML descriptions for almost all class members 100 | ### Changed 101 | - API Changes 102 | - TwitchIRC.IRC_Connect -> TwitchIRC.Connect 103 | - TwitchIRC.IRC_Disconnect -> TwitchIRC.Disconnect 104 | - TwitchIRC.newChatMessageEvent -> TwitchIRC.ChatMessageEvent 105 | - TwitchIRC.statusEvent -> TwitchIRC.StatusUpdateEvent 106 | - TwitchIRC class 107 | - Each connection is encapsulated in an internal TwitchConnection object 108 | - Login messages are sent using the output thread instead of the main thread 109 | - When disconnecting, waits for threads to terminate before disconnect is completed 110 | - When connecting, disconnects any existing connection before proceding with a new connection 111 | - SendCommand no longer sends any messages instantly but uses priorityOutputQueue to send important messages first 112 | - IRCInputProc decodes buffered data from the socket instead of locking on StreamReader.ReadLine 113 | - Send/receive threads now sleep for a configurable number of milliseconds before reattempting sends/receives to reduce CPU usage 114 | - Uses thread safe classes for connected, outputQueue, priorityOutputQueue, and taskQueue 115 | - Versioning in CHANGELOG to reflect that the API was not stable 116 | ### Removed 117 | - MainThread class and prefab (functionality has been intergrated into TwitchIRC class) 118 | - IRCPrivMsg class and IRCUserstate class which were mostly unused 119 | 120 | ## [0.2.0] - 2021-10-26 121 | ### Added 122 | - CHANGELOG.md 123 | - package.json 124 | - Lexonegit.UnityTwitchChat.asmdef 125 | ### Changed 126 | - All scripts now belong to the Lexonegit.UnityTwitchChat namespace 127 | ### Removed 128 | - Sample scene (temporarily) 129 | 130 | ## [0.1.0] - 2021-06-12 131 | - Last release from lexonegit -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Original work Copyright (c) 2020 Leevi Seppälä (lexonegit) 4 | Modified work Copyright (c) 2021 Incredulous Interactive 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in all 14 | copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Unity Twitch Chat 2 | 3 | This is a lightweight and efficient [Twitch.tv IRC](https://dev.twitch.tv/docs/irc/) client for Unity. 4 | 5 | In short, this allows you to integrate Twitch Chat to your Unity projects.
The primary goal is to be able to read and send chat messages as efficiently as possible. 6 | 7 | 8 | 9 | ## Chat message example 10 | 11 | 12 | ### Supported features 13 | - Reading and sending chat messages 14 | - Parsing Twitch emotes and badges 15 | - Optional anonymous login 16 | - Automatic ratelimit checks 17 | - Name color normalization (similar to native Twitch chat) 18 | 19 | ### Unsupported features 20 | - Special messages (whispers, sub/resub, raids, first time viewers, etc) 21 | - Bits cheering, channel points, predictions, etc 22 | - Moderation (ban, timeout, etc) 23 | - Third party extensions (FFZ, BTTV, 7TV, etc) 24 | - and more... 25 | 26 | ### Other limitations 27 | - WebGL builds are not supported 28 | 29 | ## Installation 30 | 31 | - Open Unity Package Manager (Window -> Package Manager) 32 | - Click the `+` button in the top left corner 33 | - Select `Add package from git URL...` 34 | - Copy and paste the following URL and finish by clicking `Add`
35 | ``` 36 | https://github.com/lexonegit/Unity-Twitch-Chat.git?path=/Unity-Twitch-Chat/Assets/Package 37 | ``` 38 | 39 | 40 | ## Quick start 41 | 1. Install the Unity package (see above) 42 | 2. Create a new empty GameObject and add the `Twitch IRC` component. 43 | 3. In the inspector, set your Twitch details (OAuth, username, channel) 44 | - You can generate an OAuth token at https://twitchapps.com/tmi/ 45 | - Alternatively you can enable `Use Anonymous Login` to use without OAuth 46 | 4. Make sure `Connect IRC On Start` and `Join Channel On Start` are enabled and press play – You should now see JOIN messages, etc. in the console. 47 | 5. Create a new script that has a listener for the `IRC.OnChatMessage` event. 48 | - See ListenerExample.cs for reference. 49 | - The listener will receive `Chatter` objects which contain information about each chat message, such as the chatter name, message, emotes, etc... 50 | 51 | Having issues? Check out the included ExampleProject for a better understanding. 52 | 53 | ## Example project 54 | Spawn chatters as jumping boxes. Box color is based on their primary badge. 55 | 56 | 57 | 58 | ## API documentation 59 | 60 | ### IRC.cs 61 | - `void` **Connect()** - Connects to Twitch IRC 62 | - `void` **Disconnect()** - Disconnects from Twitch IRC 63 | - `void` **SendChatMessage(string message)** - Sends a chat message to the channel 64 | - `void` **JoinChannel(string channel)** - Join a Twitch channel 65 | - `void` **LeaveChannel(string channel)** - Leave a Twitch channel 66 | - `void` **Ping()** - Sends a PING message to the Twitch IRC server 67 | - `event` **OnChatMessage** - Event that is invoked when a chat message is received 68 | - `event` **OnConnectionAlert** - Event that is invoked when a connection alert is received 69 | - `IRCTags` **ClientUserTags** - Returns the tags of the client user (badges, name color, etc) 70 | 71 | ### Chatter.cs 72 | - `Color` **GetNameColor()** - Returns the color of the chatter's name 73 | - `bool` **IsDisplayNameFontSafe()** - Returns true if displayName is "font-safe" meaning that it only contains characters: a-z, A-Z, 0-9, _ 74 | - `bool` **ContainsEmote(string emoteId)** - Returns true if the chatter's message contains the specified emote (by id) 75 | - `bool` **HasBadge(string badgeName)** - Returns true if the chatter has the specified badge 76 | 77 | ## License 78 | MIT License 79 | 80 | ## Projects made with Unity Twitch Chat 81 | 82 | Intro Fighters, stream overlay game https://lexone.itch.io/introfighters 83 | 84 | *Did you make something cool? Contact me (lexone on Discord) to get featured here!* 85 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/.gitignore: -------------------------------------------------------------------------------- 1 | # This .gitignore file should be placed at the root of your Unity project directory 2 | # 3 | # This is a slightly modified version from the official Unity .gitignore: 4 | # https://github.com/github/gitignore/blob/main/Unity.gitignore 5 | # 6 | /[Ll]ibrary/ 7 | /[Tt]emp/ 8 | /[Oo]bj/ 9 | /[Bb]uild/ 10 | /[Bb]uilds/ 11 | /[Ll]ogs/ 12 | /[Uu]ser[Ss]ettings/ 13 | 14 | # MemoryCaptures can get excessive in size. 15 | # They also could contain extremely sensitive data 16 | /[Mm]emoryCaptures/ 17 | 18 | # Recordings can get excessive in size 19 | /[Rr]ecordings/ 20 | 21 | # Uncomment this line if you wish to ignore the asset store tools plugin 22 | # /[Aa]ssets/AssetStoreTools* 23 | 24 | # Autogenerated Jetbrains Rider plugin 25 | /[Aa]ssets/Plugins/Editor/JetBrains* 26 | 27 | # Visual Studio and VSCode cache directory 28 | .vs/ 29 | .vscode/ 30 | 31 | # Gradle cache directory 32 | .gradle/ 33 | 34 | # Autogenerated VS/MD/Consulo solution and project files 35 | ExportedObj/ 36 | .consulo/ 37 | *.csproj 38 | *.unityproj 39 | *.sln 40 | *.suo 41 | *.tmp 42 | *.user 43 | *.userprefs 44 | *.pidb 45 | *.booproj 46 | *.svd 47 | *.pdb 48 | *.mdb 49 | *.opendb 50 | *.VC.db 51 | 52 | # Unity3D generated meta files 53 | *.pidb.meta 54 | *.pdb.meta 55 | *.mdb.meta 56 | 57 | # Unity3D generated file on crash reports 58 | sysinfo.txt 59 | 60 | # Builds 61 | *.apk 62 | *.aab 63 | *.unitypackage 64 | *.app 65 | 66 | # Crashlytics generated file 67 | crashlytics-build.properties 68 | 69 | # Packed Addressables 70 | /[Aa]ssets/[Aa]ddressable[Aa]ssets[Dd]ata/*/*.bin* 71 | 72 | # Temporary auto-generated Android Assets 73 | /[Aa]ssets/[Ss]treamingAssets/aa.meta 74 | /[Aa]ssets/[Ss]treamingAssets/aa/* -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/ExampleProject.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 7bab4565cd924034e9b4182cf0b2bca7 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/ExampleProject/BoxController.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using UnityEngine; 4 | using UnityEngine.UI; 5 | using Lexone.UnityTwitchChat; 6 | 7 | /// 8 | /// This is an example script that shows some examples on how you could use the information from a Chatter object. 9 | /// 10 | public class BoxController : MonoBehaviour 11 | { 12 | public Transform ui; 13 | public Text nameText; 14 | public SpriteRenderer spriteRenderer; 15 | 16 | [Header("Badge colors")] 17 | public Color broadcasterColor; 18 | public Color moderatorColor; 19 | public Color vipColor; 20 | public Color subscriberColor; 21 | 22 | public void Initialize(Chatter chatter) 23 | { 24 | // Change name text to chatter's name. 25 | // Use displayName if it is "font-safe", 26 | // meaning that it only contains characters: a-z, A-Z, 0-9, _ (most fonts support these characters) 27 | // If not "font-safe" then use login name instead, which should always be "font-safe" 28 | nameText.text = chatter.IsDisplayNameFontSafe() ? chatter.tags.displayName : chatter.login; 29 | nameText.color = chatter.GetNameColor(); 30 | 31 | // Change box color to match chatter's primary badge 32 | if (chatter.HasBadge("broadcaster")) 33 | spriteRenderer.color = broadcasterColor; 34 | else 35 | if (chatter.HasBadge("moderator")) 36 | spriteRenderer.color = moderatorColor; 37 | else 38 | if (chatter.HasBadge("vip")) 39 | spriteRenderer.color = vipColor; 40 | else 41 | if (chatter.HasBadge("subscriber")) 42 | spriteRenderer.color = subscriberColor; 43 | 44 | 45 | // If the chatter's message contained the Kappa emote (emote ID: 25) 46 | // Then make their box double the size 47 | if (chatter.ContainsEmote("25")) 48 | { 49 | transform.localScale *= 2; 50 | } 51 | 52 | 53 | // Detach UI from parent so that it doesn't rotate with the box 54 | ui.SetParent(null); 55 | 56 | // Start the jump logic 57 | StartCoroutine(JumpLogic()); 58 | } 59 | 60 | private void LateUpdate() 61 | { 62 | // Update UI position to be above the box 63 | ui.position = (Vector2)transform.position + new Vector2(0, 1.5f); 64 | } 65 | 66 | private IEnumerator JumpLogic() 67 | { 68 | Rigidbody2D rb = GetComponent(); 69 | 70 | // Add some random initial force 71 | rb.AddForce(Random.insideUnitCircle * Random.Range(5f, 10f), ForceMode2D.Impulse); 72 | rb.AddTorque(Random.Range(-1f, 1f), ForceMode2D.Impulse); 73 | 74 | while (true) 75 | { 76 | yield return new WaitForSeconds(Random.Range(2f, 5f)); 77 | 78 | int direction = Random.value > 0.5f ? 1 : -1; // Random jump direction 79 | Vector2 force = Vector2.up * 10f + (Vector2.right * direction); // Jump force 80 | 81 | rb.AddForce(force, ForceMode2D.Impulse); 82 | rb.AddTorque(Random.Range(-1f, 1f), ForceMode2D.Impulse); 83 | } 84 | } 85 | } -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/ExampleProject/BoxController.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 049bedfc21a78ec43bdaaefcbdc851ac 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/ExampleProject/BoxPrefab.prefab.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 3ef85c00760080040a6cd2edfb587566 3 | PrefabImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/ExampleProject/BoxSprite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lexonegit/Unity-Twitch-Chat/0c3e6e2950c760e542abdab75d18ff788b83881e/Unity-Twitch-Chat/Assets/ExampleProject/BoxSprite.png -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/ExampleProject/BoxSprite.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 00d6a81b72135b54895ec0bfabffa7cb 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 12 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 0 10 | sRGBTexture: 1 11 | linearTexture: 0 12 | fadeOut: 0 13 | borderMipMap: 0 14 | mipMapsPreserveCoverage: 0 15 | alphaTestReferenceValue: 0.5 16 | mipMapFadeDistanceStart: 1 17 | mipMapFadeDistanceEnd: 3 18 | bumpmap: 19 | convertToNormalMap: 0 20 | externalNormalMap: 0 21 | heightScale: 0.25 22 | normalMapFilter: 0 23 | isReadable: 0 24 | streamingMipmaps: 0 25 | streamingMipmapsPriority: 0 26 | vTOnly: 0 27 | ignoreMasterTextureLimit: 0 28 | grayScaleToAlpha: 0 29 | generateCubemap: 6 30 | cubemapConvolution: 0 31 | seamlessCubemap: 0 32 | textureFormat: 1 33 | maxTextureSize: 2048 34 | textureSettings: 35 | serializedVersion: 2 36 | filterMode: 1 37 | aniso: 1 38 | mipBias: 0 39 | wrapU: 1 40 | wrapV: 1 41 | wrapW: 1 42 | nPOTScale: 0 43 | lightmap: 0 44 | compressionQuality: 50 45 | spriteMode: 1 46 | spriteExtrude: 1 47 | spriteMeshType: 1 48 | alignment: 0 49 | spritePivot: {x: 0.5, y: 0.5} 50 | spritePixelsToUnits: 512 51 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 52 | spriteGenerateFallbackPhysicsShape: 1 53 | alphaUsage: 1 54 | alphaIsTransparency: 1 55 | spriteTessellationDetail: -1 56 | textureType: 8 57 | textureShape: 1 58 | singleChannelComponent: 0 59 | flipbookRows: 1 60 | flipbookColumns: 1 61 | maxTextureSizeSet: 0 62 | compressionQualitySet: 0 63 | textureFormatSet: 0 64 | ignorePngGamma: 0 65 | applyGammaDecoding: 0 66 | cookieLightType: 0 67 | platformSettings: 68 | - serializedVersion: 3 69 | buildTarget: DefaultTexturePlatform 70 | maxTextureSize: 32 71 | resizeAlgorithm: 0 72 | textureFormat: -1 73 | textureCompression: 1 74 | compressionQuality: 50 75 | crunchedCompression: 0 76 | allowsAlphaSplitting: 0 77 | overridden: 0 78 | androidETC2FallbackOverride: 0 79 | forceMaximumCompressionQuality_BC6H_BC7: 0 80 | - serializedVersion: 3 81 | buildTarget: Standalone 82 | maxTextureSize: 2048 83 | resizeAlgorithm: 0 84 | textureFormat: -1 85 | textureCompression: 1 86 | compressionQuality: 50 87 | crunchedCompression: 0 88 | allowsAlphaSplitting: 0 89 | overridden: 0 90 | androidETC2FallbackOverride: 0 91 | forceMaximumCompressionQuality_BC6H_BC7: 0 92 | - serializedVersion: 3 93 | buildTarget: Server 94 | maxTextureSize: 2048 95 | resizeAlgorithm: 0 96 | textureFormat: -1 97 | textureCompression: 1 98 | compressionQuality: 50 99 | crunchedCompression: 0 100 | allowsAlphaSplitting: 0 101 | overridden: 0 102 | androidETC2FallbackOverride: 0 103 | forceMaximumCompressionQuality_BC6H_BC7: 0 104 | spriteSheet: 105 | serializedVersion: 2 106 | sprites: [] 107 | outline: [] 108 | physicsShape: [] 109 | bones: [] 110 | spriteID: 5e97eb03825dee720800000000000000 111 | internalID: 0 112 | vertices: [] 113 | indices: 114 | edges: [] 115 | weights: [] 116 | secondaryTextures: [] 117 | nameFileIdTable: {} 118 | spritePackingTag: 119 | pSDRemoveMatte: 0 120 | pSDShowRemoveMatteOption: 0 121 | userData: 122 | assetBundleName: 123 | assetBundleVariant: 124 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/ExampleProject/ClickExplosionForce.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | 3 | public class ClickExplosionForce : MonoBehaviour 4 | { 5 | private Vector2 mousePosition; 6 | 7 | public float explosionStrength = 10f; 8 | public float explosionRadius = 5f; 9 | 10 | private void Update() 11 | { 12 | mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition); 13 | 14 | if (Input.GetKeyDown(KeyCode.Mouse0)) 15 | { 16 | Collider2D[] colliders = Physics2D.OverlapCircleAll(mousePosition, explosionRadius); 17 | foreach (Collider2D hit in colliders) 18 | { 19 | Rigidbody2D rb = hit.GetComponent(); 20 | 21 | if (rb != null) 22 | { 23 | Vector2 explosionDir = rb.position - mousePosition; 24 | rb.AddForce(explosionDir.normalized * explosionStrength, ForceMode2D.Impulse); 25 | rb.AddTorque(Random.Range(-0.5f, 0.5f), ForceMode2D.Impulse); 26 | } 27 | } 28 | } 29 | } 30 | } -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/ExampleProject/ClickExplosionForce.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 69948cb5081364a45a405c9d7ba35a22 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/ExampleProject/ColorNormalizationTester.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using UnityEngine; 4 | using UnityEngine.UI; 5 | 6 | public class ColorNormalizationTester : MonoBehaviour 7 | { 8 | private Text[] children; 9 | 10 | private void Start() 11 | { 12 | children = GetComponentsInChildren(); 13 | 14 | foreach (Text text in children) 15 | { 16 | text.color = Lexone.UnityTwitchChat.ChatColors.NormalizeColor(text.color); 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/ExampleProject/ColorNormalizationTester.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 6a81e44d347011646960aedd2ebc278d 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/ExampleProject/ConnectionExample.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using UnityEngine; 4 | using Lexone.UnityTwitchChat; 5 | 6 | public class ConnectionExample : MonoBehaviour 7 | { 8 | // This is just a simple example on how to use the IRC class methods 9 | // You could for example hook Unity UI events to these methods 10 | 11 | public void JoinChannel() 12 | { 13 | IRC.Instance.JoinChannel("my_channel_name"); 14 | } 15 | 16 | public void LeaveChannel() 17 | { 18 | IRC.Instance.LeaveChannel("my_channel_name"); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/ExampleProject/ConnectionExample.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 9cf5500d5886ba34890b94528198988c 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/ExampleProject/ListenerExample.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using UnityEngine; 4 | using Lexone.UnityTwitchChat; 5 | 6 | public class ListenerExample : MonoBehaviour 7 | { 8 | public Chatter chatterObject; // Latest chatter object 9 | public BoxController boxPrefab; 10 | public int maxBoxes = 100; 11 | private int spawnCount = 0; 12 | 13 | private void Start() 14 | { 15 | // Add a listener for the IRC.OnChatMessage event 16 | IRC.Instance.OnChatMessage += OnChatMessage; 17 | } 18 | 19 | private void OnChatMessage(Chatter chatter) 20 | { 21 | // Handle new chat messages... 22 | 23 | Debug.Log($"[LISTENER EXAMPLE] New chat message from {chatter.tags.displayName}"); 24 | 25 | // Debug.Log($"Message content: {chatter.message}"); 26 | 27 | if (spawnCount >= maxBoxes) 28 | { 29 | Debug.LogWarning("Max amount of boxes reached!"); 30 | return; 31 | } 32 | 33 | // Spawn a new box 34 | Vector3 spawnPosition = Random.insideUnitCircle * 3f; 35 | BoxController box = Instantiate(boxPrefab, spawnPosition, Quaternion.identity); 36 | 37 | // Initialize the box with the chatter details 38 | box.Initialize(chatter); 39 | 40 | // This is just to show the latest chatter object in the inspector 41 | chatterObject = chatter; 42 | 43 | spawnCount++; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/ExampleProject/ListenerExample.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 974b535c3ec440b43a88f4a21641189d 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/ExampleProject/Scenes.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: a44a07640393c0a4380dc997bd4cea7a 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/ExampleProject/Scenes/ColorNormalizationTestScene.unity.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 94cfb315511731e428d9ba222aa9c4ba 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/ExampleProject/Scenes/ExampleScene.unity.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 039773080f91d9848b23a0f0fcee6bde 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/Package.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 080a4cd72e310154ab6941989ea869e9 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/Package/Runtime.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 8469b83194f969748a7b1a858e85821e 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/Package/Runtime/Chatter.cs: -------------------------------------------------------------------------------- 1 | 2 | using UnityEngine; 3 | 4 | namespace Lexone.UnityTwitchChat 5 | { 6 | [System.Serializable] 7 | public class Chatter 8 | { 9 | public Chatter(string login, string channel, string message, IRCTags tags) 10 | { 11 | this.login = login; 12 | this.channel = channel; 13 | this.message = message; 14 | this.tags = tags; 15 | } 16 | 17 | public string login, channel, message; 18 | public IRCTags tags = null; 19 | 20 | /// 21 | /// Returns the RGBA color of the chatter's name (tags.colorHex) 22 | /// Should the name color be normalized, if needed? 23 | /// 24 | public Color GetNameColor(bool normalize = true) 25 | { 26 | if (ColorUtility.TryParseHtmlString(tags.colorHex, out Color color)) 27 | { 28 | if (normalize) 29 | return ChatColors.NormalizeColor(color); 30 | else 31 | return color; 32 | } 33 | else 34 | return Color.white; // Parsing failed somehow, return default white 35 | } 36 | 37 | /// 38 | /// Returns true if displayName is "font-safe" 39 | /// meaning that it only contains characters: a-z, A-Z, 0-9, _ 40 | /// Useful because most fonts do not support unusual characters 41 | /// 42 | public bool IsDisplayNameFontSafe() 43 | { 44 | return ParseHelper.CheckNameRegex(tags.displayName); 45 | } 46 | 47 | /// 48 | /// Returns true if the chatter's message contains a given emote (by emote ID) 49 | /// You can find emote IDs by using the Twitch API, or 3rd party sites 50 | /// 51 | public bool ContainsEmote(string emoteId) => tags.ContainsEmote(emoteId); 52 | 53 | /// 54 | /// Returns true if the chatter has a given badge. 55 | /// 56 | public bool HasBadge(string badgeName) => tags.HasBadge(badgeName); 57 | } 58 | } -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/Package/Runtime/Chatter.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b73688d3783a3614b8c93efa1d360c30 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/Package/Runtime/Extensions.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | using System.Net.Sockets; 3 | using System.Text; 4 | 5 | namespace Lexone.UnityTwitchChat 6 | { 7 | public static class Extensions 8 | { 9 | public static void WriteLine(this NetworkStream stream, string output, bool showDebug = false) 10 | { 11 | if (showDebug) 12 | Debug.Log($"{Tags.write} {output}"); 13 | 14 | byte[] bytes = Encoding.UTF8.GetBytes(output); 15 | stream.Write(bytes, 0, bytes.Length); 16 | stream.WriteByte((byte)'\r'); 17 | stream.WriteByte((byte)'\n'); 18 | stream.Flush(); 19 | } 20 | 21 | /// 22 | /// Returns a string description for the ConnectionAlert enum. 23 | /// 24 | public static string GetDescription(this IRCReply alert) 25 | { 26 | switch (alert) 27 | { 28 | case IRCReply.CONNECTED_TO_SERVER: 29 | return "Connected to IRC"; 30 | case IRCReply.PONG_RECEIVED: 31 | return "Pong!"; 32 | case IRCReply.JOINED_CHANNEL: 33 | return "Joined channel"; 34 | case IRCReply.MISSING_LOGIN_INFO: 35 | return "Missing login information (OAuth or username)"; 36 | case IRCReply.BAD_LOGIN: 37 | return "Login failed"; 38 | case IRCReply.CONNECTION_INTERRUPTED: 39 | return "Connection to IRC interrupted"; 40 | case IRCReply.NO_CONNECTION: 41 | return "Connection to IRC failed"; 42 | default: 43 | return "Unknown alert"; 44 | } 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/Package/Runtime/Extensions.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 42ab443598ebf494082d4cb95163ccaa 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/Package/Runtime/IRC.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 7b273dcbdb39fcc4ab442b61d920b4ee 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/Package/Runtime/IRCMessages.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace Lexone.UnityTwitchChat 4 | { 5 | [System.Serializable] 6 | public struct ChatterEmote 7 | { 8 | [System.Serializable] 9 | public struct Index 10 | { 11 | public int startIndex, endIndex; 12 | } 13 | 14 | public string id; 15 | public Index[] indexes; 16 | } 17 | 18 | [System.Serializable] 19 | public struct ChatterBadge 20 | { 21 | public string id; 22 | public string version; 23 | } 24 | 25 | [System.Serializable] 26 | public class IRCTags 27 | { 28 | public string colorHex = string.Empty; 29 | public string displayName = string.Empty; 30 | public string channelId = string.Empty; 31 | public string userId = string.Empty; 32 | 33 | public ChatterBadge[] badges = new ChatterBadge[0]; 34 | public ChatterEmote[] emotes = new ChatterEmote[0]; 35 | 36 | public bool ContainsEmote(string emoteId) 37 | { 38 | foreach (ChatterEmote e in emotes) 39 | { 40 | if (e.id == emoteId) 41 | return true; 42 | } 43 | 44 | return false; 45 | } 46 | 47 | public bool HasBadge(string badge) 48 | { 49 | foreach (ChatterBadge b in badges) 50 | { 51 | if (b.id == badge) 52 | return true; 53 | } 54 | 55 | return false; 56 | } 57 | } 58 | } -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/Package/Runtime/IRCMessages.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 88f24ef1dd0473b4195a973a997e8f20 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/Package/Runtime/ParseHelper.cs: -------------------------------------------------------------------------------- 1 | using System.Text.RegularExpressions; 2 | 3 | namespace Lexone.UnityTwitchChat 4 | { 5 | internal static class ParseHelper 6 | { 7 | public static int IndexOfNth(this string source, char val, int nth = 0) 8 | { 9 | int index = source.IndexOf(val); 10 | 11 | for (int i = 0; i < nth; ++i) 12 | { 13 | if (index == -1) 14 | return -1; 15 | 16 | index = source.IndexOf(val, index + 1); 17 | } 18 | 19 | return index; 20 | } 21 | 22 | private static Regex symbolRegex = new Regex(@"^[a-zA-Z0-9_]+$", RegexOptions.Compiled); 23 | public static bool CheckNameRegex(string displayName) 24 | { 25 | return symbolRegex.IsMatch(displayName); 26 | } 27 | 28 | public static IRCTags ParseTags(string tagString) 29 | { 30 | IRCTags tags = new IRCTags(); 31 | string[] split = tagString.Split(';'); 32 | 33 | // Loop through tags 34 | for (int i = 0; i < split.Length; ++i) 35 | { 36 | string value = split[i].Substring(split[i].IndexOf('=') + 1); 37 | 38 | if (value.Length <= 0) // Ignore empty tags 39 | continue; 40 | 41 | // Find the tags we are interested in 42 | switch (split[i].Substring(0, split[i].IndexOf('='))) 43 | { 44 | case "badges": 45 | tags.badges = ParseBadges(value.Split(',')); 46 | continue; 47 | 48 | case "color": 49 | tags.colorHex = value; 50 | continue; 51 | 52 | case "display-name": 53 | tags.displayName = value; 54 | continue; 55 | 56 | case "emotes": 57 | tags.emotes = ParseTwitchEmotes(value.Split('/')); 58 | continue; 59 | 60 | case "room-id": // room-id = channel ID 61 | tags.channelId = value; 62 | continue; 63 | 64 | case "user-id": 65 | tags.userId = value; 66 | continue; 67 | } 68 | } 69 | 70 | return tags; 71 | } 72 | 73 | public static string ParseLoginName(string ircString) 74 | { 75 | return ircString.Substring(1, ircString.IndexOf('!') - 1); 76 | } 77 | 78 | public static string ParseChannel(string ircString) 79 | { 80 | string channel = ircString.Substring(ircString.IndexOf('#') + 1); 81 | 82 | int index = channel.IndexOf(' '); 83 | if (index == -1) 84 | return channel; 85 | else 86 | // Further parsing (needed for PRIVMSG for example) 87 | return channel.Substring(0, index); 88 | } 89 | 90 | public static string ParseMessage(string ircString) 91 | { 92 | return ircString.Substring(ircString.IndexOfNth(' ', 2) + 2); 93 | } 94 | 95 | public static ChatterEmote[] ParseTwitchEmotes(string[] splitEmotes) 96 | { 97 | ChatterEmote[] emotes = new ChatterEmote[splitEmotes.Length]; 98 | 99 | for (int i = 0; i < splitEmotes.Length; ++i) 100 | { 101 | string e = splitEmotes[i]; 102 | 103 | string[] indexes = e.Substring(e.IndexOf(':') + 1).Length > 0 ? e.Substring(e.IndexOf(':') + 1).Split(',') : new string[0]; 104 | 105 | ChatterEmote.Index[] ind = new ChatterEmote.Index[indexes.Length]; 106 | 107 | for (int j = 0; j < ind.Length; ++j) 108 | { 109 | ind[j].startIndex = int.Parse(indexes[j].Substring(0, indexes[j].IndexOf('-'))); 110 | ind[j].endIndex = int.Parse(indexes[j].Substring(indexes[j].IndexOf('-') + 1)); 111 | } 112 | 113 | emotes[i] = new ChatterEmote() 114 | { 115 | id = e.Substring(0, e.IndexOf(':')), 116 | indexes = ind 117 | }; 118 | } 119 | 120 | return emotes; 121 | } 122 | 123 | public static ChatterBadge[] ParseBadges(string[] splitBadges) 124 | { 125 | ChatterBadge[] badges = new ChatterBadge[splitBadges.Length]; 126 | 127 | for (int i = 0; i < splitBadges.Length; ++i) 128 | { 129 | string s = splitBadges[i]; 130 | 131 | badges[i].id = s.Substring(0, s.IndexOf('/')); 132 | badges[i].version = s.Substring(s.IndexOf('/') + 1); 133 | } 134 | 135 | return badges; 136 | } 137 | } 138 | } -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/Package/Runtime/ParseHelper.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: eed34128418642443ac1a049db44b3d7 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/Package/Runtime/RateLimit.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace Lexone.UnityTwitchChat 4 | { 5 | // See: https://dev.twitch.tv/docs/irc#rate-limits 6 | public struct RateLimit 7 | { 8 | public RateLimit(int count, TimeSpan timeSpan) 9 | { 10 | this.count = count; 11 | this.timeSpan = timeSpan; 12 | } 13 | 14 | public int count; 15 | public TimeSpan timeSpan; 16 | 17 | /// 18 | /// The chat command/message rate limit for users in a channel who do not have moderator permissions. 19 | /// 20 | public readonly static RateLimit ChatRegular = new RateLimit(20, new TimeSpan(0, 0, 30)); 21 | 22 | /// 23 | /// The chat command/message rate limit for users in a channel who are the broadcaster or have moderator permissions. 24 | /// 25 | public readonly static RateLimit ChatModerator = new RateLimit(100, new TimeSpan(0, 0, 30)); 26 | 27 | 28 | // 29 | // The rest is currently not implemented/used 30 | // 31 | 32 | 33 | /// 34 | /// The site-wide rate limit for verified bots to send chat commands/messages. Note: Channel level rate limits still apply based on the bot's user permissions. 35 | /// 36 | public readonly static RateLimit SiteLimitVerified = new RateLimit(7500, new TimeSpan(0, 0, 30)); 37 | 38 | /// 39 | /// The authentication attempt rate limit for a regular Twitch account. 40 | /// 41 | public readonly static RateLimit AuthAttemptsRegular = new RateLimit(20, new TimeSpan(0, 0, 10)); 42 | 43 | /// 44 | /// The join attempt rate limit for a regular Twitch account. 45 | /// 46 | public readonly static RateLimit JoinAttemptsRegular = new RateLimit(20, new TimeSpan(0, 0, 10)); 47 | 48 | /// 49 | /// The authentication attempt rate limit for a Twitch-verified bot. 50 | /// 51 | public readonly static RateLimit AuthAttemptsVerified = new RateLimit(200, new TimeSpan(0, 0, 10)); 52 | 53 | /// 54 | /// The join attempt rate limit for a Twitch-verified bot. 55 | /// 56 | public readonly static RateLimit JoinAttemptsVerified = new RateLimit(2000, new TimeSpan(0, 0, 10)); 57 | 58 | /// 59 | /// The number of whispers allowed per second. Note: Whispers use a composite rate limit. Make sure to also check the rate against and . 60 | /// 61 | public readonly static RateLimit WhispersA = new RateLimit(3, new TimeSpan(0, 0, 1)); 62 | 63 | /// 64 | /// The number of whispers allowed per minute. Note: Whispers use a composite rate limit. Make sure to also check the rate against and . 65 | /// 66 | public readonly static RateLimit WhispersB = new RateLimit(100, new TimeSpan(0, 1, 0)); 67 | 68 | /// 69 | /// The number of channels per day in which an account is allowed to send whispers. Note: Whispers use a composite rate limit. Make sure to also check the rate against and . 70 | /// 71 | public readonly static RateLimit WhisperChannels = new RateLimit(40, new TimeSpan(1, 0, 0, 0)); 72 | } 73 | } -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/Package/Runtime/RateLimit.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: d9812dc9d1798394b8c3e9a0df1fb54a 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/Package/Runtime/TwitchConnection.ReadThread.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | using System; 3 | using System.Text; 4 | using System.Threading; 5 | using System.Net.Sockets; 6 | using System.IO; 7 | 8 | namespace Lexone.UnityTwitchChat 9 | { 10 | internal partial class TwitchConnection 11 | { 12 | // Used to generate session based random colors for undefined users 13 | private int sessionRandom = DateTime.Now.Second; 14 | 15 | private void ReadThreadLoop() 16 | { 17 | if (showThreadDebug) 18 | Debug.Log($"{Tags.thread} Read thread started"); 19 | 20 | using (NetworkStream stream = tcpClient.GetStream()) 21 | { 22 | byte[] readBuffer = new byte[readBufferSize]; 23 | StringBuilder currentLine = new StringBuilder(); 24 | Decoder decoder = Encoding.UTF8.GetDecoder(); 25 | 26 | // Temporary solution(?): 27 | // Certain multi-byte UTF-8 characters can result in overflowing (special characters) 28 | // So we add a little extra space to the chars array just to be safe 29 | char[] chars = new char[readBufferSize + Mathf.Clamp(readBufferSize / 4, 1, 32)]; 30 | 31 | while (ThreadsRunning) 32 | { 33 | // Check if the connection is still alive 34 | if (!CheckConnection(tcpClient.Client)) 35 | { 36 | alertQueue.Enqueue(IRCReply.CONNECTION_INTERRUPTED); 37 | return; 38 | } 39 | 40 | while (stream.DataAvailable) 41 | { 42 | // Read the bytes from the stream 43 | int bytesReceived = stream.Read(readBuffer, 0, readBufferSize); 44 | 45 | // Decode the bytes to chars 46 | int charsDecoded = decoder.GetChars(readBuffer, 0, bytesReceived, chars, 0); 47 | 48 | for (int i = 0; i < charsDecoded; ++i) 49 | { 50 | // Character is a linebreak -> We have a complete line 51 | if (chars[i] == '\n' || chars[i] == '\r') 52 | { 53 | // If the line is not empty, handle it 54 | if (currentLine.Length > 0) 55 | { 56 | HandleRawLine(currentLine.ToString()); 57 | currentLine.Clear(); 58 | } 59 | } 60 | else 61 | { 62 | // Append the character to the current line 63 | currentLine.Append(chars[i]); 64 | } 65 | } 66 | } 67 | 68 | // Sleep to prevent high CPU usage 69 | Thread.Sleep(readInterval); 70 | } 71 | } 72 | 73 | if (showThreadDebug) 74 | Debug.Log($"{Tags.thread} Read thread stopped"); 75 | } 76 | 77 | private bool CheckConnection(Socket socket) 78 | { 79 | bool poll = socket.Poll(1000, SelectMode.SelectRead); 80 | bool available = (socket.Available == 0); 81 | 82 | if ((poll && available) || !socket.Connected) 83 | return false; 84 | else 85 | return true; 86 | } 87 | 88 | 89 | private void HandleRawLine(string raw) 90 | { 91 | if (showIRCDebug) 92 | Debug.Log($"{Tags.read} {raw}"); 93 | 94 | string ircString = raw; 95 | string tagString = string.Empty; 96 | 97 | // Parsing the raw IRC lines... 98 | 99 | if (raw[0] == '@') 100 | { 101 | int ind = raw.IndexOf(' '); 102 | tagString = raw.Substring(0, ind); 103 | ircString = raw.Substring(ind).TrimStart(); 104 | } 105 | 106 | if (ircString[0] == ':') 107 | { 108 | string type = ircString.Substring(ircString.IndexOf(' ')).TrimStart(); 109 | type = type.Substring(0, type.IndexOf(' ')); 110 | 111 | switch (type) 112 | { 113 | case "PRIVMSG": // = Chat message 114 | HandlePRIVMSG(ircString, tagString); 115 | break; 116 | case "USERSTATE": // = Userstate 117 | HandleUSERSTATE(ircString, tagString); 118 | break; 119 | case "NOTICE": // = Notice 120 | HandleNOTICE(ircString, tagString); 121 | break; 122 | 123 | // RPL messages 124 | case "353": // = Successful channel join 125 | case "001": // = Successful IRC connection 126 | HandleRPL(type); 127 | break; 128 | } 129 | } 130 | 131 | // Respond to PING messages with PONG 132 | if (raw.StartsWith("PING")) 133 | Pong(); 134 | 135 | // Alert when PONG messages are received 136 | if (raw.StartsWith(":tmi.twitch.tv PONG")) 137 | alertQueue.Enqueue(IRCReply.PONG_RECEIVED); 138 | } 139 | 140 | /// 141 | /// Handle a PRIVMSG message 142 | /// 143 | private void HandlePRIVMSG(string ircString, string tagString) 144 | { 145 | var login = ParseHelper.ParseLoginName(ircString); 146 | var channel = ParseHelper.ParseChannel(ircString); 147 | var message = ParseHelper.ParseMessage(ircString); 148 | var tags = ParseHelper.ParseTags(tagString); 149 | 150 | // Not all users have set their Twitch name color, so we need to check for that 151 | if (tags.colorHex.Length <= 0) 152 | tags.colorHex = useRandomColorForUndefined 153 | ? ChatColors.GetRandomNameColor(sessionRandom, login) 154 | : "#FFFFFF"; 155 | 156 | // Sort emotes by startIndex to match emote order in the actual chat message 157 | if (tags.emotes.Length > 0) 158 | { 159 | Array.Sort(tags.emotes, (a, b) => 160 | a.indexes[0].startIndex.CompareTo(b.indexes[0].startIndex)); 161 | } 162 | 163 | // Queue new chatter object 164 | chatterQueue.Enqueue(new Chatter(login, channel, message, tags)); 165 | } 166 | 167 | /// 168 | /// Handle a USERSTATE message 169 | /// 170 | private void HandleUSERSTATE(string ircString, string tagString) 171 | { 172 | var tags = ParseHelper.ParseTags(tagString); 173 | ClientUserTags = tags; 174 | UpdateRateLimits(); // Update rate limits based on client tags 175 | } 176 | 177 | /// 178 | /// Handle a NOTICE message 179 | /// 180 | private void HandleNOTICE(string ircString, string tagString) 181 | { 182 | if (ircString.Contains(":Login authentication failed")) 183 | { 184 | alertQueue.Enqueue(IRCReply.BAD_LOGIN); 185 | } 186 | } 187 | 188 | /// 189 | /// Handle an RPL message 190 | /// 191 | private void HandleRPL(string type) 192 | { 193 | switch (type) 194 | { 195 | case "001": 196 | alertQueue.Enqueue(IRCReply.CONNECTED_TO_SERVER); 197 | 198 | if (joinChannelOnStart) 199 | IRC.Instance.JoinChannel(channel); 200 | 201 | break; 202 | case "353": 203 | alertQueue.Enqueue(IRCReply.JOINED_CHANNEL); 204 | break; 205 | } 206 | } 207 | } 208 | } 209 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/Package/Runtime/TwitchConnection.ReadThread.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 0a4f8d91e5f7c4d4eae094d6999e753f 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/Package/Runtime/TwitchConnection.WriteThread.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using UnityEngine; 3 | using System.Threading; 4 | using System.Collections.Concurrent; 5 | 6 | namespace Lexone.UnityTwitchChat 7 | { 8 | internal partial class TwitchConnection 9 | { 10 | private ConcurrentQueue priorityWriteQueue = new ConcurrentQueue(); 11 | private ConcurrentQueue writeQueue = new ConcurrentQueue(); 12 | private ConcurrentQueue writeTimestamps = new ConcurrentQueue(); 13 | 14 | private void WriteThreadLoop() 15 | { 16 | if (showThreadDebug) 17 | Debug.Log($"{Tags.thread} Write thread started"); 18 | 19 | var stream = tcpClient.GetStream(); 20 | RateLimit currentRateLimit; 21 | 22 | while (ThreadsRunning) 23 | { 24 | // Process priority write queue (no ratelimiting) 25 | while (!priorityWriteQueue.IsEmpty) 26 | { 27 | if (priorityWriteQueue.TryDequeue(out string message)) 28 | { 29 | stream.WriteLine(message, showIRCDebug); 30 | } 31 | } 32 | 33 | // Get the current rate limit 34 | lock (rateLimitLock) 35 | currentRateLimit = rateLimit; 36 | 37 | // Remove old timestamps (ratelimiting) 38 | var minTime = DateTime.Now - rateLimit.timeSpan; 39 | while (writeTimestamps.TryPeek(out var timestamp) && timestamp < minTime) 40 | writeTimestamps.TryDequeue(out _); 41 | 42 | // Process the write queue (with IRC ratelimiting in mind) 43 | while (!writeQueue.IsEmpty && writeTimestamps.Count < rateLimit.count) 44 | { 45 | if (writeQueue.TryDequeue(out var message)) 46 | { 47 | stream.WriteLine(message, showIRCDebug); 48 | writeTimestamps.Enqueue(DateTime.Now); 49 | } 50 | } 51 | 52 | // Sleep to prevent high CPU usage 53 | Thread.Sleep(writeInterval); 54 | 55 | } 56 | 57 | if (showThreadDebug) 58 | Debug.Log($"{Tags.thread} Write thread stopped"); 59 | } 60 | 61 | public void Ping() => SendCommand("PING :tmi.twitch.tv", true); 62 | public void Pong() => SendCommand("PONG :tmi.twitch.tv", true); 63 | 64 | public void SendCommand(string command, bool priority = false) 65 | { 66 | if (priority) 67 | priorityWriteQueue.Enqueue(command); 68 | else 69 | writeQueue.Enqueue(command); 70 | } 71 | 72 | /// 73 | /// Sends a chat message to the channel. 74 | /// 75 | public void SendChatMessage(string message) 76 | { 77 | if (message.Length <= 0) 78 | { 79 | Debug.LogWarning($"{Tags.write} Tried sending an empty chat message"); 80 | return; 81 | } 82 | 83 | // Place the chat message into the write queue 84 | SendCommand("PRIVMSG #" + channel + " :" + message); 85 | } 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/Package/Runtime/TwitchConnection.WriteThread.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: dad2684412a4f6b42bfd8bf09418213e 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/Package/Runtime/TwitchConnection.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections; 3 | using System.Net.Sockets; 4 | using System.Threading; 5 | using System.Collections.Concurrent; 6 | 7 | namespace Lexone.UnityTwitchChat 8 | { 9 | internal partial class TwitchConnection 10 | { 11 | public TwitchConnection(IRC irc) 12 | { 13 | try 14 | { 15 | tcpClient = new TcpClient(irc.address, irc.port); 16 | } 17 | catch 18 | { 19 | tcpClient = null; 20 | } 21 | 22 | this.oauth = irc.oauth; 23 | this.nick = irc.username; 24 | this.channel = irc.channel; 25 | 26 | this.readBufferSize = (int)irc.readBufferSize; // Parse enum value 27 | this.readInterval = irc.readInterval; 28 | this.writeInterval = irc.writeInterval; 29 | 30 | this.alertQueue = irc.alertQueue; 31 | this.chatterQueue = irc.chatterQueue; 32 | 33 | this.rateLimit = RateLimit.ChatRegular; 34 | 35 | this.joinChannelOnStart = irc.joinChannelOnStart; 36 | this.showIRCDebug = irc.showIRCDebug; 37 | this.showThreadDebug = irc.showThreadDebug; 38 | 39 | this.useRandomColorForUndefined = irc.useRandomColorForUndefined; 40 | } 41 | 42 | public TcpClient tcpClient { get; private set; } 43 | 44 | private IRCTags _clientUserTags; 45 | public IRCTags ClientUserTags 46 | { 47 | get => _clientUserTags; 48 | set => Interlocked.Exchange(ref _clientUserTags, value); 49 | } 50 | 51 | private int _threadsRunning = 1; 52 | private bool ThreadsRunning 53 | { 54 | get => _threadsRunning == 1; 55 | set => Interlocked.Exchange(ref _threadsRunning, value ? 1 : 0); 56 | } 57 | 58 | public bool disconnectCalled = false; 59 | 60 | private readonly string oauth; 61 | private readonly string nick; 62 | private readonly string channel; 63 | private readonly int readBufferSize; 64 | private readonly int readInterval; 65 | private readonly int writeInterval; 66 | private readonly bool joinChannelOnStart; 67 | private readonly bool showIRCDebug; 68 | private readonly bool showThreadDebug; 69 | private readonly bool useRandomColorForUndefined; 70 | 71 | private readonly ConcurrentQueue alertQueue; 72 | private readonly ConcurrentQueue chatterQueue; 73 | 74 | private Thread readThread; 75 | private Thread writeThread; 76 | 77 | private RateLimit rateLimit = RateLimit.ChatRegular; 78 | private object rateLimitLock = new object(); 79 | 80 | public void Begin() 81 | { 82 | readThread = new Thread(() => ReadThreadLoop()); 83 | writeThread = new Thread(() => WriteThreadLoop()); 84 | 85 | readThread.Start(); 86 | writeThread.Start(); 87 | 88 | // Send connection commands 89 | SendCommand("PASS oauth:" + oauth.ToLower(), true); 90 | SendCommand("NICK " + nick.ToLower(), true); 91 | SendCommand("CAP REQ :twitch.tv/tags twitch.tv/commands", true); // twitch.tv/membership 92 | } 93 | 94 | public IEnumerator End() 95 | { 96 | if (tcpClient == null || disconnectCalled) 97 | yield break; 98 | 99 | disconnectCalled = true; 100 | ThreadsRunning = false; 101 | 102 | // Wait for the threads to stop 103 | while (readThread.IsAlive) 104 | yield return null; 105 | while (writeThread.IsAlive) 106 | yield return null; 107 | 108 | tcpClient.Close(); 109 | } 110 | 111 | public void BlockingEnd() 112 | { 113 | if (tcpClient == null) 114 | return; 115 | 116 | disconnectCalled = true; 117 | ThreadsRunning = false; 118 | readThread?.Join(); 119 | writeThread?.Join(); 120 | tcpClient.Close(); 121 | } 122 | 123 | private void UpdateRateLimits() 124 | { 125 | if (ClientUserTags.HasBadge("broadcaster") || ClientUserTags.HasBadge("moderator")) 126 | { 127 | lock (rateLimitLock) 128 | rateLimit = RateLimit.ChatModerator; 129 | } 130 | else 131 | { 132 | lock (rateLimitLock) 133 | rateLimit = RateLimit.ChatRegular; 134 | } 135 | } 136 | 137 | } 138 | } -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/Package/Runtime/TwitchConnection.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: e63f2c14884c7c440a75fd7342570e3d 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/Package/Runtime/Utils.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using UnityEngine; 3 | 4 | using Random = System.Random; 5 | 6 | namespace Lexone.UnityTwitchChat 7 | { 8 | /// 9 | /// https://www.ietf.org/rfc/rfc1459.txt (starting on page 42 - Replies) 10 | /// 11 | public enum IRCReply 12 | { 13 | // Twitch IRC specific codes 14 | CONNECTED_TO_SERVER = 001, 15 | PONG_RECEIVED = 007, 16 | 17 | // Command codes 18 | JOINED_CHANNEL = 353, 19 | 20 | // Error codes 21 | MISSING_LOGIN_INFO = 431, 22 | BAD_LOGIN = 464, 23 | CONNECTION_INTERRUPTED = 498, 24 | NO_CONNECTION = 499, 25 | } 26 | 27 | 28 | public enum ReadBufferSize 29 | { 30 | _32 = 32, 31 | _64 = 64, 32 | _128 = 128, 33 | _256 = 256, 34 | _512 = 512, 35 | _1024 = 1024, 36 | _2048 = 2048, 37 | _4096 = 4096, 38 | } 39 | 40 | public static class Tags 41 | { 42 | public static string read = "[IRC READ]"; 43 | public static string write = "[IRC WRITE]"; 44 | public static string thread = "[THREAD]"; 45 | public static string alert = "[ALERT]"; 46 | } 47 | 48 | public static class ChatColors 49 | { 50 | // These are taken from https://discuss.dev.twitch.tv/t/default-user-color-in-chat/385 51 | public static string[] defaultNameColors = new string[] 52 | { 53 | "#FF0000", // Red 54 | "#00FF00", // Green 55 | "#0000FF", // Blue 56 | "#B22222", // Firebrick 57 | "#FF7F50", // Coral 58 | "#9ACD32", // Yellow Green 59 | "#FF4500", // Orange Red 60 | "#2E8B57", // Sea Green 61 | "#DAA520", // Goldenrod 62 | "#D2691E", // Chocolate 63 | "#5F9EA0", // Cadet Blue 64 | "#1E90FF", // Dodger Blue 65 | "#FF69B4", // Hot Pink 66 | "#8A2BE2", // Blue Violet 67 | "#00FF7F", // Spring Green 68 | }; 69 | 70 | /// 71 | /// Gets a random name color based on the chatter's login (+ session random seed) 72 | /// This is similar to what native Twitch chat does 73 | /// 74 | public static string GetRandomNameColor(int sessionRandom, string login) 75 | { 76 | int n = sessionRandom + login[0] + login[login.Length - 1]; 77 | return defaultNameColors[n % defaultNameColors.Length]; 78 | } 79 | 80 | // These values can be adjusted to control how dark and bright colors are handled 81 | public static float grayscaleLow = 0.3f; 82 | public static float grayscaleHigh = 1.0f; 83 | /// 84 | /// Normalizes the color if needed to make it more readable 85 | /// Very bright colors are darkened, very dark colors are brightened 86 | /// This is similar to what native Twitch chat does 87 | /// 88 | public static Color NormalizeColor(Color color) 89 | { 90 | // Too dark -> make brighter 91 | if (color.grayscale < grayscaleLow) 92 | { 93 | float delta = grayscaleLow - color.grayscale; 94 | return new Color(color.r + delta, color.g + delta, color.b + delta); 95 | } 96 | 97 | // Too bright -> make darker 98 | if (color.grayscale > grayscaleHigh) 99 | { 100 | float delta = grayscaleHigh - color.grayscale; 101 | return new Color(color.r + delta, color.g + delta, color.b + delta); 102 | } 103 | 104 | return color; 105 | } 106 | } 107 | } -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/Package/Runtime/Utils.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: d85bf82f9bad72a4dab2a2e5a021bc1d 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/Package/Runtime/lexonegit.unity-twitch-chat.asmdef: -------------------------------------------------------------------------------- 1 | { 2 | "name": "lexonegit.unity-twitch-chat" 3 | } -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/Package/Runtime/lexonegit.unity-twitch-chat.asmdef.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 427c63a364266f3438999d68e4849006 3 | AssemblyDefinitionImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/Package/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "com.lexonegit.unity-twitch-chat", 3 | "version": "1.2.3", 4 | "displayName": "Unity Twitch Chat", 5 | "description": "Lightweight and easy-to-use Twitch IRC client for Unity projects", 6 | "documentationUrl": "https://github.com/lexonegit/Unity-Twitch-Chat", 7 | "changelogUrl": "https://github.com/lexonegit/Unity-Twitch-Chat/blob/master/CHANGELOG.md", 8 | "licensesUrl": "https://github.com/lexonegit/Unity-Twitch-Chat/blob/master/LICENSE", 9 | "keywords": [ 10 | "Twitch", 11 | "Chat", 12 | "Twitch IRC" 13 | ], 14 | "author": { 15 | "name": "Lexone", 16 | "url": "https://github.com/lexonegit" 17 | } 18 | } -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/Package/package.json.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: a3d1c632776147e4284a50a192dfce32 3 | PackageManifestImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: f54d1bd14bd3ca042bd867b519fee8cc 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Documentation.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 8e7e8f5a82a3a134e91c54efd2274ea9 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Documentation/TextMesh Pro User Guide 2016.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lexonegit/Unity-Twitch-Chat/0c3e6e2950c760e542abdab75d18ff788b83881e/Unity-Twitch-Chat/Assets/TextMesh Pro/Documentation/TextMesh Pro User Guide 2016.pdf -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Documentation/TextMesh Pro User Guide 2016.pdf.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 1b8d251f9af63b746bf2f7ffe00ebb9b 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Fonts.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 6ab70aee4d56447429c680537fbf93ed 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Fonts/LiberationSans - OFL.txt: -------------------------------------------------------------------------------- 1 | Digitized data copyright (c) 2010 Google Corporation 2 | with Reserved Font Arimo, Tinos and Cousine. 3 | Copyright (c) 2012 Red Hat, Inc. 4 | with Reserved Font Name Liberation. 5 | 6 | This Font Software is licensed under the SIL Open Font License, Version 1.1. 7 | This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL 8 | 9 | ----------------------------------------------------------- 10 | SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 11 | ----------------------------------------------------------- 12 | 13 | PREAMBLE 14 | The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. 15 | 16 | The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. 17 | 18 | DEFINITIONS 19 | "Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. 20 | 21 | "Reserved Font Name" refers to any names specified as such after the copyright statement(s). 22 | 23 | "Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s). 24 | 25 | "Modified Version" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. 26 | 27 | "Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. 28 | 29 | PERMISSION & CONDITIONS 30 | Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: 31 | 32 | 1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. 33 | 34 | 2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. 35 | 36 | 3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. 37 | 38 | 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. 39 | 40 | 5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. 41 | 42 | TERMINATION 43 | This license becomes null and void if any of the above conditions are not met. 44 | 45 | DISCLAIMER 46 | THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Fonts/LiberationSans - OFL.txt.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 6e59c59b81ab47f9b6ec5781fa725d2c 3 | timeCreated: 1484171296 4 | licenseType: Pro 5 | TextScriptImporter: 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Fonts/LiberationSans.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lexonegit/Unity-Twitch-Chat/0c3e6e2950c760e542abdab75d18ff788b83881e/Unity-Twitch-Chat/Assets/TextMesh Pro/Fonts/LiberationSans.ttf -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Fonts/LiberationSans.ttf.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: e3265ab4bf004d28a9537516768c1c75 3 | timeCreated: 1484171297 4 | licenseType: Pro 5 | TrueTypeFontImporter: 6 | serializedVersion: 2 7 | fontSize: 16 8 | forceTextureCase: -2 9 | characterSpacing: 1 10 | characterPadding: 0 11 | includeFontData: 1 12 | use2xBehaviour: 0 13 | fontNames: [] 14 | fallbackFontReferences: [] 15 | customCharacters: 16 | fontRenderingMode: 0 17 | userData: 18 | assetBundleName: 19 | assetBundleVariant: 20 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Resources.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 243e06394e614e5d99fab26083b707fa 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Resources/Fonts & Materials.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 731f1baa9d144a9897cb1d341c2092b8 3 | folderAsset: yes 4 | timeCreated: 1442040525 5 | licenseType: Pro 6 | DefaultImporter: 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Drop Shadow.mat: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!21 &2100000 4 | Material: 5 | serializedVersion: 6 6 | m_ObjectHideFlags: 0 7 | m_CorrespondingSourceObject: {fileID: 0} 8 | m_PrefabInstance: {fileID: 0} 9 | m_PrefabAsset: {fileID: 0} 10 | m_Name: LiberationSans SDF - Drop Shadow 11 | m_Shader: {fileID: 4800000, guid: fe393ace9b354375a9cb14cdbbc28be4, type: 3} 12 | m_ShaderKeywords: OUTLINE_ON UNDERLAY_ON 13 | m_LightmapFlags: 5 14 | m_EnableInstancingVariants: 0 15 | m_DoubleSidedGI: 0 16 | m_CustomRenderQueue: -1 17 | stringTagMap: {} 18 | disabledShaderPasses: [] 19 | m_SavedProperties: 20 | serializedVersion: 3 21 | m_TexEnvs: 22 | - _BumpMap: 23 | m_Texture: {fileID: 0} 24 | m_Scale: {x: 1, y: 1} 25 | m_Offset: {x: 0, y: 0} 26 | - _Cube: 27 | m_Texture: {fileID: 0} 28 | m_Scale: {x: 1, y: 1} 29 | m_Offset: {x: 0, y: 0} 30 | - _FaceTex: 31 | m_Texture: {fileID: 0} 32 | m_Scale: {x: 1, y: 1} 33 | m_Offset: {x: 0, y: 0} 34 | - _MainTex: 35 | m_Texture: {fileID: 28684132378477856, guid: 8f586378b4e144a9851e7b34d9b748ee, 36 | type: 2} 37 | m_Scale: {x: 1, y: 1} 38 | m_Offset: {x: 0, y: 0} 39 | - _OutlineTex: 40 | m_Texture: {fileID: 0} 41 | m_Scale: {x: 1, y: 1} 42 | m_Offset: {x: 0, y: 0} 43 | m_Floats: 44 | - _Ambient: 0.5 45 | - _Bevel: 0.5 46 | - _BevelClamp: 0 47 | - _BevelOffset: 0 48 | - _BevelRoundness: 0 49 | - _BevelWidth: 0 50 | - _BumpFace: 0 51 | - _BumpOutline: 0 52 | - _ColorMask: 15 53 | - _Diffuse: 0.5 54 | - _DiffusePower: 1 55 | - _FaceDilate: 0.1 56 | - _FaceUVSpeedX: 0 57 | - _FaceUVSpeedY: 0 58 | - _GlowInner: 0.05 59 | - _GlowOffset: 0 60 | - _GlowOuter: 0.05 61 | - _GlowPower: 0.75 62 | - _GradientScale: 10 63 | - _LightAngle: 3.1416 64 | - _MaskSoftnessX: 0 65 | - _MaskSoftnessY: 0 66 | - _OutlineSoftness: 0 67 | - _OutlineUVSpeedX: 0 68 | - _OutlineUVSpeedY: 0 69 | - _OutlineWidth: 0.1 70 | - _PerspectiveFilter: 0.875 71 | - _Reflectivity: 10 72 | - _ScaleRatioA: 0.9 73 | - _ScaleRatioB: 0.73125 74 | - _ScaleRatioC: 0.64125 75 | - _ScaleX: 1 76 | - _ScaleY: 1 77 | - _ShaderFlags: 0 78 | - _Sharpness: 0 79 | - _SpecularPower: 2 80 | - _Stencil: 0 81 | - _StencilComp: 8 82 | - _StencilOp: 0 83 | - _StencilReadMask: 255 84 | - _StencilWriteMask: 255 85 | - _TextureHeight: 1024 86 | - _TextureWidth: 1024 87 | - _UnderlayDilate: 0 88 | - _UnderlayOffsetX: 0.5 89 | - _UnderlayOffsetY: -0.5 90 | - _UnderlaySoftness: 0.05 91 | - _VertexOffsetX: 0 92 | - _VertexOffsetY: 0 93 | - _WeightBold: 0.75 94 | - _WeightNormal: 0 95 | m_Colors: 96 | - _ClipRect: {r: -32767, g: -32767, b: 32767, a: 32767} 97 | - _Color: {r: 1, g: 1, b: 1, a: 1} 98 | - _EnvMatrixRotation: {r: 0, g: 0, b: 0, a: 0} 99 | - _FaceColor: {r: 1, g: 1, b: 1, a: 1} 100 | - _GlowColor: {r: 0, g: 1, b: 0, a: 0.5} 101 | - _MaskCoord: {r: 0, g: 0, b: 32767, a: 32767} 102 | - _OutlineColor: {r: 0, g: 0, b: 0, a: 1} 103 | - _ReflectFaceColor: {r: 0, g: 0, b: 0, a: 1} 104 | - _ReflectOutlineColor: {r: 0, g: 0, b: 0, a: 1} 105 | - _SpecularColor: {r: 1, g: 1, b: 1, a: 1} 106 | - _UnderlayColor: {r: 0, g: 0, b: 0, a: 0.5} 107 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Drop Shadow.mat.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: e73a58f6e2794ae7b1b7e50b7fb811b0 3 | timeCreated: 1484172806 4 | licenseType: Pro 5 | NativeFormatImporter: 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Fallback.asset.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 2e498d1c8094910479dc3e1b768306a4 3 | timeCreated: 1484171803 4 | licenseType: Pro 5 | NativeFormatImporter: 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Outline.mat: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!21 &2100000 4 | Material: 5 | serializedVersion: 6 6 | m_ObjectHideFlags: 0 7 | m_CorrespondingSourceObject: {fileID: 0} 8 | m_PrefabInstance: {fileID: 0} 9 | m_PrefabAsset: {fileID: 0} 10 | m_Name: LiberationSans SDF - Outline 11 | m_Shader: {fileID: 4800000, guid: fe393ace9b354375a9cb14cdbbc28be4, type: 3} 12 | m_ShaderKeywords: OUTLINE_ON 13 | m_LightmapFlags: 5 14 | m_EnableInstancingVariants: 0 15 | m_DoubleSidedGI: 0 16 | m_CustomRenderQueue: -1 17 | stringTagMap: {} 18 | disabledShaderPasses: [] 19 | m_SavedProperties: 20 | serializedVersion: 3 21 | m_TexEnvs: 22 | - _BumpMap: 23 | m_Texture: {fileID: 0} 24 | m_Scale: {x: 1, y: 1} 25 | m_Offset: {x: 0, y: 0} 26 | - _Cube: 27 | m_Texture: {fileID: 0} 28 | m_Scale: {x: 1, y: 1} 29 | m_Offset: {x: 0, y: 0} 30 | - _FaceTex: 31 | m_Texture: {fileID: 0} 32 | m_Scale: {x: 1, y: 1} 33 | m_Offset: {x: 0, y: 0} 34 | - _MainTex: 35 | m_Texture: {fileID: 28684132378477856, guid: 8f586378b4e144a9851e7b34d9b748ee, 36 | type: 2} 37 | m_Scale: {x: 1, y: 1} 38 | m_Offset: {x: 0, y: 0} 39 | - _OutlineTex: 40 | m_Texture: {fileID: 0} 41 | m_Scale: {x: 1, y: 1} 42 | m_Offset: {x: 0, y: 0} 43 | m_Floats: 44 | - _Ambient: 0.5 45 | - _Bevel: 0.5 46 | - _BevelClamp: 0 47 | - _BevelOffset: 0 48 | - _BevelRoundness: 0 49 | - _BevelWidth: 0 50 | - _BumpFace: 0 51 | - _BumpOutline: 0 52 | - _ColorMask: 15 53 | - _Diffuse: 0.5 54 | - _FaceDilate: 0.1 55 | - _FaceUVSpeedX: 0 56 | - _FaceUVSpeedY: 0 57 | - _GlowInner: 0.05 58 | - _GlowOffset: 0 59 | - _GlowOuter: 0.05 60 | - _GlowPower: 0.75 61 | - _GradientScale: 10 62 | - _LightAngle: 3.1416 63 | - _MaskSoftnessX: 0 64 | - _MaskSoftnessY: 0 65 | - _OutlineSoftness: 0 66 | - _OutlineUVSpeedX: 0 67 | - _OutlineUVSpeedY: 0 68 | - _OutlineWidth: 0.1 69 | - _PerspectiveFilter: 0.875 70 | - _Reflectivity: 10 71 | - _ScaleRatioA: 0.9 72 | - _ScaleRatioB: 0.73125 73 | - _ScaleRatioC: 0.64125 74 | - _ScaleX: 1 75 | - _ScaleY: 1 76 | - _ShaderFlags: 0 77 | - _Sharpness: 0 78 | - _SpecularPower: 2 79 | - _Stencil: 0 80 | - _StencilComp: 8 81 | - _StencilOp: 0 82 | - _StencilReadMask: 255 83 | - _StencilWriteMask: 255 84 | - _TextureHeight: 1024 85 | - _TextureWidth: 1024 86 | - _UnderlayDilate: 0 87 | - _UnderlayOffsetX: 0 88 | - _UnderlayOffsetY: 0 89 | - _UnderlaySoftness: 0 90 | - _VertexOffsetX: 0 91 | - _VertexOffsetY: 0 92 | - _WeightBold: 0.75 93 | - _WeightNormal: 0 94 | m_Colors: 95 | - _ClipRect: {r: -32767, g: -32767, b: 32767, a: 32767} 96 | - _EnvMatrixRotation: {r: 0, g: 0, b: 0, a: 0} 97 | - _FaceColor: {r: 1, g: 1, b: 1, a: 1} 98 | - _GlowColor: {r: 0, g: 1, b: 0, a: 0.5} 99 | - _MaskCoord: {r: 0, g: 0, b: 32767, a: 32767} 100 | - _OutlineColor: {r: 0, g: 0, b: 0, a: 1} 101 | - _ReflectFaceColor: {r: 0, g: 0, b: 0, a: 1} 102 | - _ReflectOutlineColor: {r: 0, g: 0, b: 0, a: 1} 103 | - _SpecularColor: {r: 1, g: 1, b: 1, a: 1} 104 | - _UnderlayColor: {r: 0, g: 0, b: 0, a: 0.5} 105 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Outline.mat.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 79459efec17a4d00a321bdcc27bbc385 3 | timeCreated: 1484172856 4 | licenseType: Pro 5 | NativeFormatImporter: 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF.asset.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 8f586378b4e144a9851e7b34d9b748ee 3 | timeCreated: 1484171803 4 | licenseType: Pro 5 | NativeFormatImporter: 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Resources/LineBreaking Following Characters.txt: -------------------------------------------------------------------------------- 1 | )]}〕〉》」』】〙〗〟’”⦆»ヽヾーァィゥェォッャュョヮヵヶぁぃぅぇぉっゃゅょゎゕゖㇰㇱㇲㇳㇴㇵㇶㇷㇸㇹㇺㇻㇼㇽㇾㇿ々〻‐゠–〜?!‼⁇⁈⁉・、%,.:;。!?]):;=}¢°"†‡℃〆%,. -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Resources/LineBreaking Following Characters.txt.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: fade42e8bc714b018fac513c043d323b 3 | timeCreated: 1425440388 4 | licenseType: Store 5 | TextScriptImporter: 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Resources/LineBreaking Leading Characters.txt: -------------------------------------------------------------------------------- 1 | ([{〔〈《「『【〘〖〝‘“⦅«$—…‥〳〴〵\[({£¥"々〇$¥₩ # -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Resources/LineBreaking Leading Characters.txt.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: d82c1b31c7e74239bff1220585707d2b 3 | timeCreated: 1425440388 4 | licenseType: Store 5 | TextScriptImporter: 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Resources/Sprite Assets.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 512a49d95c0c4332bdd98131869c23c9 3 | folderAsset: yes 4 | timeCreated: 1441876896 5 | licenseType: Pro 6 | DefaultImporter: 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Resources/Sprite Assets/EmojiOne.asset.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: c41005c129ba4d66911b75229fd70b45 3 | timeCreated: 1480316912 4 | licenseType: Pro 5 | NativeFormatImporter: 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Resources/Style Sheets.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 4aecb92fff08436c8303b10eab8da368 3 | folderAsset: yes 4 | timeCreated: 1441876950 5 | licenseType: Pro 6 | DefaultImporter: 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Resources/Style Sheets/Default Style Sheet.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!114 &11400000 4 | MonoBehaviour: 5 | m_ObjectHideFlags: 0 6 | m_PrefabParentObject: {fileID: 0} 7 | m_PrefabInternal: {fileID: 0} 8 | m_GameObject: {fileID: 0} 9 | m_Enabled: 1 10 | m_EditorHideFlags: 0 11 | m_Script: {fileID: 11500000, guid: ab2114bdc8544297b417dfefe9f1e410, type: 3} 12 | m_Name: Default Style Sheet 13 | m_EditorClassIdentifier: 14 | m_StyleList: 15 | - m_Name: H1 16 | m_HashCode: 2425 17 | m_OpeningDefinition: <#40ff80>* 18 | m_ClosingDefinition: '*' 19 | m_OpeningTagArray: 3c00000073000000690000007a000000650000003d00000032000000650000006d0000003e0000003c000000620000003e0000003c000000230000003400000030000000660000006600000038000000300000003e0000002a000000 20 | m_ClosingTagArray: 2a0000003c0000002f00000073000000690000007a000000650000003e0000003c0000002f000000620000003e0000003c0000002f000000630000006f0000006c0000006f000000720000003e000000 21 | - m_Name: Quote 22 | m_HashCode: 92254330 23 | m_OpeningDefinition: 24 | m_ClosingDefinition: 25 | m_OpeningTagArray: 3c000000690000003e0000003c00000073000000690000007a000000650000003d0000003700000035000000250000003e0000003c0000006d000000610000007200000067000000690000006e0000003d0000003100000030000000250000003e000000 26 | m_ClosingTagArray: 3c0000002f000000690000003e0000003c0000002f00000073000000690000007a000000650000003e0000003c0000002f00000077000000690000006400000074000000680000003e0000003c0000002f0000006d000000610000007200000067000000690000006e0000003e000000 27 | - m_Name: Link 28 | m_HashCode: 2687968 29 | m_OpeningDefinition: <#40a0ff> 30 | m_ClosingDefinition: 31 | m_OpeningTagArray: 3c000000750000003e0000003c000000230000003400000030000000610000003000000066000000660000003e0000003c0000006c000000690000006e0000006b0000003d0000002200000049000000440000005f0000003000000031000000220000003e000000 32 | m_ClosingTagArray: 3c0000002f000000750000003e0000003c0000002f000000630000006f0000006c0000006f000000720000003e0000003c0000002f0000006c000000690000006e0000006b0000003e000000 33 | - m_Name: Title 34 | m_HashCode: 98732960 35 | m_OpeningDefinition: 36 | m_ClosingDefinition: 37 | m_OpeningTagArray: 3c00000073000000690000007a000000650000003d000000310000003200000035000000250000003e0000003c000000620000003e0000003c000000610000006c00000069000000670000006e0000003d00000063000000650000006e0000007400000065000000720000003e000000 38 | m_ClosingTagArray: 3c0000002f00000073000000690000007a000000650000003e0000003c0000002f000000620000003e0000003c0000002f000000610000006c00000069000000670000006e0000003e000000 39 | - m_Name: H2 40 | m_HashCode: 2426 41 | m_OpeningDefinition: <#4080FF> 42 | m_ClosingDefinition: 43 | m_OpeningTagArray: 3c00000073000000690000007a000000650000003d000000310000002e00000035000000650000006d0000003e0000003c000000620000003e0000003c000000230000003400000030000000380000003000000046000000460000003e000000 44 | m_ClosingTagArray: 3c0000002f00000073000000690000007a000000650000003e0000003c0000002f000000620000003e0000003c0000002f000000630000006f0000006c0000006f000000720000003e000000 45 | - m_Name: H3 46 | m_HashCode: 2427 47 | m_OpeningDefinition: <#FF8040> 48 | m_ClosingDefinition: 49 | m_OpeningTagArray: 3c00000073000000690000007a000000650000003d000000310000002e0000003100000037000000650000006d0000003e0000003c000000620000003e0000003c000000230000004600000046000000380000003000000034000000300000003e000000 50 | m_ClosingTagArray: 3c0000002f00000073000000690000007a000000650000003e0000003c0000002f000000620000003e0000003c0000002f000000630000006f0000006c0000006f000000720000003e000000 51 | - m_Name: C1 52 | m_HashCode: 2194 53 | m_OpeningDefinition: 54 | m_ClosingDefinition: 55 | m_OpeningTagArray: 3c000000630000006f0000006c0000006f000000720000003d000000230000006600000066000000660000006600000034000000300000003e000000 56 | m_ClosingTagArray: 3c0000002f000000630000006f0000006c0000006f000000720000003e000000 57 | - m_Name: C2 58 | m_HashCode: 2193 59 | m_OpeningDefinition: 60 | m_ClosingDefinition: 61 | m_OpeningTagArray: 3c000000630000006f0000006c0000006f000000720000003d000000230000006600000066000000340000003000000046000000460000003e0000003c00000073000000690000007a000000650000003d000000310000003200000035000000250000003e000000 62 | m_ClosingTagArray: 3c0000002f000000630000006f0000006c0000006f000000720000003e0000003c0000002f00000073000000690000007a000000650000003e000000 63 | - m_Name: C3 64 | m_HashCode: 2192 65 | m_OpeningDefinition: 66 | m_ClosingDefinition: 67 | m_OpeningTagArray: 3c000000630000006f0000006c0000006f000000720000003d000000230000003800000030000000410000003000000046000000460000003e0000003c000000620000003e000000 68 | m_ClosingTagArray: 3c0000002f000000630000006f0000006c0000006f000000720000003e0000003c0000002f000000620000003e000000 69 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Resources/Style Sheets/Default Style Sheet.asset.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: f952c082cb03451daed3ee968ac6c63e 3 | timeCreated: 1432805430 4 | licenseType: Store 5 | NativeFormatImporter: 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Resources/TMP Settings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!114 &11400000 4 | MonoBehaviour: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | m_GameObject: {fileID: 0} 10 | m_Enabled: 1 11 | m_EditorHideFlags: 0 12 | m_Script: {fileID: 11500000, guid: 2705215ac5b84b70bacc50632be6e391, type: 3} 13 | m_Name: TMP Settings 14 | m_EditorClassIdentifier: 15 | m_enableWordWrapping: 1 16 | m_enableKerning: 1 17 | m_enableExtraPadding: 0 18 | m_enableTintAllSprites: 0 19 | m_enableParseEscapeCharacters: 1 20 | m_EnableRaycastTarget: 1 21 | m_GetFontFeaturesAtRuntime: 1 22 | m_missingGlyphCharacter: 0 23 | m_warningsDisabled: 0 24 | m_defaultFontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} 25 | m_defaultFontAssetPath: Fonts & Materials/ 26 | m_defaultFontSize: 36 27 | m_defaultAutoSizeMinRatio: 0.5 28 | m_defaultAutoSizeMaxRatio: 2 29 | m_defaultTextMeshProTextContainerSize: {x: 20, y: 5} 30 | m_defaultTextMeshProUITextContainerSize: {x: 200, y: 50} 31 | m_autoSizeTextContainer: 0 32 | m_fallbackFontAssets: [] 33 | m_matchMaterialPreset: 1 34 | m_defaultSpriteAsset: {fileID: 11400000, guid: c41005c129ba4d66911b75229fd70b45, 35 | type: 2} 36 | m_defaultSpriteAssetPath: Sprite Assets/ 37 | m_enableEmojiSupport: 1 38 | m_MissingCharacterSpriteUnicode: 0 39 | m_defaultColorGradientPresetsPath: Color Gradient Presets/ 40 | m_defaultStyleSheet: {fileID: 11400000, guid: f952c082cb03451daed3ee968ac6c63e, 41 | type: 2} 42 | m_StyleSheetsResourcePath: 43 | m_leadingCharacters: {fileID: 4900000, guid: d82c1b31c7e74239bff1220585707d2b, type: 3} 44 | m_followingCharacters: {fileID: 4900000, guid: fade42e8bc714b018fac513c043d323b, 45 | type: 3} 46 | m_UseModernHangulLineBreakingRules: 0 47 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Resources/TMP Settings.asset.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 3f5b5dff67a942289a9defa416b206f3 3 | timeCreated: 1436653997 4 | licenseType: Pro 5 | NativeFormatImporter: 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: e9f693669af91aa45ad615fc681ed29f 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Custom-Atlas.shader: -------------------------------------------------------------------------------- 1 | Shader "TextMeshPro/Bitmap Custom Atlas" { 2 | 3 | Properties { 4 | _MainTex ("Font Atlas", 2D) = "white" {} 5 | _FaceTex ("Font Texture", 2D) = "white" {} 6 | [HDR]_FaceColor ("Text Color", Color) = (1,1,1,1) 7 | 8 | _VertexOffsetX ("Vertex OffsetX", float) = 0 9 | _VertexOffsetY ("Vertex OffsetY", float) = 0 10 | _MaskSoftnessX ("Mask SoftnessX", float) = 0 11 | _MaskSoftnessY ("Mask SoftnessY", float) = 0 12 | 13 | _ClipRect("Clip Rect", vector) = (-32767, -32767, 32767, 32767) 14 | _Padding ("Padding", float) = 0 15 | 16 | _StencilComp("Stencil Comparison", Float) = 8 17 | _Stencil("Stencil ID", Float) = 0 18 | _StencilOp("Stencil Operation", Float) = 0 19 | _StencilWriteMask("Stencil Write Mask", Float) = 255 20 | _StencilReadMask("Stencil Read Mask", Float) = 255 21 | 22 | _CullMode("Cull Mode", Float) = 0 23 | _ColorMask("Color Mask", Float) = 15 24 | } 25 | 26 | SubShader{ 27 | 28 | Tags { "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" } 29 | 30 | Stencil 31 | { 32 | Ref[_Stencil] 33 | Comp[_StencilComp] 34 | Pass[_StencilOp] 35 | ReadMask[_StencilReadMask] 36 | WriteMask[_StencilWriteMask] 37 | } 38 | 39 | 40 | Lighting Off 41 | Cull [_CullMode] 42 | ZTest [unity_GUIZTestMode] 43 | ZWrite Off 44 | Fog { Mode Off } 45 | Blend SrcAlpha OneMinusSrcAlpha 46 | ColorMask[_ColorMask] 47 | 48 | Pass { 49 | CGPROGRAM 50 | #pragma vertex vert 51 | #pragma fragment frag 52 | 53 | #pragma multi_compile __ UNITY_UI_CLIP_RECT 54 | #pragma multi_compile __ UNITY_UI_ALPHACLIP 55 | 56 | 57 | #include "UnityCG.cginc" 58 | 59 | struct appdata_t { 60 | float4 vertex : POSITION; 61 | fixed4 color : COLOR; 62 | float2 texcoord0 : TEXCOORD0; 63 | float2 texcoord1 : TEXCOORD1; 64 | }; 65 | 66 | struct v2f { 67 | float4 vertex : SV_POSITION; 68 | fixed4 color : COLOR; 69 | float2 texcoord0 : TEXCOORD0; 70 | float2 texcoord1 : TEXCOORD1; 71 | float4 mask : TEXCOORD2; 72 | }; 73 | 74 | uniform sampler2D _MainTex; 75 | uniform sampler2D _FaceTex; 76 | uniform float4 _FaceTex_ST; 77 | uniform fixed4 _FaceColor; 78 | 79 | uniform float _VertexOffsetX; 80 | uniform float _VertexOffsetY; 81 | uniform float4 _ClipRect; 82 | uniform float _MaskSoftnessX; 83 | uniform float _MaskSoftnessY; 84 | 85 | float2 UnpackUV(float uv) 86 | { 87 | float2 output; 88 | output.x = floor(uv / 4096); 89 | output.y = uv - 4096 * output.x; 90 | 91 | return output * 0.001953125; 92 | } 93 | 94 | v2f vert (appdata_t v) 95 | { 96 | float4 vert = v.vertex; 97 | vert.x += _VertexOffsetX; 98 | vert.y += _VertexOffsetY; 99 | 100 | vert.xy += (vert.w * 0.5) / _ScreenParams.xy; 101 | 102 | float4 vPosition = UnityPixelSnap(UnityObjectToClipPos(vert)); 103 | 104 | fixed4 faceColor = v.color; 105 | faceColor *= _FaceColor; 106 | 107 | v2f OUT; 108 | OUT.vertex = vPosition; 109 | OUT.color = faceColor; 110 | OUT.texcoord0 = v.texcoord0; 111 | OUT.texcoord1 = TRANSFORM_TEX(UnpackUV(v.texcoord1), _FaceTex); 112 | float2 pixelSize = vPosition.w; 113 | pixelSize /= abs(float2(_ScreenParams.x * UNITY_MATRIX_P[0][0], _ScreenParams.y * UNITY_MATRIX_P[1][1])); 114 | 115 | // Clamp _ClipRect to 16bit. 116 | float4 clampedRect = clamp(_ClipRect, -2e10, 2e10); 117 | OUT.mask = float4(vert.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * half2(_MaskSoftnessX, _MaskSoftnessY) + pixelSize.xy)); 118 | 119 | return OUT; 120 | } 121 | 122 | fixed4 frag (v2f IN) : SV_Target 123 | { 124 | fixed4 color = tex2D(_MainTex, IN.texcoord0) * tex2D(_FaceTex, IN.texcoord1) * IN.color; 125 | 126 | // Alternative implementation to UnityGet2DClipping with support for softness. 127 | #if UNITY_UI_CLIP_RECT 128 | half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(IN.mask.xy)) * IN.mask.zw); 129 | color *= m.x * m.y; 130 | #endif 131 | 132 | #if UNITY_UI_ALPHACLIP 133 | clip(color.a - 0.001); 134 | #endif 135 | 136 | return color; 137 | } 138 | ENDCG 139 | } 140 | } 141 | 142 | CustomEditor "TMPro.EditorUtilities.TMP_BitmapShaderGUI" 143 | } 144 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Custom-Atlas.shader.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 48bb5f55d8670e349b6e614913f9d910 3 | ShaderImporter: 4 | externalObjects: {} 5 | defaultTextures: [] 6 | nonModifiableTextures: [] 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Mobile.shader: -------------------------------------------------------------------------------- 1 | Shader "TextMeshPro/Mobile/Bitmap" { 2 | 3 | Properties { 4 | _MainTex ("Font Atlas", 2D) = "white" {} 5 | [HDR]_Color ("Text Color", Color) = (1,1,1,1) 6 | _DiffusePower ("Diffuse Power", Range(1.0,4.0)) = 1.0 7 | 8 | _VertexOffsetX("Vertex OffsetX", float) = 0 9 | _VertexOffsetY("Vertex OffsetY", float) = 0 10 | _MaskSoftnessX("Mask SoftnessX", float) = 0 11 | _MaskSoftnessY("Mask SoftnessY", float) = 0 12 | 13 | _ClipRect("Clip Rect", vector) = (-32767, -32767, 32767, 32767) 14 | 15 | _StencilComp("Stencil Comparison", Float) = 8 16 | _Stencil("Stencil ID", Float) = 0 17 | _StencilOp("Stencil Operation", Float) = 0 18 | _StencilWriteMask("Stencil Write Mask", Float) = 255 19 | _StencilReadMask("Stencil Read Mask", Float) = 255 20 | 21 | _CullMode("Cull Mode", Float) = 0 22 | _ColorMask("Color Mask", Float) = 15 23 | } 24 | 25 | SubShader { 26 | 27 | Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" } 28 | 29 | Stencil 30 | { 31 | Ref[_Stencil] 32 | Comp[_StencilComp] 33 | Pass[_StencilOp] 34 | ReadMask[_StencilReadMask] 35 | WriteMask[_StencilWriteMask] 36 | } 37 | 38 | 39 | Lighting Off 40 | Cull [_CullMode] 41 | ZTest [unity_GUIZTestMode] 42 | ZWrite Off 43 | Fog { Mode Off } 44 | Blend SrcAlpha OneMinusSrcAlpha 45 | ColorMask[_ColorMask] 46 | 47 | Pass { 48 | CGPROGRAM 49 | #pragma vertex vert 50 | #pragma fragment frag 51 | #pragma fragmentoption ARB_precision_hint_fastest 52 | 53 | #pragma multi_compile __ UNITY_UI_CLIP_RECT 54 | #pragma multi_compile __ UNITY_UI_ALPHACLIP 55 | 56 | 57 | #include "UnityCG.cginc" 58 | 59 | struct appdata_t { 60 | float4 vertex : POSITION; 61 | fixed4 color : COLOR; 62 | float2 texcoord0 : TEXCOORD0; 63 | float2 texcoord1 : TEXCOORD1; 64 | }; 65 | 66 | struct v2f { 67 | float4 vertex : POSITION; 68 | fixed4 color : COLOR; 69 | float2 texcoord0 : TEXCOORD0; 70 | float4 mask : TEXCOORD2; 71 | }; 72 | 73 | sampler2D _MainTex; 74 | fixed4 _Color; 75 | float _DiffusePower; 76 | 77 | uniform float _VertexOffsetX; 78 | uniform float _VertexOffsetY; 79 | uniform float4 _ClipRect; 80 | uniform float _MaskSoftnessX; 81 | uniform float _MaskSoftnessY; 82 | 83 | v2f vert (appdata_t v) 84 | { 85 | v2f OUT; 86 | float4 vert = v.vertex; 87 | vert.x += _VertexOffsetX; 88 | vert.y += _VertexOffsetY; 89 | 90 | vert.xy += (vert.w * 0.5) / _ScreenParams.xy; 91 | 92 | OUT.vertex = UnityPixelSnap(UnityObjectToClipPos(vert)); 93 | OUT.color = v.color; 94 | OUT.color *= _Color; 95 | OUT.color.rgb *= _DiffusePower; 96 | OUT.texcoord0 = v.texcoord0; 97 | 98 | float2 pixelSize = OUT.vertex.w; 99 | //pixelSize /= abs(float2(_ScreenParams.x * UNITY_MATRIX_P[0][0], _ScreenParams.y * UNITY_MATRIX_P[1][1])); 100 | 101 | // Clamp _ClipRect to 16bit. 102 | float4 clampedRect = clamp(_ClipRect, -2e10, 2e10); 103 | OUT.mask = float4(vert.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * half2(_MaskSoftnessX, _MaskSoftnessY) + pixelSize.xy)); 104 | 105 | return OUT; 106 | } 107 | 108 | fixed4 frag (v2f IN) : COLOR 109 | { 110 | fixed4 color = fixed4(IN.color.rgb, IN.color.a * tex2D(_MainTex, IN.texcoord0).a); 111 | 112 | // Alternative implementation to UnityGet2DClipping with support for softness. 113 | #if UNITY_UI_CLIP_RECT 114 | half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(IN.mask.xy)) * IN.mask.zw); 115 | color *= m.x * m.y; 116 | #endif 117 | 118 | #if UNITY_UI_ALPHACLIP 119 | clip(color.a - 0.001); 120 | #endif 121 | 122 | return color; 123 | } 124 | ENDCG 125 | } 126 | } 127 | 128 | SubShader { 129 | Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" } 130 | Lighting Off Cull Off ZTest Always ZWrite Off Fog { Mode Off } 131 | Blend SrcAlpha OneMinusSrcAlpha 132 | BindChannels { 133 | Bind "Color", color 134 | Bind "Vertex", vertex 135 | Bind "TexCoord", texcoord0 136 | } 137 | Pass { 138 | SetTexture [_MainTex] { 139 | constantColor [_Color] combine constant * primary, constant * texture 140 | } 141 | } 142 | } 143 | 144 | CustomEditor "TMPro.EditorUtilities.TMP_BitmapShaderGUI" 145 | } 146 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Mobile.shader.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 1e3b057af24249748ff873be7fafee47 3 | ShaderImporter: 4 | externalObjects: {} 5 | defaultTextures: [] 6 | nonModifiableTextures: [] 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMP_Bitmap.shader: -------------------------------------------------------------------------------- 1 | Shader "TextMeshPro/Bitmap" { 2 | 3 | Properties { 4 | _MainTex ("Font Atlas", 2D) = "white" {} 5 | _FaceTex ("Font Texture", 2D) = "white" {} 6 | [HDR]_FaceColor ("Text Color", Color) = (1,1,1,1) 7 | 8 | _VertexOffsetX ("Vertex OffsetX", float) = 0 9 | _VertexOffsetY ("Vertex OffsetY", float) = 0 10 | _MaskSoftnessX ("Mask SoftnessX", float) = 0 11 | _MaskSoftnessY ("Mask SoftnessY", float) = 0 12 | 13 | _ClipRect("Clip Rect", vector) = (-32767, -32767, 32767, 32767) 14 | 15 | _StencilComp("Stencil Comparison", Float) = 8 16 | _Stencil("Stencil ID", Float) = 0 17 | _StencilOp("Stencil Operation", Float) = 0 18 | _StencilWriteMask("Stencil Write Mask", Float) = 255 19 | _StencilReadMask("Stencil Read Mask", Float) = 255 20 | 21 | _CullMode("Cull Mode", Float) = 0 22 | _ColorMask("Color Mask", Float) = 15 23 | } 24 | 25 | SubShader{ 26 | 27 | Tags { "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" } 28 | 29 | Stencil 30 | { 31 | Ref[_Stencil] 32 | Comp[_StencilComp] 33 | Pass[_StencilOp] 34 | ReadMask[_StencilReadMask] 35 | WriteMask[_StencilWriteMask] 36 | } 37 | 38 | 39 | Lighting Off 40 | Cull [_CullMode] 41 | ZTest [unity_GUIZTestMode] 42 | ZWrite Off 43 | Fog { Mode Off } 44 | Blend SrcAlpha OneMinusSrcAlpha 45 | ColorMask[_ColorMask] 46 | 47 | Pass { 48 | CGPROGRAM 49 | #pragma vertex vert 50 | #pragma fragment frag 51 | 52 | #pragma multi_compile __ UNITY_UI_CLIP_RECT 53 | #pragma multi_compile __ UNITY_UI_ALPHACLIP 54 | 55 | 56 | #include "UnityCG.cginc" 57 | 58 | struct appdata_t { 59 | float4 vertex : POSITION; 60 | fixed4 color : COLOR; 61 | float2 texcoord0 : TEXCOORD0; 62 | float2 texcoord1 : TEXCOORD1; 63 | }; 64 | 65 | struct v2f { 66 | float4 vertex : SV_POSITION; 67 | fixed4 color : COLOR; 68 | float2 texcoord0 : TEXCOORD0; 69 | float2 texcoord1 : TEXCOORD1; 70 | float4 mask : TEXCOORD2; 71 | }; 72 | 73 | uniform sampler2D _MainTex; 74 | uniform sampler2D _FaceTex; 75 | uniform float4 _FaceTex_ST; 76 | uniform fixed4 _FaceColor; 77 | 78 | uniform float _VertexOffsetX; 79 | uniform float _VertexOffsetY; 80 | uniform float4 _ClipRect; 81 | uniform float _MaskSoftnessX; 82 | uniform float _MaskSoftnessY; 83 | 84 | float2 UnpackUV(float uv) 85 | { 86 | float2 output; 87 | output.x = floor(uv / 4096); 88 | output.y = uv - 4096 * output.x; 89 | 90 | return output * 0.001953125; 91 | } 92 | 93 | v2f vert (appdata_t v) 94 | { 95 | float4 vert = v.vertex; 96 | vert.x += _VertexOffsetX; 97 | vert.y += _VertexOffsetY; 98 | 99 | vert.xy += (vert.w * 0.5) / _ScreenParams.xy; 100 | 101 | float4 vPosition = UnityPixelSnap(UnityObjectToClipPos(vert)); 102 | 103 | fixed4 faceColor = v.color; 104 | faceColor *= _FaceColor; 105 | 106 | v2f OUT; 107 | OUT.vertex = vPosition; 108 | OUT.color = faceColor; 109 | OUT.texcoord0 = v.texcoord0; 110 | OUT.texcoord1 = TRANSFORM_TEX(UnpackUV(v.texcoord1), _FaceTex); 111 | float2 pixelSize = vPosition.w; 112 | pixelSize /= abs(float2(_ScreenParams.x * UNITY_MATRIX_P[0][0], _ScreenParams.y * UNITY_MATRIX_P[1][1])); 113 | 114 | // Clamp _ClipRect to 16bit. 115 | float4 clampedRect = clamp(_ClipRect, -2e10, 2e10); 116 | OUT.mask = float4(vert.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * half2(_MaskSoftnessX, _MaskSoftnessY) + pixelSize.xy)); 117 | 118 | return OUT; 119 | } 120 | 121 | fixed4 frag (v2f IN) : SV_Target 122 | { 123 | fixed4 color = tex2D(_MainTex, IN.texcoord0); 124 | color = fixed4 (tex2D(_FaceTex, IN.texcoord1).rgb * IN.color.rgb, IN.color.a * color.a); 125 | 126 | // Alternative implementation to UnityGet2DClipping with support for softness. 127 | #if UNITY_UI_CLIP_RECT 128 | half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(IN.mask.xy)) * IN.mask.zw); 129 | color *= m.x * m.y; 130 | #endif 131 | 132 | #if UNITY_UI_ALPHACLIP 133 | clip(color.a - 0.001); 134 | #endif 135 | 136 | return color; 137 | } 138 | ENDCG 139 | } 140 | } 141 | 142 | CustomEditor "TMPro.EditorUtilities.TMP_BitmapShaderGUI" 143 | } 144 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMP_Bitmap.shader.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 128e987d567d4e2c824d754223b3f3b0 3 | ShaderImporter: 4 | externalObjects: {} 5 | defaultTextures: [] 6 | nonModifiableTextures: [] 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMP_SDF Overlay.shader.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: dd89cf5b9246416f84610a006f916af7 3 | ShaderImporter: 4 | externalObjects: {} 5 | defaultTextures: [] 6 | nonModifiableTextures: [] 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMP_SDF SSD.shader.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 14eb328de4b8eb245bb7cea29e4ac00b 3 | ShaderImporter: 4 | externalObjects: {} 5 | defaultTextures: [] 6 | nonModifiableTextures: [] 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Masking.shader: -------------------------------------------------------------------------------- 1 | // Simplified SDF shader: 2 | // - No Shading Option (bevel / bump / env map) 3 | // - No Glow Option 4 | // - Softness is applied on both side of the outline 5 | 6 | Shader "TextMeshPro/Mobile/Distance Field - Masking" { 7 | 8 | Properties { 9 | [HDR]_FaceColor ("Face Color", Color) = (1,1,1,1) 10 | _FaceDilate ("Face Dilate", Range(-1,1)) = 0 11 | 12 | [HDR]_OutlineColor ("Outline Color", Color) = (0,0,0,1) 13 | _OutlineWidth ("Outline Thickness", Range(0,1)) = 0 14 | _OutlineSoftness ("Outline Softness", Range(0,1)) = 0 15 | 16 | [HDR]_UnderlayColor ("Border Color", Color) = (0,0,0,.5) 17 | _UnderlayOffsetX ("Border OffsetX", Range(-1,1)) = 0 18 | _UnderlayOffsetY ("Border OffsetY", Range(-1,1)) = 0 19 | _UnderlayDilate ("Border Dilate", Range(-1,1)) = 0 20 | _UnderlaySoftness ("Border Softness", Range(0,1)) = 0 21 | 22 | _WeightNormal ("Weight Normal", float) = 0 23 | _WeightBold ("Weight Bold", float) = .5 24 | 25 | _ShaderFlags ("Flags", float) = 0 26 | _ScaleRatioA ("Scale RatioA", float) = 1 27 | _ScaleRatioB ("Scale RatioB", float) = 1 28 | _ScaleRatioC ("Scale RatioC", float) = 1 29 | 30 | _MainTex ("Font Atlas", 2D) = "white" {} 31 | _TextureWidth ("Texture Width", float) = 512 32 | _TextureHeight ("Texture Height", float) = 512 33 | _GradientScale ("Gradient Scale", float) = 5 34 | _ScaleX ("Scale X", float) = 1 35 | _ScaleY ("Scale Y", float) = 1 36 | _PerspectiveFilter ("Perspective Correction", Range(0, 1)) = 0.875 37 | _Sharpness ("Sharpness", Range(-1,1)) = 0 38 | 39 | _VertexOffsetX ("Vertex OffsetX", float) = 0 40 | _VertexOffsetY ("Vertex OffsetY", float) = 0 41 | 42 | _ClipRect ("Clip Rect", vector) = (-32767, -32767, 32767, 32767) 43 | _MaskSoftnessX ("Mask SoftnessX", float) = 0 44 | _MaskSoftnessY ("Mask SoftnessY", float) = 0 45 | _MaskTex ("Mask Texture", 2D) = "white" {} 46 | _MaskInverse ("Inverse", float) = 0 47 | _MaskEdgeColor ("Edge Color", Color) = (1,1,1,1) 48 | _MaskEdgeSoftness ("Edge Softness", Range(0, 1)) = 0.01 49 | _MaskWipeControl ("Wipe Position", Range(0, 1)) = 0.5 50 | 51 | _StencilComp ("Stencil Comparison", Float) = 8 52 | _Stencil ("Stencil ID", Float) = 0 53 | _StencilOp ("Stencil Operation", Float) = 0 54 | _StencilWriteMask ("Stencil Write Mask", Float) = 255 55 | _StencilReadMask ("Stencil Read Mask", Float) = 255 56 | 57 | _CullMode ("Cull Mode", Float) = 0 58 | _ColorMask ("Color Mask", Float) = 15 59 | } 60 | 61 | SubShader { 62 | Tags 63 | { 64 | "Queue"="Transparent" 65 | "IgnoreProjector"="True" 66 | "RenderType"="Transparent" 67 | } 68 | 69 | 70 | Stencil 71 | { 72 | Ref [_Stencil] 73 | Comp [_StencilComp] 74 | Pass [_StencilOp] 75 | ReadMask [_StencilReadMask] 76 | WriteMask [_StencilWriteMask] 77 | } 78 | 79 | Cull [_CullMode] 80 | ZWrite Off 81 | Lighting Off 82 | Fog { Mode Off } 83 | ZTest [unity_GUIZTestMode] 84 | Blend One OneMinusSrcAlpha 85 | ColorMask [_ColorMask] 86 | 87 | Pass { 88 | CGPROGRAM 89 | #pragma vertex VertShader 90 | #pragma fragment PixShader 91 | #pragma shader_feature __ OUTLINE_ON 92 | #pragma shader_feature __ UNDERLAY_ON UNDERLAY_INNER 93 | 94 | #pragma multi_compile __ UNITY_UI_CLIP_RECT 95 | #pragma multi_compile __ UNITY_UI_ALPHACLIP 96 | 97 | 98 | #include "UnityCG.cginc" 99 | #include "UnityUI.cginc" 100 | #include "TMPro_Properties.cginc" 101 | 102 | struct vertex_t { 103 | float4 vertex : POSITION; 104 | float3 normal : NORMAL; 105 | fixed4 color : COLOR; 106 | float2 texcoord0 : TEXCOORD0; 107 | float2 texcoord1 : TEXCOORD1; 108 | }; 109 | 110 | struct pixel_t { 111 | float4 vertex : SV_POSITION; 112 | fixed4 faceColor : COLOR; 113 | fixed4 outlineColor : COLOR1; 114 | float4 texcoord0 : TEXCOORD0; // Texture UV, Mask UV 115 | half4 param : TEXCOORD1; // Scale(x), BiasIn(y), BiasOut(z), Bias(w) 116 | half4 mask : TEXCOORD2; // Position in clip space(xy), Softness(zw) 117 | #if (UNDERLAY_ON | UNDERLAY_INNER) 118 | float4 texcoord1 : TEXCOORD3; // Texture UV, alpha, reserved 119 | half2 underlayParam : TEXCOORD4; // Scale(x), Bias(y) 120 | #endif 121 | }; 122 | 123 | float _MaskWipeControl; 124 | float _MaskEdgeSoftness; 125 | fixed4 _MaskEdgeColor; 126 | bool _MaskInverse; 127 | 128 | pixel_t VertShader(vertex_t input) 129 | { 130 | float bold = step(input.texcoord1.y, 0); 131 | 132 | float4 vert = input.vertex; 133 | vert.x += _VertexOffsetX; 134 | vert.y += _VertexOffsetY; 135 | float4 vPosition = UnityObjectToClipPos(vert); 136 | 137 | float2 pixelSize = vPosition.w; 138 | pixelSize /= float2(_ScaleX, _ScaleY) * abs(mul((float2x2)UNITY_MATRIX_P, _ScreenParams.xy)); 139 | 140 | float scale = rsqrt(dot(pixelSize, pixelSize)); 141 | scale *= abs(input.texcoord1.y) * _GradientScale * (_Sharpness + 1); 142 | if(UNITY_MATRIX_P[3][3] == 0) scale = lerp(abs(scale) * (1 - _PerspectiveFilter), scale, abs(dot(UnityObjectToWorldNormal(input.normal.xyz), normalize(WorldSpaceViewDir(vert))))); 143 | 144 | float weight = lerp(_WeightNormal, _WeightBold, bold) / 4.0; 145 | weight = (weight + _FaceDilate) * _ScaleRatioA * 0.5; 146 | 147 | float layerScale = scale; 148 | 149 | scale /= 1 + (_OutlineSoftness * _ScaleRatioA * scale); 150 | float bias = (0.5 - weight) * scale - 0.5; 151 | float outline = _OutlineWidth * _ScaleRatioA * 0.5 * scale; 152 | 153 | float opacity = input.color.a; 154 | #if (UNDERLAY_ON | UNDERLAY_INNER) 155 | opacity = 1.0; 156 | #endif 157 | 158 | fixed4 faceColor = fixed4(input.color.rgb, opacity) * _FaceColor; 159 | faceColor.rgb *= faceColor.a; 160 | 161 | fixed4 outlineColor = _OutlineColor; 162 | outlineColor.a *= opacity; 163 | outlineColor.rgb *= outlineColor.a; 164 | outlineColor = lerp(faceColor, outlineColor, sqrt(min(1.0, (outline * 2)))); 165 | 166 | #if (UNDERLAY_ON | UNDERLAY_INNER) 167 | 168 | layerScale /= 1 + ((_UnderlaySoftness * _ScaleRatioC) * layerScale); 169 | float layerBias = (.5 - weight) * layerScale - .5 - ((_UnderlayDilate * _ScaleRatioC) * .5 * layerScale); 170 | 171 | float x = -(_UnderlayOffsetX * _ScaleRatioC) * _GradientScale / _TextureWidth; 172 | float y = -(_UnderlayOffsetY * _ScaleRatioC) * _GradientScale / _TextureHeight; 173 | float2 layerOffset = float2(x, y); 174 | #endif 175 | 176 | // Generate UV for the Masking Texture 177 | float4 clampedRect = clamp(_ClipRect, -2e10, 2e10); 178 | float2 maskUV = (vert.xy - clampedRect.xy) / (clampedRect.zw - clampedRect.xy); 179 | 180 | // Structure for pixel shader 181 | pixel_t output = { 182 | vPosition, 183 | faceColor, 184 | outlineColor, 185 | float4(input.texcoord0.x, input.texcoord0.y, maskUV.x, maskUV.y), 186 | half4(scale, bias - outline, bias + outline, bias), 187 | half4(vert.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * half2(_MaskSoftnessX, _MaskSoftnessY) + pixelSize.xy)), 188 | #if (UNDERLAY_ON | UNDERLAY_INNER) 189 | float4(input.texcoord0 + layerOffset, input.color.a, 0), 190 | half2(layerScale, layerBias), 191 | #endif 192 | }; 193 | 194 | return output; 195 | } 196 | 197 | 198 | // PIXEL SHADER 199 | fixed4 PixShader(pixel_t input) : SV_Target 200 | { 201 | half d = tex2D(_MainTex, input.texcoord0.xy).a * input.param.x; 202 | half4 c = input.faceColor * saturate(d - input.param.w); 203 | 204 | #ifdef OUTLINE_ON 205 | c = lerp(input.outlineColor, input.faceColor, saturate(d - input.param.z)); 206 | c *= saturate(d - input.param.y); 207 | #endif 208 | 209 | #if UNDERLAY_ON 210 | d = tex2D(_MainTex, input.texcoord1.xy).a * input.underlayParam.x; 211 | c += float4(_UnderlayColor.rgb * _UnderlayColor.a, _UnderlayColor.a) * saturate(d - input.underlayParam.y) * (1 - c.a); 212 | #endif 213 | 214 | #if UNDERLAY_INNER 215 | half sd = saturate(d - input.param.z); 216 | d = tex2D(_MainTex, input.texcoord1.xy).a * input.underlayParam.x; 217 | c += float4(_UnderlayColor.rgb * _UnderlayColor.a, _UnderlayColor.a) * (1 - saturate(d - input.underlayParam.y)) * sd * (1 - c.a); 218 | #endif 219 | 220 | // Alternative implementation to UnityGet2DClipping with support for softness. 221 | //#if UNITY_UI_CLIP_RECT 222 | half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(input.mask.xy)) * input.mask.zw); 223 | c *= m.x * m.y; 224 | //#endif 225 | 226 | float a = abs(_MaskInverse - tex2D(_MaskTex, input.texcoord0.zw).a); 227 | float t = a + (1 - _MaskWipeControl) * _MaskEdgeSoftness - _MaskWipeControl; 228 | a = saturate(t / _MaskEdgeSoftness); 229 | c.rgb = lerp(_MaskEdgeColor.rgb*c.a, c.rgb, a); 230 | c *= a; 231 | 232 | #if (UNDERLAY_ON | UNDERLAY_INNER) 233 | c *= input.texcoord1.z; 234 | #endif 235 | 236 | #if UNITY_UI_ALPHACLIP 237 | clip(c.a - 0.001); 238 | #endif 239 | 240 | return c; 241 | } 242 | ENDCG 243 | } 244 | } 245 | 246 | CustomEditor "TMPro.EditorUtilities.TMP_SDFShaderGUI" 247 | } 248 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Masking.shader.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: bc1ede39bf3643ee8e493720e4259791 3 | ShaderImporter: 4 | externalObjects: {} 5 | defaultTextures: [] 6 | nonModifiableTextures: [] 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Overlay.shader: -------------------------------------------------------------------------------- 1 | // Simplified SDF shader: 2 | // - No Shading Option (bevel / bump / env map) 3 | // - No Glow Option 4 | // - Softness is applied on both side of the outline 5 | 6 | Shader "TextMeshPro/Mobile/Distance Field Overlay" { 7 | 8 | Properties { 9 | [HDR]_FaceColor ("Face Color", Color) = (1,1,1,1) 10 | _FaceDilate ("Face Dilate", Range(-1,1)) = 0 11 | 12 | [HDR]_OutlineColor ("Outline Color", Color) = (0,0,0,1) 13 | _OutlineWidth ("Outline Thickness", Range(0,1)) = 0 14 | _OutlineSoftness ("Outline Softness", Range(0,1)) = 0 15 | 16 | [HDR]_UnderlayColor ("Border Color", Color) = (0,0,0,.5) 17 | _UnderlayOffsetX ("Border OffsetX", Range(-1,1)) = 0 18 | _UnderlayOffsetY ("Border OffsetY", Range(-1,1)) = 0 19 | _UnderlayDilate ("Border Dilate", Range(-1,1)) = 0 20 | _UnderlaySoftness ("Border Softness", Range(0,1)) = 0 21 | 22 | _WeightNormal ("Weight Normal", float) = 0 23 | _WeightBold ("Weight Bold", float) = .5 24 | 25 | _ShaderFlags ("Flags", float) = 0 26 | _ScaleRatioA ("Scale RatioA", float) = 1 27 | _ScaleRatioB ("Scale RatioB", float) = 1 28 | _ScaleRatioC ("Scale RatioC", float) = 1 29 | 30 | _MainTex ("Font Atlas", 2D) = "white" {} 31 | _TextureWidth ("Texture Width", float) = 512 32 | _TextureHeight ("Texture Height", float) = 512 33 | _GradientScale ("Gradient Scale", float) = 5 34 | _ScaleX ("Scale X", float) = 1 35 | _ScaleY ("Scale Y", float) = 1 36 | _PerspectiveFilter ("Perspective Correction", Range(0, 1)) = 0.875 37 | _Sharpness ("Sharpness", Range(-1,1)) = 0 38 | 39 | _VertexOffsetX ("Vertex OffsetX", float) = 0 40 | _VertexOffsetY ("Vertex OffsetY", float) = 0 41 | 42 | _ClipRect ("Clip Rect", vector) = (-32767, -32767, 32767, 32767) 43 | _MaskSoftnessX ("Mask SoftnessX", float) = 0 44 | _MaskSoftnessY ("Mask SoftnessY", float) = 0 45 | 46 | _StencilComp ("Stencil Comparison", Float) = 8 47 | _Stencil ("Stencil ID", Float) = 0 48 | _StencilOp ("Stencil Operation", Float) = 0 49 | _StencilWriteMask ("Stencil Write Mask", Float) = 255 50 | _StencilReadMask ("Stencil Read Mask", Float) = 255 51 | 52 | _CullMode ("Cull Mode", Float) = 0 53 | _ColorMask ("Color Mask", Float) = 15 54 | } 55 | 56 | SubShader { 57 | Tags 58 | { 59 | "Queue"="Overlay" 60 | "IgnoreProjector"="True" 61 | "RenderType"="Transparent" 62 | } 63 | 64 | 65 | Stencil 66 | { 67 | Ref [_Stencil] 68 | Comp [_StencilComp] 69 | Pass [_StencilOp] 70 | ReadMask [_StencilReadMask] 71 | WriteMask [_StencilWriteMask] 72 | } 73 | 74 | Cull [_CullMode] 75 | ZWrite Off 76 | Lighting Off 77 | Fog { Mode Off } 78 | ZTest Always 79 | Blend One OneMinusSrcAlpha 80 | ColorMask [_ColorMask] 81 | 82 | Pass { 83 | CGPROGRAM 84 | #pragma vertex VertShader 85 | #pragma fragment PixShader 86 | #pragma shader_feature __ OUTLINE_ON 87 | #pragma shader_feature __ UNDERLAY_ON UNDERLAY_INNER 88 | 89 | #pragma multi_compile __ UNITY_UI_CLIP_RECT 90 | #pragma multi_compile __ UNITY_UI_ALPHACLIP 91 | 92 | #include "UnityCG.cginc" 93 | #include "UnityUI.cginc" 94 | #include "TMPro_Properties.cginc" 95 | 96 | struct vertex_t { 97 | UNITY_VERTEX_INPUT_INSTANCE_ID 98 | float4 vertex : POSITION; 99 | float3 normal : NORMAL; 100 | fixed4 color : COLOR; 101 | float2 texcoord0 : TEXCOORD0; 102 | float2 texcoord1 : TEXCOORD1; 103 | }; 104 | 105 | struct pixel_t { 106 | UNITY_VERTEX_INPUT_INSTANCE_ID 107 | UNITY_VERTEX_OUTPUT_STEREO 108 | float4 vertex : SV_POSITION; 109 | fixed4 faceColor : COLOR; 110 | fixed4 outlineColor : COLOR1; 111 | float4 texcoord0 : TEXCOORD0; // Texture UV, Mask UV 112 | half4 param : TEXCOORD1; // Scale(x), BiasIn(y), BiasOut(z), Bias(w) 113 | half4 mask : TEXCOORD2; // Position in clip space(xy), Softness(zw) 114 | #if (UNDERLAY_ON | UNDERLAY_INNER) 115 | float4 texcoord1 : TEXCOORD3; // Texture UV, alpha, reserved 116 | half2 underlayParam : TEXCOORD4; // Scale(x), Bias(y) 117 | #endif 118 | }; 119 | 120 | 121 | pixel_t VertShader(vertex_t input) 122 | { 123 | pixel_t output; 124 | 125 | UNITY_INITIALIZE_OUTPUT(pixel_t, output); 126 | UNITY_SETUP_INSTANCE_ID(input); 127 | UNITY_TRANSFER_INSTANCE_ID(input, output); 128 | UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output); 129 | 130 | float bold = step(input.texcoord1.y, 0); 131 | 132 | float4 vert = input.vertex; 133 | vert.x += _VertexOffsetX; 134 | vert.y += _VertexOffsetY; 135 | float4 vPosition = UnityObjectToClipPos(vert); 136 | 137 | float2 pixelSize = vPosition.w; 138 | pixelSize /= float2(_ScaleX, _ScaleY) * abs(mul((float2x2)UNITY_MATRIX_P, _ScreenParams.xy)); 139 | 140 | float scale = rsqrt(dot(pixelSize, pixelSize)); 141 | scale *= abs(input.texcoord1.y) * _GradientScale * (_Sharpness + 1); 142 | if(UNITY_MATRIX_P[3][3] == 0) scale = lerp(abs(scale) * (1 - _PerspectiveFilter), scale, abs(dot(UnityObjectToWorldNormal(input.normal.xyz), normalize(WorldSpaceViewDir(vert))))); 143 | 144 | float weight = lerp(_WeightNormal, _WeightBold, bold) / 4.0; 145 | weight = (weight + _FaceDilate) * _ScaleRatioA * 0.5; 146 | 147 | float layerScale = scale; 148 | 149 | scale /= 1 + (_OutlineSoftness * _ScaleRatioA * scale); 150 | float bias = (0.5 - weight) * scale - 0.5; 151 | float outline = _OutlineWidth * _ScaleRatioA * 0.5 * scale; 152 | 153 | float opacity = input.color.a; 154 | #if (UNDERLAY_ON | UNDERLAY_INNER) 155 | opacity = 1.0; 156 | #endif 157 | 158 | fixed4 faceColor = fixed4(input.color.rgb, opacity) * _FaceColor; 159 | faceColor.rgb *= faceColor.a; 160 | 161 | fixed4 outlineColor = _OutlineColor; 162 | outlineColor.a *= opacity; 163 | outlineColor.rgb *= outlineColor.a; 164 | outlineColor = lerp(faceColor, outlineColor, sqrt(min(1.0, (outline * 2)))); 165 | 166 | #if (UNDERLAY_ON | UNDERLAY_INNER) 167 | layerScale /= 1 + ((_UnderlaySoftness * _ScaleRatioC) * layerScale); 168 | float layerBias = (.5 - weight) * layerScale - .5 - ((_UnderlayDilate * _ScaleRatioC) * .5 * layerScale); 169 | 170 | float x = -(_UnderlayOffsetX * _ScaleRatioC) * _GradientScale / _TextureWidth; 171 | float y = -(_UnderlayOffsetY * _ScaleRatioC) * _GradientScale / _TextureHeight; 172 | float2 layerOffset = float2(x, y); 173 | #endif 174 | 175 | // Generate UV for the Masking Texture 176 | float4 clampedRect = clamp(_ClipRect, -2e10, 2e10); 177 | float2 maskUV = (vert.xy - clampedRect.xy) / (clampedRect.zw - clampedRect.xy); 178 | 179 | // Populate structure for pixel shader 180 | output.vertex = vPosition; 181 | output.faceColor = faceColor; 182 | output.outlineColor = outlineColor; 183 | output.texcoord0 = float4(input.texcoord0.x, input.texcoord0.y, maskUV.x, maskUV.y); 184 | output.param = half4(scale, bias - outline, bias + outline, bias); 185 | output.mask = half4(vert.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * half2(_MaskSoftnessX, _MaskSoftnessY) + pixelSize.xy)); 186 | #if (UNDERLAY_ON || UNDERLAY_INNER) 187 | output.texcoord1 = float4(input.texcoord0 + layerOffset, input.color.a, 0); 188 | output.underlayParam = half2(layerScale, layerBias); 189 | #endif 190 | 191 | return output; 192 | } 193 | 194 | 195 | // PIXEL SHADER 196 | fixed4 PixShader(pixel_t input) : SV_Target 197 | { 198 | UNITY_SETUP_INSTANCE_ID(input); 199 | 200 | half d = tex2D(_MainTex, input.texcoord0.xy).a * input.param.x; 201 | half4 c = input.faceColor * saturate(d - input.param.w); 202 | 203 | #ifdef OUTLINE_ON 204 | c = lerp(input.outlineColor, input.faceColor, saturate(d - input.param.z)); 205 | c *= saturate(d - input.param.y); 206 | #endif 207 | 208 | #if UNDERLAY_ON 209 | d = tex2D(_MainTex, input.texcoord1.xy).a * input.underlayParam.x; 210 | c += float4(_UnderlayColor.rgb * _UnderlayColor.a, _UnderlayColor.a) * saturate(d - input.underlayParam.y) * (1 - c.a); 211 | #endif 212 | 213 | #if UNDERLAY_INNER 214 | half sd = saturate(d - input.param.z); 215 | d = tex2D(_MainTex, input.texcoord1.xy).a * input.underlayParam.x; 216 | c += float4(_UnderlayColor.rgb * _UnderlayColor.a, _UnderlayColor.a) * (1 - saturate(d - input.underlayParam.y)) * sd * (1 - c.a); 217 | #endif 218 | 219 | // Alternative implementation to UnityGet2DClipping with support for softness. 220 | #if UNITY_UI_CLIP_RECT 221 | half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(input.mask.xy)) * input.mask.zw); 222 | c *= m.x * m.y; 223 | #endif 224 | 225 | #if (UNDERLAY_ON | UNDERLAY_INNER) 226 | c *= input.texcoord1.z; 227 | #endif 228 | 229 | #if UNITY_UI_ALPHACLIP 230 | clip(c.a - 0.001); 231 | #endif 232 | 233 | return c; 234 | } 235 | ENDCG 236 | } 237 | } 238 | 239 | CustomEditor "TMPro.EditorUtilities.TMP_SDFShaderGUI" 240 | } 241 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Overlay.shader.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: a02a7d8c237544f1962732b55a9aebf1 3 | ShaderImporter: 4 | externalObjects: {} 5 | defaultTextures: [] 6 | nonModifiableTextures: [] 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile SSD.shader: -------------------------------------------------------------------------------- 1 | // Simplified SDF shader: 2 | // - No Shading Option (bevel / bump / env map) 3 | // - No Glow Option 4 | // - Softness is applied on both side of the outline 5 | 6 | Shader "TextMeshPro/Mobile/Distance Field SSD" { 7 | 8 | Properties { 9 | [HDR]_FaceColor ("Face Color", Color) = (1,1,1,1) 10 | _FaceDilate ("Face Dilate", Range(-1,1)) = 0 11 | 12 | [HDR]_OutlineColor ("Outline Color", Color) = (0,0,0,1) 13 | _OutlineWidth ("Outline Thickness", Range(0,1)) = 0 14 | _OutlineSoftness ("Outline Softness", Range(0,1)) = 0 15 | 16 | [HDR]_UnderlayColor ("Border Color", Color) = (0,0,0,.5) 17 | _UnderlayOffsetX ("Border OffsetX", Range(-1,1)) = 0 18 | _UnderlayOffsetY ("Border OffsetY", Range(-1,1)) = 0 19 | _UnderlayDilate ("Border Dilate", Range(-1,1)) = 0 20 | _UnderlaySoftness ("Border Softness", Range(0,1)) = 0 21 | 22 | _WeightNormal ("Weight Normal", float) = 0 23 | _WeightBold ("Weight Bold", float) = .5 24 | 25 | _ShaderFlags ("Flags", float) = 0 26 | _ScaleRatioA ("Scale RatioA", float) = 1 27 | _ScaleRatioB ("Scale RatioB", float) = 1 28 | _ScaleRatioC ("Scale RatioC", float) = 1 29 | 30 | _MainTex ("Font Atlas", 2D) = "white" {} 31 | _TextureWidth ("Texture Width", float) = 512 32 | _TextureHeight ("Texture Height", float) = 512 33 | _GradientScale ("Gradient Scale", float) = 5 34 | _ScaleX ("Scale X", float) = 1 35 | _ScaleY ("Scale Y", float) = 1 36 | _PerspectiveFilter ("Perspective Correction", Range(0, 1)) = 0.875 37 | _Sharpness ("Sharpness", Range(-1,1)) = 0 38 | 39 | _VertexOffsetX ("Vertex OffsetX", float) = 0 40 | _VertexOffsetY ("Vertex OffsetY", float) = 0 41 | 42 | _ClipRect ("Clip Rect", vector) = (-32767, -32767, 32767, 32767) 43 | _MaskSoftnessX ("Mask SoftnessX", float) = 0 44 | _MaskSoftnessY ("Mask SoftnessY", float) = 0 45 | _MaskTex ("Mask Texture", 2D) = "white" {} 46 | _MaskInverse ("Inverse", float) = 0 47 | _MaskEdgeColor ("Edge Color", Color) = (1,1,1,1) 48 | _MaskEdgeSoftness ("Edge Softness", Range(0, 1)) = 0.01 49 | _MaskWipeControl ("Wipe Position", Range(0, 1)) = 0.5 50 | 51 | _StencilComp ("Stencil Comparison", Float) = 8 52 | _Stencil ("Stencil ID", Float) = 0 53 | _StencilOp ("Stencil Operation", Float) = 0 54 | _StencilWriteMask ("Stencil Write Mask", Float) = 255 55 | _StencilReadMask ("Stencil Read Mask", Float) = 255 56 | 57 | _CullMode ("Cull Mode", Float) = 0 58 | _ColorMask ("Color Mask", Float) = 15 59 | } 60 | 61 | SubShader { 62 | Tags { 63 | "Queue"="Transparent" 64 | "IgnoreProjector"="True" 65 | "RenderType"="Transparent" 66 | } 67 | 68 | Stencil 69 | { 70 | Ref [_Stencil] 71 | Comp [_StencilComp] 72 | Pass [_StencilOp] 73 | ReadMask [_StencilReadMask] 74 | WriteMask [_StencilWriteMask] 75 | } 76 | 77 | Cull [_CullMode] 78 | ZWrite Off 79 | Lighting Off 80 | Fog { Mode Off } 81 | ZTest [unity_GUIZTestMode] 82 | Blend One OneMinusSrcAlpha 83 | ColorMask [_ColorMask] 84 | 85 | Pass { 86 | CGPROGRAM 87 | #pragma vertex VertShader 88 | #pragma fragment PixShader 89 | #pragma shader_feature __ OUTLINE_ON 90 | #pragma shader_feature __ UNDERLAY_ON UNDERLAY_INNER 91 | 92 | #pragma multi_compile __ UNITY_UI_CLIP_RECT 93 | #pragma multi_compile __ UNITY_UI_ALPHACLIP 94 | 95 | #include "UnityCG.cginc" 96 | #include "UnityUI.cginc" 97 | #include "TMPro_Properties.cginc" 98 | 99 | #include "TMPro_Mobile.cginc" 100 | 101 | ENDCG 102 | } 103 | } 104 | 105 | CustomEditor "TMPro.EditorUtilities.TMP_SDFShaderGUI" 106 | } 107 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile SSD.shader.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: c8d12adcee749c344b8117cf7c7eb912 3 | ShaderImporter: 4 | externalObjects: {} 5 | defaultTextures: [] 6 | nonModifiableTextures: [] 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile.shader: -------------------------------------------------------------------------------- 1 | // Simplified SDF shader: 2 | // - No Shading Option (bevel / bump / env map) 3 | // - No Glow Option 4 | // - Softness is applied on both side of the outline 5 | 6 | Shader "TextMeshPro/Mobile/Distance Field" { 7 | 8 | Properties { 9 | [HDR]_FaceColor ("Face Color", Color) = (1,1,1,1) 10 | _FaceDilate ("Face Dilate", Range(-1,1)) = 0 11 | 12 | [HDR]_OutlineColor ("Outline Color", Color) = (0,0,0,1) 13 | _OutlineWidth ("Outline Thickness", Range(0,1)) = 0 14 | _OutlineSoftness ("Outline Softness", Range(0,1)) = 0 15 | 16 | [HDR]_UnderlayColor ("Border Color", Color) = (0,0,0,.5) 17 | _UnderlayOffsetX ("Border OffsetX", Range(-1,1)) = 0 18 | _UnderlayOffsetY ("Border OffsetY", Range(-1,1)) = 0 19 | _UnderlayDilate ("Border Dilate", Range(-1,1)) = 0 20 | _UnderlaySoftness ("Border Softness", Range(0,1)) = 0 21 | 22 | _WeightNormal ("Weight Normal", float) = 0 23 | _WeightBold ("Weight Bold", float) = .5 24 | 25 | _ShaderFlags ("Flags", float) = 0 26 | _ScaleRatioA ("Scale RatioA", float) = 1 27 | _ScaleRatioB ("Scale RatioB", float) = 1 28 | _ScaleRatioC ("Scale RatioC", float) = 1 29 | 30 | _MainTex ("Font Atlas", 2D) = "white" {} 31 | _TextureWidth ("Texture Width", float) = 512 32 | _TextureHeight ("Texture Height", float) = 512 33 | _GradientScale ("Gradient Scale", float) = 5 34 | _ScaleX ("Scale X", float) = 1 35 | _ScaleY ("Scale Y", float) = 1 36 | _PerspectiveFilter ("Perspective Correction", Range(0, 1)) = 0.875 37 | _Sharpness ("Sharpness", Range(-1,1)) = 0 38 | 39 | _VertexOffsetX ("Vertex OffsetX", float) = 0 40 | _VertexOffsetY ("Vertex OffsetY", float) = 0 41 | 42 | _ClipRect ("Clip Rect", vector) = (-32767, -32767, 32767, 32767) 43 | _MaskSoftnessX ("Mask SoftnessX", float) = 0 44 | _MaskSoftnessY ("Mask SoftnessY", float) = 0 45 | 46 | _StencilComp ("Stencil Comparison", Float) = 8 47 | _Stencil ("Stencil ID", Float) = 0 48 | _StencilOp ("Stencil Operation", Float) = 0 49 | _StencilWriteMask ("Stencil Write Mask", Float) = 255 50 | _StencilReadMask ("Stencil Read Mask", Float) = 255 51 | 52 | _CullMode ("Cull Mode", Float) = 0 53 | _ColorMask ("Color Mask", Float) = 15 54 | } 55 | 56 | SubShader { 57 | Tags 58 | { 59 | "Queue"="Transparent" 60 | "IgnoreProjector"="True" 61 | "RenderType"="Transparent" 62 | } 63 | 64 | 65 | Stencil 66 | { 67 | Ref [_Stencil] 68 | Comp [_StencilComp] 69 | Pass [_StencilOp] 70 | ReadMask [_StencilReadMask] 71 | WriteMask [_StencilWriteMask] 72 | } 73 | 74 | Cull [_CullMode] 75 | ZWrite Off 76 | Lighting Off 77 | Fog { Mode Off } 78 | ZTest [unity_GUIZTestMode] 79 | Blend One OneMinusSrcAlpha 80 | ColorMask [_ColorMask] 81 | 82 | Pass { 83 | CGPROGRAM 84 | #pragma vertex VertShader 85 | #pragma fragment PixShader 86 | #pragma shader_feature __ OUTLINE_ON 87 | #pragma shader_feature __ UNDERLAY_ON UNDERLAY_INNER 88 | 89 | #pragma multi_compile __ UNITY_UI_CLIP_RECT 90 | #pragma multi_compile __ UNITY_UI_ALPHACLIP 91 | 92 | #include "UnityCG.cginc" 93 | #include "UnityUI.cginc" 94 | #include "TMPro_Properties.cginc" 95 | 96 | struct vertex_t { 97 | UNITY_VERTEX_INPUT_INSTANCE_ID 98 | float4 vertex : POSITION; 99 | float3 normal : NORMAL; 100 | fixed4 color : COLOR; 101 | float2 texcoord0 : TEXCOORD0; 102 | float2 texcoord1 : TEXCOORD1; 103 | }; 104 | 105 | struct pixel_t { 106 | UNITY_VERTEX_INPUT_INSTANCE_ID 107 | UNITY_VERTEX_OUTPUT_STEREO 108 | float4 vertex : SV_POSITION; 109 | fixed4 faceColor : COLOR; 110 | fixed4 outlineColor : COLOR1; 111 | float4 texcoord0 : TEXCOORD0; // Texture UV, Mask UV 112 | half4 param : TEXCOORD1; // Scale(x), BiasIn(y), BiasOut(z), Bias(w) 113 | half4 mask : TEXCOORD2; // Position in clip space(xy), Softness(zw) 114 | #if (UNDERLAY_ON | UNDERLAY_INNER) 115 | float4 texcoord1 : TEXCOORD3; // Texture UV, alpha, reserved 116 | half2 underlayParam : TEXCOORD4; // Scale(x), Bias(y) 117 | #endif 118 | }; 119 | 120 | 121 | pixel_t VertShader(vertex_t input) 122 | { 123 | pixel_t output; 124 | 125 | UNITY_INITIALIZE_OUTPUT(pixel_t, output); 126 | UNITY_SETUP_INSTANCE_ID(input); 127 | UNITY_TRANSFER_INSTANCE_ID(input, output); 128 | UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output); 129 | 130 | float bold = step(input.texcoord1.y, 0); 131 | 132 | float4 vert = input.vertex; 133 | vert.x += _VertexOffsetX; 134 | vert.y += _VertexOffsetY; 135 | float4 vPosition = UnityObjectToClipPos(vert); 136 | 137 | float2 pixelSize = vPosition.w; 138 | pixelSize /= float2(_ScaleX, _ScaleY) * abs(mul((float2x2)UNITY_MATRIX_P, _ScreenParams.xy)); 139 | 140 | float scale = rsqrt(dot(pixelSize, pixelSize)); 141 | scale *= abs(input.texcoord1.y) * _GradientScale * (_Sharpness + 1); 142 | if(UNITY_MATRIX_P[3][3] == 0) scale = lerp(abs(scale) * (1 - _PerspectiveFilter), scale, abs(dot(UnityObjectToWorldNormal(input.normal.xyz), normalize(WorldSpaceViewDir(vert))))); 143 | 144 | float weight = lerp(_WeightNormal, _WeightBold, bold) / 4.0; 145 | weight = (weight + _FaceDilate) * _ScaleRatioA * 0.5; 146 | 147 | float layerScale = scale; 148 | 149 | scale /= 1 + (_OutlineSoftness * _ScaleRatioA * scale); 150 | float bias = (0.5 - weight) * scale - 0.5; 151 | float outline = _OutlineWidth * _ScaleRatioA * 0.5 * scale; 152 | 153 | float opacity = input.color.a; 154 | #if (UNDERLAY_ON | UNDERLAY_INNER) 155 | opacity = 1.0; 156 | #endif 157 | 158 | fixed4 faceColor = fixed4(input.color.rgb, opacity) * _FaceColor; 159 | faceColor.rgb *= faceColor.a; 160 | 161 | fixed4 outlineColor = _OutlineColor; 162 | outlineColor.a *= opacity; 163 | outlineColor.rgb *= outlineColor.a; 164 | outlineColor = lerp(faceColor, outlineColor, sqrt(min(1.0, (outline * 2)))); 165 | 166 | #if (UNDERLAY_ON | UNDERLAY_INNER) 167 | layerScale /= 1 + ((_UnderlaySoftness * _ScaleRatioC) * layerScale); 168 | float layerBias = (.5 - weight) * layerScale - .5 - ((_UnderlayDilate * _ScaleRatioC) * .5 * layerScale); 169 | 170 | float x = -(_UnderlayOffsetX * _ScaleRatioC) * _GradientScale / _TextureWidth; 171 | float y = -(_UnderlayOffsetY * _ScaleRatioC) * _GradientScale / _TextureHeight; 172 | float2 layerOffset = float2(x, y); 173 | #endif 174 | 175 | // Generate UV for the Masking Texture 176 | float4 clampedRect = clamp(_ClipRect, -2e10, 2e10); 177 | float2 maskUV = (vert.xy - clampedRect.xy) / (clampedRect.zw - clampedRect.xy); 178 | 179 | // Populate structure for pixel shader 180 | output.vertex = vPosition; 181 | output.faceColor = faceColor; 182 | output.outlineColor = outlineColor; 183 | output.texcoord0 = float4(input.texcoord0.x, input.texcoord0.y, maskUV.x, maskUV.y); 184 | output.param = half4(scale, bias - outline, bias + outline, bias); 185 | output.mask = half4(vert.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * half2(_MaskSoftnessX, _MaskSoftnessY) + pixelSize.xy)); 186 | #if (UNDERLAY_ON || UNDERLAY_INNER) 187 | output.texcoord1 = float4(input.texcoord0 + layerOffset, input.color.a, 0); 188 | output.underlayParam = half2(layerScale, layerBias); 189 | #endif 190 | 191 | return output; 192 | } 193 | 194 | 195 | // PIXEL SHADER 196 | fixed4 PixShader(pixel_t input) : SV_Target 197 | { 198 | UNITY_SETUP_INSTANCE_ID(input); 199 | 200 | half d = tex2D(_MainTex, input.texcoord0.xy).a * input.param.x; 201 | half4 c = input.faceColor * saturate(d - input.param.w); 202 | 203 | #ifdef OUTLINE_ON 204 | c = lerp(input.outlineColor, input.faceColor, saturate(d - input.param.z)); 205 | c *= saturate(d - input.param.y); 206 | #endif 207 | 208 | #if UNDERLAY_ON 209 | d = tex2D(_MainTex, input.texcoord1.xy).a * input.underlayParam.x; 210 | c += float4(_UnderlayColor.rgb * _UnderlayColor.a, _UnderlayColor.a) * saturate(d - input.underlayParam.y) * (1 - c.a); 211 | #endif 212 | 213 | #if UNDERLAY_INNER 214 | half sd = saturate(d - input.param.z); 215 | d = tex2D(_MainTex, input.texcoord1.xy).a * input.underlayParam.x; 216 | c += float4(_UnderlayColor.rgb * _UnderlayColor.a, _UnderlayColor.a) * (1 - saturate(d - input.underlayParam.y)) * sd * (1 - c.a); 217 | #endif 218 | 219 | // Alternative implementation to UnityGet2DClipping with support for softness. 220 | #if UNITY_UI_CLIP_RECT 221 | half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(input.mask.xy)) * input.mask.zw); 222 | c *= m.x * m.y; 223 | #endif 224 | 225 | #if (UNDERLAY_ON | UNDERLAY_INNER) 226 | c *= input.texcoord1.z; 227 | #endif 228 | 229 | #if UNITY_UI_ALPHACLIP 230 | clip(c.a - 0.001); 231 | #endif 232 | 233 | return c; 234 | } 235 | ENDCG 236 | } 237 | } 238 | 239 | CustomEditor "TMPro.EditorUtilities.TMP_SDFShaderGUI" 240 | } 241 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile.shader.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: fe393ace9b354375a9cb14cdbbc28be4 3 | ShaderImporter: 4 | externalObjects: {} 5 | defaultTextures: [] 6 | nonModifiableTextures: [] 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface-Mobile.shader: -------------------------------------------------------------------------------- 1 | // Simplified version of the SDF Surface shader : 2 | // - No support for Bevel, Bump or envmap 3 | // - Diffuse only lighting 4 | // - Fully supports only 1 directional light. Other lights can affect it, but it will be per-vertex/SH. 5 | 6 | Shader "TextMeshPro/Mobile/Distance Field (Surface)" { 7 | 8 | Properties { 9 | _FaceTex ("Fill Texture", 2D) = "white" {} 10 | [HDR]_FaceColor ("Fill Color", Color) = (1,1,1,1) 11 | _FaceDilate ("Face Dilate", Range(-1,1)) = 0 12 | 13 | [HDR]_OutlineColor ("Outline Color", Color) = (0,0,0,1) 14 | _OutlineTex ("Outline Texture", 2D) = "white" {} 15 | _OutlineWidth ("Outline Thickness", Range(0, 1)) = 0 16 | _OutlineSoftness ("Outline Softness", Range(0,1)) = 0 17 | 18 | [HDR]_GlowColor ("Color", Color) = (0, 1, 0, 0.5) 19 | _GlowOffset ("Offset", Range(-1,1)) = 0 20 | _GlowInner ("Inner", Range(0,1)) = 0.05 21 | _GlowOuter ("Outer", Range(0,1)) = 0.05 22 | _GlowPower ("Falloff", Range(1, 0)) = 0.75 23 | 24 | _WeightNormal ("Weight Normal", float) = 0 25 | _WeightBold ("Weight Bold", float) = 0.5 26 | 27 | // Should not be directly exposed to the user 28 | _ShaderFlags ("Flags", float) = 0 29 | _ScaleRatioA ("Scale RatioA", float) = 1 30 | _ScaleRatioB ("Scale RatioB", float) = 1 31 | _ScaleRatioC ("Scale RatioC", float) = 1 32 | 33 | _MainTex ("Font Atlas", 2D) = "white" {} 34 | _TextureWidth ("Texture Width", float) = 512 35 | _TextureHeight ("Texture Height", float) = 512 36 | _GradientScale ("Gradient Scale", float) = 5.0 37 | _ScaleX ("Scale X", float) = 1.0 38 | _ScaleY ("Scale Y", float) = 1.0 39 | _PerspectiveFilter ("Perspective Correction", Range(0, 1)) = 0.875 40 | _Sharpness ("Sharpness", Range(-1,1)) = 0 41 | 42 | _VertexOffsetX ("Vertex OffsetX", float) = 0 43 | _VertexOffsetY ("Vertex OffsetY", float) = 0 44 | 45 | _CullMode ("Cull Mode", Float) = 0 46 | //_MaskCoord ("Mask Coords", vector) = (0,0,0,0) 47 | //_MaskSoftness ("Mask Softness", float) = 0 48 | } 49 | 50 | SubShader { 51 | 52 | Tags { 53 | "Queue"="Transparent" 54 | "IgnoreProjector"="True" 55 | "RenderType"="Transparent" 56 | } 57 | 58 | LOD 300 59 | Cull [_CullMode] 60 | 61 | CGPROGRAM 62 | #pragma surface PixShader Lambert alpha:blend vertex:VertShader noforwardadd nolightmap nodirlightmap 63 | #pragma target 3.0 64 | #pragma shader_feature __ GLOW_ON 65 | 66 | #include "TMPro_Properties.cginc" 67 | #include "TMPro.cginc" 68 | 69 | half _FaceShininess; 70 | half _OutlineShininess; 71 | 72 | struct Input 73 | { 74 | fixed4 color : COLOR; 75 | float2 uv_MainTex; 76 | float2 uv2_FaceTex; 77 | float2 uv2_OutlineTex; 78 | float2 param; // Weight, Scale 79 | float3 viewDirEnv; 80 | }; 81 | 82 | #include "TMPro_Surface.cginc" 83 | 84 | ENDCG 85 | 86 | // Pass to render object as a shadow caster 87 | Pass 88 | { 89 | Name "Caster" 90 | Tags { "LightMode" = "ShadowCaster" } 91 | Offset 1, 1 92 | 93 | Fog {Mode Off} 94 | ZWrite On ZTest LEqual Cull Off 95 | 96 | CGPROGRAM 97 | #pragma vertex vert 98 | #pragma fragment frag 99 | #pragma multi_compile_shadowcaster 100 | #include "UnityCG.cginc" 101 | 102 | struct v2f { 103 | V2F_SHADOW_CASTER; 104 | float2 uv : TEXCOORD1; 105 | float2 uv2 : TEXCOORD3; 106 | float alphaClip : TEXCOORD2; 107 | }; 108 | 109 | uniform float4 _MainTex_ST; 110 | uniform float4 _OutlineTex_ST; 111 | float _OutlineWidth; 112 | float _FaceDilate; 113 | float _ScaleRatioA; 114 | 115 | v2f vert( appdata_base v ) 116 | { 117 | v2f o; 118 | TRANSFER_SHADOW_CASTER(o) 119 | o.uv = TRANSFORM_TEX(v.texcoord, _MainTex); 120 | o.uv2 = TRANSFORM_TEX(v.texcoord, _OutlineTex); 121 | o.alphaClip = o.alphaClip = (1.0 - _OutlineWidth * _ScaleRatioA - _FaceDilate * _ScaleRatioA) / 2; 122 | return o; 123 | } 124 | 125 | uniform sampler2D _MainTex; 126 | 127 | float4 frag(v2f i) : COLOR 128 | { 129 | fixed4 texcol = tex2D(_MainTex, i.uv).a; 130 | clip(texcol.a - i.alphaClip); 131 | SHADOW_CASTER_FRAGMENT(i) 132 | } 133 | ENDCG 134 | } 135 | } 136 | 137 | CustomEditor "TMPro.EditorUtilities.TMP_SDFShaderGUI" 138 | } 139 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface-Mobile.shader.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 85187c2149c549c5b33f0cdb02836b17 3 | ShaderImporter: 4 | externalObjects: {} 5 | defaultTextures: [] 6 | nonModifiableTextures: [] 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface.shader: -------------------------------------------------------------------------------- 1 | Shader "TextMeshPro/Distance Field (Surface)" { 2 | 3 | Properties { 4 | _FaceTex ("Fill Texture", 2D) = "white" {} 5 | _FaceUVSpeedX ("Face UV Speed X", Range(-5, 5)) = 0.0 6 | _FaceUVSpeedY ("Face UV Speed Y", Range(-5, 5)) = 0.0 7 | [HDR]_FaceColor ("Fill Color", Color) = (1,1,1,1) 8 | _FaceDilate ("Face Dilate", Range(-1,1)) = 0 9 | 10 | [HDR]_OutlineColor ("Outline Color", Color) = (0,0,0,1) 11 | _OutlineTex ("Outline Texture", 2D) = "white" {} 12 | _OutlineUVSpeedX ("Outline UV Speed X", Range(-5, 5)) = 0.0 13 | _OutlineUVSpeedY ("Outline UV Speed Y", Range(-5, 5)) = 0.0 14 | _OutlineWidth ("Outline Thickness", Range(0, 1)) = 0 15 | _OutlineSoftness ("Outline Softness", Range(0,1)) = 0 16 | 17 | _Bevel ("Bevel", Range(0,1)) = 0.5 18 | _BevelOffset ("Bevel Offset", Range(-0.5,0.5)) = 0 19 | _BevelWidth ("Bevel Width", Range(-.5,0.5)) = 0 20 | _BevelClamp ("Bevel Clamp", Range(0,1)) = 0 21 | _BevelRoundness ("Bevel Roundness", Range(0,1)) = 0 22 | 23 | _BumpMap ("Normalmap", 2D) = "bump" {} 24 | _BumpOutline ("Bump Outline", Range(0,1)) = 0.5 25 | _BumpFace ("Bump Face", Range(0,1)) = 0.5 26 | 27 | _ReflectFaceColor ("Face Color", Color) = (0,0,0,1) 28 | _ReflectOutlineColor ("Outline Color", Color) = (0,0,0,1) 29 | _Cube ("Reflection Cubemap", Cube) = "black" { /* TexGen CubeReflect */ } 30 | _EnvMatrixRotation ("Texture Rotation", vector) = (0, 0, 0, 0) 31 | [HDR]_SpecColor ("Specular Color", Color) = (0,0,0,1) 32 | 33 | _FaceShininess ("Face Shininess", Range(0,1)) = 0 34 | _OutlineShininess ("Outline Shininess", Range(0,1)) = 0 35 | 36 | [HDR]_GlowColor ("Color", Color) = (0, 1, 0, 0.5) 37 | _GlowOffset ("Offset", Range(-1,1)) = 0 38 | _GlowInner ("Inner", Range(0,1)) = 0.05 39 | _GlowOuter ("Outer", Range(0,1)) = 0.05 40 | _GlowPower ("Falloff", Range(1, 0)) = 0.75 41 | 42 | _WeightNormal ("Weight Normal", float) = 0 43 | _WeightBold ("Weight Bold", float) = 0.5 44 | 45 | // Should not be directly exposed to the user 46 | _ShaderFlags ("Flags", float) = 0 47 | _ScaleRatioA ("Scale RatioA", float) = 1 48 | _ScaleRatioB ("Scale RatioB", float) = 1 49 | _ScaleRatioC ("Scale RatioC", float) = 1 50 | 51 | _MainTex ("Font Atlas", 2D) = "white" {} 52 | _TextureWidth ("Texture Width", float) = 512 53 | _TextureHeight ("Texture Height", float) = 512 54 | _GradientScale ("Gradient Scale", float) = 5.0 55 | _ScaleX ("Scale X", float) = 1.0 56 | _ScaleY ("Scale Y", float) = 1.0 57 | _PerspectiveFilter ("Perspective Correction", Range(0, 1)) = 0.875 58 | _Sharpness ("Sharpness", Range(-1,1)) = 0 59 | 60 | _VertexOffsetX ("Vertex OffsetX", float) = 0 61 | _VertexOffsetY ("Vertex OffsetY", float) = 0 62 | 63 | _CullMode ("Cull Mode", Float) = 0 64 | //_MaskCoord ("Mask Coords", vector) = (0,0,0,0) 65 | //_MaskSoftness ("Mask Softness", float) = 0 66 | } 67 | 68 | SubShader { 69 | 70 | Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" } 71 | 72 | LOD 300 73 | Cull [_CullMode] 74 | 75 | CGPROGRAM 76 | #pragma surface PixShader BlinnPhong alpha:blend vertex:VertShader nolightmap nodirlightmap 77 | #pragma target 3.0 78 | #pragma shader_feature __ GLOW_ON 79 | #pragma glsl 80 | 81 | #include "TMPro_Properties.cginc" 82 | #include "TMPro.cginc" 83 | 84 | half _FaceShininess; 85 | half _OutlineShininess; 86 | 87 | struct Input 88 | { 89 | fixed4 color : COLOR; 90 | float2 uv_MainTex; 91 | float2 uv2_FaceTex; 92 | float2 uv2_OutlineTex; 93 | float2 param; // Weight, Scale 94 | float3 viewDirEnv; 95 | }; 96 | 97 | 98 | #define BEVEL_ON 1 99 | #include "TMPro_Surface.cginc" 100 | 101 | ENDCG 102 | 103 | // Pass to render object as a shadow caster 104 | Pass 105 | { 106 | Name "Caster" 107 | Tags { "LightMode" = "ShadowCaster" } 108 | Offset 1, 1 109 | 110 | Fog {Mode Off} 111 | ZWrite On 112 | ZTest LEqual 113 | Cull Off 114 | 115 | CGPROGRAM 116 | #pragma vertex vert 117 | #pragma fragment frag 118 | #pragma multi_compile_shadowcaster 119 | #include "UnityCG.cginc" 120 | 121 | struct v2f { 122 | V2F_SHADOW_CASTER; 123 | float2 uv : TEXCOORD1; 124 | float2 uv2 : TEXCOORD3; 125 | float alphaClip : TEXCOORD2; 126 | }; 127 | 128 | uniform float4 _MainTex_ST; 129 | uniform float4 _OutlineTex_ST; 130 | float _OutlineWidth; 131 | float _FaceDilate; 132 | float _ScaleRatioA; 133 | 134 | v2f vert( appdata_base v ) 135 | { 136 | v2f o; 137 | TRANSFER_SHADOW_CASTER(o) 138 | o.uv = TRANSFORM_TEX(v.texcoord, _MainTex); 139 | o.uv2 = TRANSFORM_TEX(v.texcoord, _OutlineTex); 140 | o.alphaClip = (1.0 - _OutlineWidth * _ScaleRatioA - _FaceDilate * _ScaleRatioA) / 2; 141 | return o; 142 | } 143 | 144 | uniform sampler2D _MainTex; 145 | 146 | float4 frag(v2f i) : COLOR 147 | { 148 | fixed4 texcol = tex2D(_MainTex, i.uv).a; 149 | clip(texcol.a - i.alphaClip); 150 | SHADOW_CASTER_FRAGMENT(i) 151 | } 152 | ENDCG 153 | } 154 | } 155 | 156 | CustomEditor "TMPro.EditorUtilities.TMP_SDFShaderGUI" 157 | } 158 | 159 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface.shader.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: f7ada0af4f174f0694ca6a487b8f543d 3 | ShaderImporter: 4 | externalObjects: {} 5 | defaultTextures: [] 6 | nonModifiableTextures: [] 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMP_SDF.shader.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 68e6db2ebdc24f95958faec2be5558d6 3 | ShaderImporter: 4 | externalObjects: {} 5 | defaultTextures: [] 6 | nonModifiableTextures: [] 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMP_Sprite.shader: -------------------------------------------------------------------------------- 1 | Shader "TextMeshPro/Sprite" 2 | { 3 | Properties 4 | { 5 | [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {} 6 | _Color ("Tint", Color) = (1,1,1,1) 7 | 8 | _StencilComp ("Stencil Comparison", Float) = 8 9 | _Stencil ("Stencil ID", Float) = 0 10 | _StencilOp ("Stencil Operation", Float) = 0 11 | _StencilWriteMask ("Stencil Write Mask", Float) = 255 12 | _StencilReadMask ("Stencil Read Mask", Float) = 255 13 | 14 | _CullMode ("Cull Mode", Float) = 0 15 | _ColorMask ("Color Mask", Float) = 15 16 | _ClipRect ("Clip Rect", vector) = (-32767, -32767, 32767, 32767) 17 | 18 | [Toggle(UNITY_UI_ALPHACLIP)] _UseUIAlphaClip ("Use Alpha Clip", Float) = 0 19 | } 20 | 21 | SubShader 22 | { 23 | Tags 24 | { 25 | "Queue"="Transparent" 26 | "IgnoreProjector"="True" 27 | "RenderType"="Transparent" 28 | "PreviewType"="Plane" 29 | "CanUseSpriteAtlas"="True" 30 | } 31 | 32 | Stencil 33 | { 34 | Ref [_Stencil] 35 | Comp [_StencilComp] 36 | Pass [_StencilOp] 37 | ReadMask [_StencilReadMask] 38 | WriteMask [_StencilWriteMask] 39 | } 40 | 41 | Cull [_CullMode] 42 | Lighting Off 43 | ZWrite Off 44 | ZTest [unity_GUIZTestMode] 45 | Blend SrcAlpha OneMinusSrcAlpha 46 | ColorMask [_ColorMask] 47 | 48 | Pass 49 | { 50 | Name "Default" 51 | CGPROGRAM 52 | #pragma vertex vert 53 | #pragma fragment frag 54 | #pragma target 2.0 55 | 56 | #include "UnityCG.cginc" 57 | #include "UnityUI.cginc" 58 | 59 | #pragma multi_compile __ UNITY_UI_CLIP_RECT 60 | #pragma multi_compile __ UNITY_UI_ALPHACLIP 61 | 62 | struct appdata_t 63 | { 64 | float4 vertex : POSITION; 65 | float4 color : COLOR; 66 | float2 texcoord : TEXCOORD0; 67 | UNITY_VERTEX_INPUT_INSTANCE_ID 68 | }; 69 | 70 | struct v2f 71 | { 72 | float4 vertex : SV_POSITION; 73 | fixed4 color : COLOR; 74 | float2 texcoord : TEXCOORD0; 75 | float4 worldPosition : TEXCOORD1; 76 | UNITY_VERTEX_OUTPUT_STEREO 77 | }; 78 | 79 | sampler2D _MainTex; 80 | fixed4 _Color; 81 | fixed4 _TextureSampleAdd; 82 | float4 _ClipRect; 83 | float4 _MainTex_ST; 84 | 85 | v2f vert(appdata_t v) 86 | { 87 | v2f OUT; 88 | UNITY_SETUP_INSTANCE_ID(v); 89 | UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT); 90 | OUT.worldPosition = v.vertex; 91 | OUT.vertex = UnityObjectToClipPos(OUT.worldPosition); 92 | 93 | OUT.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex); 94 | 95 | OUT.color = v.color * _Color; 96 | return OUT; 97 | } 98 | 99 | fixed4 frag(v2f IN) : SV_Target 100 | { 101 | half4 color = (tex2D(_MainTex, IN.texcoord) + _TextureSampleAdd) * IN.color; 102 | 103 | #ifdef UNITY_UI_CLIP_RECT 104 | color.a *= UnityGet2DClipping(IN.worldPosition.xy, _ClipRect); 105 | #endif 106 | 107 | #ifdef UNITY_UI_ALPHACLIP 108 | clip (color.a - 0.001); 109 | #endif 110 | 111 | return color; 112 | } 113 | ENDCG 114 | } 115 | } 116 | } 117 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMP_Sprite.shader.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: cf81c85f95fe47e1a27f6ae460cf182c 3 | ShaderImporter: 4 | externalObjects: {} 5 | defaultTextures: [] 6 | nonModifiableTextures: [] 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMPro.cginc: -------------------------------------------------------------------------------- 1 | float2 UnpackUV(float uv) 2 | { 3 | float2 output; 4 | output.x = floor(uv / 4096); 5 | output.y = uv - 4096 * output.x; 6 | 7 | return output * 0.001953125; 8 | } 9 | 10 | fixed4 GetColor(half d, fixed4 faceColor, fixed4 outlineColor, half outline, half softness) 11 | { 12 | half faceAlpha = 1-saturate((d - outline * 0.5 + softness * 0.5) / (1.0 + softness)); 13 | half outlineAlpha = saturate((d + outline * 0.5)) * sqrt(min(1.0, outline)); 14 | 15 | faceColor.rgb *= faceColor.a; 16 | outlineColor.rgb *= outlineColor.a; 17 | 18 | faceColor = lerp(faceColor, outlineColor, outlineAlpha); 19 | 20 | faceColor *= faceAlpha; 21 | 22 | return faceColor; 23 | } 24 | 25 | float3 GetSurfaceNormal(float4 h, float bias) 26 | { 27 | bool raisedBevel = step(1, fmod(_ShaderFlags, 2)); 28 | 29 | h += bias+_BevelOffset; 30 | 31 | float bevelWidth = max(.01, _OutlineWidth+_BevelWidth); 32 | 33 | // Track outline 34 | h -= .5; 35 | h /= bevelWidth; 36 | h = saturate(h+.5); 37 | 38 | if(raisedBevel) h = 1 - abs(h*2.0 - 1.0); 39 | h = lerp(h, sin(h*3.141592/2.0), _BevelRoundness); 40 | h = min(h, 1.0-_BevelClamp); 41 | h *= _Bevel * bevelWidth * _GradientScale * -2.0; 42 | 43 | float3 va = normalize(float3(1.0, 0.0, h.y - h.x)); 44 | float3 vb = normalize(float3(0.0, -1.0, h.w - h.z)); 45 | 46 | return cross(va, vb); 47 | } 48 | 49 | float3 GetSurfaceNormal(float2 uv, float bias, float3 delta) 50 | { 51 | // Read "height field" 52 | float4 h = {tex2D(_MainTex, uv - delta.xz).a, 53 | tex2D(_MainTex, uv + delta.xz).a, 54 | tex2D(_MainTex, uv - delta.zy).a, 55 | tex2D(_MainTex, uv + delta.zy).a}; 56 | 57 | return GetSurfaceNormal(h, bias); 58 | } 59 | 60 | float3 GetSpecular(float3 n, float3 l) 61 | { 62 | float spec = pow(max(0.0, dot(n, l)), _Reflectivity); 63 | return _SpecularColor.rgb * spec * _SpecularPower; 64 | } 65 | 66 | float4 GetGlowColor(float d, float scale) 67 | { 68 | float glow = d - (_GlowOffset*_ScaleRatioB) * 0.5 * scale; 69 | float t = lerp(_GlowInner, (_GlowOuter * _ScaleRatioB), step(0.0, glow)) * 0.5 * scale; 70 | glow = saturate(abs(glow/(1.0 + t))); 71 | glow = 1.0-pow(glow, _GlowPower); 72 | glow *= sqrt(min(1.0, t)); // Fade off glow thinner than 1 screen pixel 73 | return float4(_GlowColor.rgb, saturate(_GlowColor.a * glow * 2)); 74 | } 75 | 76 | float4 BlendARGB(float4 overlying, float4 underlying) 77 | { 78 | overlying.rgb *= overlying.a; 79 | underlying.rgb *= underlying.a; 80 | float3 blended = overlying.rgb + ((1-overlying.a)*underlying.rgb); 81 | float alpha = underlying.a + (1-underlying.a)*overlying.a; 82 | return float4(blended, alpha); 83 | } 84 | 85 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMPro.cginc.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 407bc68d299748449bbf7f48ee690f8d 3 | ShaderImporter: 4 | externalObjects: {} 5 | defaultTextures: [] 6 | nonModifiableTextures: [] 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMPro_Mobile.cginc: -------------------------------------------------------------------------------- 1 | struct vertex_t { 2 | UNITY_VERTEX_INPUT_INSTANCE_ID 3 | float4 position : POSITION; 4 | float3 normal : NORMAL; 5 | float4 color : COLOR; 6 | float2 texcoord0 : TEXCOORD0; 7 | float2 texcoord1 : TEXCOORD1; 8 | }; 9 | 10 | struct pixel_t { 11 | UNITY_VERTEX_INPUT_INSTANCE_ID 12 | UNITY_VERTEX_OUTPUT_STEREO 13 | float4 position : SV_POSITION; 14 | float4 faceColor : COLOR; 15 | float4 outlineColor : COLOR1; 16 | float4 texcoord0 : TEXCOORD0; 17 | float4 param : TEXCOORD1; // weight, scaleRatio 18 | float2 mask : TEXCOORD2; 19 | #if (UNDERLAY_ON || UNDERLAY_INNER) 20 | float4 texcoord2 : TEXCOORD3; 21 | float4 underlayColor : COLOR2; 22 | #endif 23 | }; 24 | 25 | float4 SRGBToLinear(float4 rgba) { 26 | return float4(lerp(rgba.rgb / 12.92f, pow((rgba.rgb + 0.055f) / 1.055f, 2.4f), step(0.04045f, rgba.rgb)), rgba.a); 27 | } 28 | 29 | pixel_t VertShader(vertex_t input) 30 | { 31 | pixel_t output; 32 | 33 | UNITY_INITIALIZE_OUTPUT(pixel_t, output); 34 | UNITY_SETUP_INSTANCE_ID(input); 35 | UNITY_TRANSFER_INSTANCE_ID(input, output); 36 | UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output); 37 | 38 | float bold = step(input.texcoord1.y, 0); 39 | 40 | float4 vert = input.position; 41 | vert.x += _VertexOffsetX; 42 | vert.y += _VertexOffsetY; 43 | 44 | float4 vPosition = UnityObjectToClipPos(vert); 45 | 46 | float weight = lerp(_WeightNormal, _WeightBold, bold) / 4.0; 47 | weight = (weight + _FaceDilate) * _ScaleRatioA * 0.5; 48 | 49 | // Generate UV for the Masking Texture 50 | float4 clampedRect = clamp(_ClipRect, -2e10, 2e10); 51 | float2 maskUV = (vert.xy - clampedRect.xy) / (clampedRect.zw - clampedRect.xy); 52 | 53 | float4 color = input.color; 54 | #if (FORCE_LINEAR && !UNITY_COLORSPACE_GAMMA) 55 | color = SRGBToLinear(input.color); 56 | #endif 57 | 58 | float opacity = color.a; 59 | #if (UNDERLAY_ON | UNDERLAY_INNER) 60 | opacity = 1.0; 61 | #endif 62 | 63 | float4 faceColor = float4(color.rgb, opacity) * _FaceColor; 64 | faceColor.rgb *= faceColor.a; 65 | 66 | float4 outlineColor = _OutlineColor; 67 | outlineColor.a *= opacity; 68 | outlineColor.rgb *= outlineColor.a; 69 | 70 | output.position = vPosition; 71 | output.faceColor = faceColor; 72 | output.outlineColor = outlineColor; 73 | output.texcoord0 = float4(input.texcoord0.xy, maskUV.xy); 74 | output.param = float4(0.5 - weight, 1.3333 * _GradientScale * (_Sharpness + 1) / _TextureWidth, _OutlineWidth * _ScaleRatioA * 0.5, 0); 75 | 76 | float2 mask = float2(0, 0); 77 | #if UNITY_UI_CLIP_RECT 78 | mask = vert.xy * 2 - clampedRect.xy - clampedRect.zw; 79 | #endif 80 | output.mask = mask; 81 | 82 | #if (UNDERLAY_ON || UNDERLAY_INNER) 83 | float4 underlayColor = _UnderlayColor; 84 | underlayColor.rgb *= underlayColor.a; 85 | 86 | float x = -(_UnderlayOffsetX * _ScaleRatioC) * _GradientScale / _TextureWidth; 87 | float y = -(_UnderlayOffsetY * _ScaleRatioC) * _GradientScale / _TextureHeight; 88 | 89 | output.texcoord2 = float4(input.texcoord0 + float2(x, y), input.color.a, 0); 90 | output.underlayColor = underlayColor; 91 | #endif 92 | 93 | return output; 94 | } 95 | 96 | float4 PixShader(pixel_t input) : SV_Target 97 | { 98 | UNITY_SETUP_INSTANCE_ID(input); 99 | 100 | float d = tex2D(_MainTex, input.texcoord0.xy).a; 101 | 102 | float2 UV = input.texcoord0.xy; 103 | float scale = rsqrt(abs(ddx(UV.x) * ddy(UV.y) - ddy(UV.x) * ddx(UV.y))) * input.param.y; 104 | 105 | #if (UNDERLAY_ON | UNDERLAY_INNER) 106 | float layerScale = scale; 107 | layerScale /= 1 + ((_UnderlaySoftness * _ScaleRatioC) * layerScale); 108 | float layerBias = input.param.x * layerScale - .5 - ((_UnderlayDilate * _ScaleRatioC) * .5 * layerScale); 109 | #endif 110 | 111 | scale /= 1 + (_OutlineSoftness * _ScaleRatioA * scale); 112 | 113 | float4 faceColor = input.faceColor * saturate((d - input.param.x) * scale + 0.5); 114 | 115 | #ifdef OUTLINE_ON 116 | float4 outlineColor = lerp(input.faceColor, input.outlineColor, sqrt(min(1.0, input.param.z * scale * 2))); 117 | faceColor = lerp(outlineColor, input.faceColor, saturate((d - input.param.x - input.param.z) * scale + 0.5)); 118 | faceColor *= saturate((d - input.param.x + input.param.z) * scale + 0.5); 119 | #endif 120 | 121 | #if UNDERLAY_ON 122 | d = tex2D(_MainTex, input.texcoord2.xy).a * layerScale; 123 | faceColor += float4(_UnderlayColor.rgb * _UnderlayColor.a, _UnderlayColor.a) * saturate(d - layerBias) * (1 - faceColor.a); 124 | #endif 125 | 126 | #if UNDERLAY_INNER 127 | float bias = input.param.x * scale - 0.5; 128 | float sd = saturate(d * scale - bias - input.param.z); 129 | d = tex2D(_MainTex, input.texcoord2.xy).a * layerScale; 130 | faceColor += float4(_UnderlayColor.rgb * _UnderlayColor.a, _UnderlayColor.a) * (1 - saturate(d - layerBias)) * sd * (1 - faceColor.a); 131 | #endif 132 | 133 | #ifdef MASKING 134 | float a = abs(_MaskInverse - tex2D(_MaskTex, input.texcoord0.zw).a); 135 | float t = a + (1 - _MaskWipeControl) * _MaskEdgeSoftness - _MaskWipeControl; 136 | a = saturate(t / _MaskEdgeSoftness); 137 | faceColor.rgb = lerp(_MaskEdgeColor.rgb * faceColor.a, faceColor.rgb, a); 138 | faceColor *= a; 139 | #endif 140 | 141 | // Alternative implementation to UnityGet2DClipping with support for softness 142 | #if UNITY_UI_CLIP_RECT 143 | float2 maskZW = 0.25 / (0.25 * half2(_MaskSoftnessX, _MaskSoftnessY) + (1 / scale)); 144 | float2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(input.mask.xy)) * maskZW); 145 | faceColor *= m.x * m.y; 146 | #endif 147 | 148 | #if (UNDERLAY_ON | UNDERLAY_INNER) 149 | faceColor *= input.texcoord2.z; 150 | #endif 151 | 152 | #if UNITY_UI_ALPHACLIP 153 | clip(faceColor.a - 0.001); 154 | #endif 155 | 156 | return faceColor; 157 | } 158 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMPro_Mobile.cginc.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: c334973cef89a9840b0b0c507e0377ab 3 | ShaderImporter: 4 | externalObjects: {} 5 | defaultTextures: [] 6 | nonModifiableTextures: [] 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMPro_Properties.cginc: -------------------------------------------------------------------------------- 1 | // UI Editable properties 2 | uniform sampler2D _FaceTex; // Alpha : Signed Distance 3 | uniform float _FaceUVSpeedX; 4 | uniform float _FaceUVSpeedY; 5 | uniform fixed4 _FaceColor; // RGBA : Color + Opacity 6 | uniform float _FaceDilate; // v[ 0, 1] 7 | uniform float _OutlineSoftness; // v[ 0, 1] 8 | 9 | uniform sampler2D _OutlineTex; // RGBA : Color + Opacity 10 | uniform float _OutlineUVSpeedX; 11 | uniform float _OutlineUVSpeedY; 12 | uniform fixed4 _OutlineColor; // RGBA : Color + Opacity 13 | uniform float _OutlineWidth; // v[ 0, 1] 14 | 15 | uniform float _Bevel; // v[ 0, 1] 16 | uniform float _BevelOffset; // v[-1, 1] 17 | uniform float _BevelWidth; // v[-1, 1] 18 | uniform float _BevelClamp; // v[ 0, 1] 19 | uniform float _BevelRoundness; // v[ 0, 1] 20 | 21 | uniform sampler2D _BumpMap; // Normal map 22 | uniform float _BumpOutline; // v[ 0, 1] 23 | uniform float _BumpFace; // v[ 0, 1] 24 | 25 | uniform samplerCUBE _Cube; // Cube / sphere map 26 | uniform fixed4 _ReflectFaceColor; // RGB intensity 27 | uniform fixed4 _ReflectOutlineColor; 28 | //uniform float _EnvTiltX; // v[-1, 1] 29 | //uniform float _EnvTiltY; // v[-1, 1] 30 | uniform float3 _EnvMatrixRotation; 31 | uniform float4x4 _EnvMatrix; 32 | 33 | uniform fixed4 _SpecularColor; // RGB intensity 34 | uniform float _LightAngle; // v[ 0,Tau] 35 | uniform float _SpecularPower; // v[ 0, 1] 36 | uniform float _Reflectivity; // v[ 5, 15] 37 | uniform float _Diffuse; // v[ 0, 1] 38 | uniform float _Ambient; // v[ 0, 1] 39 | 40 | uniform fixed4 _UnderlayColor; // RGBA : Color + Opacity 41 | uniform float _UnderlayOffsetX; // v[-1, 1] 42 | uniform float _UnderlayOffsetY; // v[-1, 1] 43 | uniform float _UnderlayDilate; // v[-1, 1] 44 | uniform float _UnderlaySoftness; // v[ 0, 1] 45 | 46 | uniform fixed4 _GlowColor; // RGBA : Color + Intesity 47 | uniform float _GlowOffset; // v[-1, 1] 48 | uniform float _GlowOuter; // v[ 0, 1] 49 | uniform float _GlowInner; // v[ 0, 1] 50 | uniform float _GlowPower; // v[ 1, 1/(1+4*4)] 51 | 52 | // API Editable properties 53 | uniform float _ShaderFlags; 54 | uniform float _WeightNormal; 55 | uniform float _WeightBold; 56 | 57 | uniform float _ScaleRatioA; 58 | uniform float _ScaleRatioB; 59 | uniform float _ScaleRatioC; 60 | 61 | uniform float _VertexOffsetX; 62 | uniform float _VertexOffsetY; 63 | 64 | //uniform float _UseClipRect; 65 | uniform float _MaskID; 66 | uniform sampler2D _MaskTex; 67 | uniform float4 _MaskCoord; 68 | uniform float4 _ClipRect; // bottom left(x,y) : top right(z,w) 69 | //uniform float _MaskWipeControl; 70 | //uniform float _MaskEdgeSoftness; 71 | //uniform fixed4 _MaskEdgeColor; 72 | //uniform bool _MaskInverse; 73 | 74 | uniform float _MaskSoftnessX; 75 | uniform float _MaskSoftnessY; 76 | 77 | // Font Atlas properties 78 | uniform sampler2D _MainTex; 79 | uniform float _TextureWidth; 80 | uniform float _TextureHeight; 81 | uniform float _GradientScale; 82 | uniform float _ScaleX; 83 | uniform float _ScaleY; 84 | uniform float _PerspectiveFilter; 85 | uniform float _Sharpness; 86 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMPro_Properties.cginc.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 3997e2241185407d80309a82f9148466 3 | ShaderImporter: 4 | externalObjects: {} 5 | defaultTextures: [] 6 | nonModifiableTextures: [] 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMPro_Surface.cginc: -------------------------------------------------------------------------------- 1 | void VertShader(inout appdata_full v, out Input data) 2 | { 3 | v.vertex.x += _VertexOffsetX; 4 | v.vertex.y += _VertexOffsetY; 5 | 6 | UNITY_INITIALIZE_OUTPUT(Input, data); 7 | 8 | float bold = step(v.texcoord1.y, 0); 9 | 10 | // Generate normal for backface 11 | float3 view = ObjSpaceViewDir(v.vertex); 12 | v.normal *= sign(dot(v.normal, view)); 13 | 14 | #if USE_DERIVATIVE 15 | data.param.y = 1; 16 | #else 17 | float4 vert = v.vertex; 18 | float4 vPosition = UnityObjectToClipPos(vert); 19 | float2 pixelSize = vPosition.w; 20 | 21 | pixelSize /= float2(_ScaleX, _ScaleY) * mul((float2x2)UNITY_MATRIX_P, _ScreenParams.xy); 22 | float scale = rsqrt(dot(pixelSize, pixelSize)); 23 | scale *= abs(v.texcoord1.y) * _GradientScale * (_Sharpness + 1); 24 | scale = lerp(scale * (1 - _PerspectiveFilter), scale, abs(dot(UnityObjectToWorldNormal(v.normal.xyz), normalize(WorldSpaceViewDir(vert))))); 25 | data.param.y = scale; 26 | #endif 27 | 28 | data.param.x = (lerp(_WeightNormal, _WeightBold, bold) / 4.0 + _FaceDilate) * _ScaleRatioA * 0.5; // 29 | 30 | v.texcoord1.xy = UnpackUV(v.texcoord1.x); 31 | data.viewDirEnv = mul((float3x3)_EnvMatrix, WorldSpaceViewDir(v.vertex)); 32 | } 33 | 34 | void PixShader(Input input, inout SurfaceOutput o) 35 | { 36 | 37 | #if USE_DERIVATIVE 38 | float2 pixelSize = float2(ddx(input.uv_MainTex.y), ddy(input.uv_MainTex.y)); 39 | pixelSize *= _TextureWidth * .75; 40 | float scale = rsqrt(dot(pixelSize, pixelSize)) * _GradientScale * (_Sharpness + 1); 41 | #else 42 | float scale = input.param.y; 43 | #endif 44 | 45 | // Signed distance 46 | float c = tex2D(_MainTex, input.uv_MainTex).a; 47 | float sd = (.5 - c - input.param.x) * scale + .5; 48 | float outline = _OutlineWidth*_ScaleRatioA * scale; 49 | float softness = _OutlineSoftness*_ScaleRatioA * scale; 50 | 51 | // Color & Alpha 52 | float4 faceColor = _FaceColor; 53 | float4 outlineColor = _OutlineColor; 54 | faceColor *= input.color; 55 | outlineColor.a *= input.color.a; 56 | faceColor *= tex2D(_FaceTex, float2(input.uv2_FaceTex.x + _FaceUVSpeedX * _Time.y, input.uv2_FaceTex.y + _FaceUVSpeedY * _Time.y)); 57 | outlineColor *= tex2D(_OutlineTex, float2(input.uv2_OutlineTex.x + _OutlineUVSpeedX * _Time.y, input.uv2_OutlineTex.y + _OutlineUVSpeedY * _Time.y)); 58 | faceColor = GetColor(sd, faceColor, outlineColor, outline, softness); 59 | faceColor.rgb /= max(faceColor.a, 0.0001); 60 | 61 | #if BEVEL_ON 62 | float3 delta = float3(1.0 / _TextureWidth, 1.0 / _TextureHeight, 0.0); 63 | 64 | float4 smp4x = {tex2D(_MainTex, input.uv_MainTex - delta.xz).a, 65 | tex2D(_MainTex, input.uv_MainTex + delta.xz).a, 66 | tex2D(_MainTex, input.uv_MainTex - delta.zy).a, 67 | tex2D(_MainTex, input.uv_MainTex + delta.zy).a }; 68 | 69 | // Face Normal 70 | float3 n = GetSurfaceNormal(smp4x, input.param.x); 71 | 72 | // Bumpmap 73 | float3 bump = UnpackNormal(tex2D(_BumpMap, input.uv2_FaceTex.xy)).xyz; 74 | bump *= lerp(_BumpFace, _BumpOutline, saturate(sd + outline * 0.5)); 75 | bump = lerp(float3(0, 0, 1), bump, faceColor.a); 76 | n = normalize(n - bump); 77 | 78 | // Cubemap reflection 79 | fixed4 reflcol = texCUBE(_Cube, reflect(input.viewDirEnv, mul((float3x3)unity_ObjectToWorld, n))); 80 | float3 emission = reflcol.rgb * lerp(_ReflectFaceColor.rgb, _ReflectOutlineColor.rgb, saturate(sd + outline * 0.5)) * faceColor.a; 81 | #else 82 | float3 n = float3(0, 0, -1); 83 | float3 emission = float3(0, 0, 0); 84 | #endif 85 | 86 | #if GLOW_ON 87 | float4 glowColor = GetGlowColor(sd, scale); 88 | glowColor.a *= input.color.a; 89 | emission += glowColor.rgb*glowColor.a; 90 | faceColor = BlendARGB(glowColor, faceColor); 91 | faceColor.rgb /= max(faceColor.a, 0.0001); 92 | #endif 93 | 94 | // Set Standard output structure 95 | o.Albedo = faceColor.rgb; 96 | o.Normal = -n; 97 | o.Emission = emission; 98 | o.Specular = lerp(_FaceShininess, _OutlineShininess, saturate(sd + outline * 0.5)); 99 | o.Gloss = 1; 100 | o.Alpha = faceColor.a; 101 | } 102 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMPro_Surface.cginc.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: d930090c0cd643c7b55f19a38538c162 3 | ShaderImporter: 4 | externalObjects: {} 5 | defaultTextures: [] 6 | nonModifiableTextures: [] 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Sprites.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: d0603b6d5186471b96c778c3949c7ce2 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Sprites/EmojiOne Attribution.txt: -------------------------------------------------------------------------------- 1 | This sample of beautiful emojis are provided by EmojiOne https://www.emojione.com/ 2 | 3 | Please visit their website to view the complete set of their emojis and review their licensing terms. -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Sprites/EmojiOne Attribution.txt.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 381dcb09d5029d14897e55f98031fca5 3 | TextScriptImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Sprites/EmojiOne.json: -------------------------------------------------------------------------------- 1 | {"frames": [ 2 | 3 | { 4 | "filename": "1f60a.png", 5 | "frame": {"x":0,"y":0,"w":128,"h":128}, 6 | "rotated": false, 7 | "trimmed": false, 8 | "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, 9 | "sourceSize": {"w":128,"h":128}, 10 | "pivot": {"x":0.5,"y":0.5} 11 | }, 12 | { 13 | "filename": "1f60b.png", 14 | "frame": {"x":128,"y":0,"w":128,"h":128}, 15 | "rotated": false, 16 | "trimmed": false, 17 | "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, 18 | "sourceSize": {"w":128,"h":128}, 19 | "pivot": {"x":0.5,"y":0.5} 20 | }, 21 | { 22 | "filename": "1f60d.png", 23 | "frame": {"x":256,"y":0,"w":128,"h":128}, 24 | "rotated": false, 25 | "trimmed": false, 26 | "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, 27 | "sourceSize": {"w":128,"h":128}, 28 | "pivot": {"x":0.5,"y":0.5} 29 | }, 30 | { 31 | "filename": "1f60e.png", 32 | "frame": {"x":384,"y":0,"w":128,"h":128}, 33 | "rotated": false, 34 | "trimmed": false, 35 | "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, 36 | "sourceSize": {"w":128,"h":128}, 37 | "pivot": {"x":0.5,"y":0.5} 38 | }, 39 | { 40 | "filename": "1f600.png", 41 | "frame": {"x":0,"y":128,"w":128,"h":128}, 42 | "rotated": false, 43 | "trimmed": false, 44 | "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, 45 | "sourceSize": {"w":128,"h":128}, 46 | "pivot": {"x":0.5,"y":0.5} 47 | }, 48 | { 49 | "filename": "1f601.png", 50 | "frame": {"x":128,"y":128,"w":128,"h":128}, 51 | "rotated": false, 52 | "trimmed": false, 53 | "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, 54 | "sourceSize": {"w":128,"h":128}, 55 | "pivot": {"x":0.5,"y":0.5} 56 | }, 57 | { 58 | "filename": "1f602.png", 59 | "frame": {"x":256,"y":128,"w":128,"h":128}, 60 | "rotated": false, 61 | "trimmed": false, 62 | "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, 63 | "sourceSize": {"w":128,"h":128}, 64 | "pivot": {"x":0.5,"y":0.5} 65 | }, 66 | { 67 | "filename": "1f603.png", 68 | "frame": {"x":384,"y":128,"w":128,"h":128}, 69 | "rotated": false, 70 | "trimmed": false, 71 | "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, 72 | "sourceSize": {"w":128,"h":128}, 73 | "pivot": {"x":0.5,"y":0.5} 74 | }, 75 | { 76 | "filename": "1f604.png", 77 | "frame": {"x":0,"y":256,"w":128,"h":128}, 78 | "rotated": false, 79 | "trimmed": false, 80 | "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, 81 | "sourceSize": {"w":128,"h":128}, 82 | "pivot": {"x":0.5,"y":0.5} 83 | }, 84 | { 85 | "filename": "1f605.png", 86 | "frame": {"x":128,"y":256,"w":128,"h":128}, 87 | "rotated": false, 88 | "trimmed": false, 89 | "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, 90 | "sourceSize": {"w":128,"h":128}, 91 | "pivot": {"x":0.5,"y":0.5} 92 | }, 93 | { 94 | "filename": "1f606.png", 95 | "frame": {"x":256,"y":256,"w":128,"h":128}, 96 | "rotated": false, 97 | "trimmed": false, 98 | "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, 99 | "sourceSize": {"w":128,"h":128}, 100 | "pivot": {"x":0.5,"y":0.5} 101 | }, 102 | { 103 | "filename": "1f609.png", 104 | "frame": {"x":384,"y":256,"w":128,"h":128}, 105 | "rotated": false, 106 | "trimmed": false, 107 | "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, 108 | "sourceSize": {"w":128,"h":128}, 109 | "pivot": {"x":0.5,"y":0.5} 110 | }, 111 | { 112 | "filename": "1f618.png", 113 | "frame": {"x":0,"y":384,"w":128,"h":128}, 114 | "rotated": false, 115 | "trimmed": false, 116 | "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, 117 | "sourceSize": {"w":128,"h":128}, 118 | "pivot": {"x":0.5,"y":0.5} 119 | }, 120 | { 121 | "filename": "1f923.png", 122 | "frame": {"x":128,"y":384,"w":128,"h":128}, 123 | "rotated": false, 124 | "trimmed": false, 125 | "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, 126 | "sourceSize": {"w":128,"h":128}, 127 | "pivot": {"x":0.5,"y":0.5} 128 | }, 129 | { 130 | "filename": "263a.png", 131 | "frame": {"x":256,"y":384,"w":128,"h":128}, 132 | "rotated": false, 133 | "trimmed": false, 134 | "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, 135 | "sourceSize": {"w":128,"h":128}, 136 | "pivot": {"x":0.5,"y":0.5} 137 | }, 138 | { 139 | "filename": "2639.png", 140 | "frame": {"x":384,"y":384,"w":128,"h":128}, 141 | "rotated": false, 142 | "trimmed": false, 143 | "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, 144 | "sourceSize": {"w":128,"h":128}, 145 | "pivot": {"x":0.5,"y":0.5} 146 | }], 147 | "meta": { 148 | "app": "http://www.codeandweb.com/texturepacker", 149 | "version": "1.0", 150 | "image": "EmojiOne.png", 151 | "format": "RGBA8888", 152 | "size": {"w":512,"h":512}, 153 | "scale": "1", 154 | "smartupdate": "$TexturePacker:SmartUpdate:196a26a2e149d875b91ffc8fa3581e76:fc928c7e275404b7e0649307410475cb:424723c3774975ddb2053fd5c4b85f6e$" 155 | } 156 | } 157 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Sprites/EmojiOne.json.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 8f05276190cf498a8153f6cbe761d4e6 3 | timeCreated: 1480316860 4 | licenseType: Pro 5 | TextScriptImporter: 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Assets/TextMesh Pro/Sprites/EmojiOne.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lexonegit/Unity-Twitch-Chat/0c3e6e2950c760e542abdab75d18ff788b83881e/Unity-Twitch-Chat/Assets/TextMesh Pro/Sprites/EmojiOne.png -------------------------------------------------------------------------------- /Unity-Twitch-Chat/Packages/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "com.unity.ai.navigation": "1.1.5", 4 | "com.unity.collab-proxy": "2.4.4", 5 | "com.unity.feature.2d": "2.0.1", 6 | "com.unity.ide.rider": "3.0.31", 7 | "com.unity.ide.visualstudio": "2.0.22", 8 | "com.unity.ide.vscode": "1.2.5", 9 | "com.unity.test-framework": "1.1.33", 10 | "com.unity.textmeshpro": "3.0.6", 11 | "com.unity.timeline": "1.7.6", 12 | "com.unity.toolchain.win-x86_64-linux-x86_64": "2.0.9", 13 | "com.unity.ugui": "1.0.0", 14 | "com.unity.visualscripting": "1.9.4", 15 | "com.unity.modules.ai": "1.0.0", 16 | "com.unity.modules.androidjni": "1.0.0", 17 | "com.unity.modules.animation": "1.0.0", 18 | "com.unity.modules.assetbundle": "1.0.0", 19 | "com.unity.modules.audio": "1.0.0", 20 | "com.unity.modules.cloth": "1.0.0", 21 | "com.unity.modules.director": "1.0.0", 22 | "com.unity.modules.imageconversion": "1.0.0", 23 | "com.unity.modules.imgui": "1.0.0", 24 | "com.unity.modules.jsonserialize": "1.0.0", 25 | "com.unity.modules.particlesystem": "1.0.0", 26 | "com.unity.modules.physics": "1.0.0", 27 | "com.unity.modules.physics2d": "1.0.0", 28 | "com.unity.modules.screencapture": "1.0.0", 29 | "com.unity.modules.terrain": "1.0.0", 30 | "com.unity.modules.terrainphysics": "1.0.0", 31 | "com.unity.modules.tilemap": "1.0.0", 32 | "com.unity.modules.ui": "1.0.0", 33 | "com.unity.modules.uielements": "1.0.0", 34 | "com.unity.modules.umbra": "1.0.0", 35 | "com.unity.modules.unityanalytics": "1.0.0", 36 | "com.unity.modules.unitywebrequest": "1.0.0", 37 | "com.unity.modules.unitywebrequestassetbundle": "1.0.0", 38 | "com.unity.modules.unitywebrequestaudio": "1.0.0", 39 | "com.unity.modules.unitywebrequesttexture": "1.0.0", 40 | "com.unity.modules.unitywebrequestwww": "1.0.0", 41 | "com.unity.modules.vehicles": "1.0.0", 42 | "com.unity.modules.video": "1.0.0", 43 | "com.unity.modules.vr": "1.0.0", 44 | "com.unity.modules.wind": "1.0.0", 45 | "com.unity.modules.xr": "1.0.0" 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/ProjectSettings/AudioManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!11 &1 4 | AudioManager: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_Volume: 1 8 | Rolloff Scale: 1 9 | Doppler Factor: 1 10 | Default Speaker Mode: 2 11 | m_SampleRate: 0 12 | m_DSPBufferSize: 1024 13 | m_VirtualVoiceCount: 512 14 | m_RealVoiceCount: 32 15 | m_SpatializerPlugin: 16 | m_AmbisonicDecoderPlugin: 17 | m_DisableAudio: 0 18 | m_VirtualizeEffects: 1 19 | m_RequestedDSPBufferSize: 0 20 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/ProjectSettings/ClusterInputManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!236 &1 4 | ClusterInputManager: 5 | m_ObjectHideFlags: 0 6 | m_Inputs: [] 7 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/ProjectSettings/DynamicsManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!55 &1 4 | PhysicsManager: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 13 7 | m_Gravity: {x: 0, y: -9.81, z: 0} 8 | m_DefaultMaterial: {fileID: 0} 9 | m_BounceThreshold: 2 10 | m_DefaultMaxDepenetrationVelocity: 10 11 | m_SleepThreshold: 0.005 12 | m_DefaultContactOffset: 0.01 13 | m_DefaultSolverIterations: 6 14 | m_DefaultSolverVelocityIterations: 1 15 | m_QueriesHitBackfaces: 0 16 | m_QueriesHitTriggers: 1 17 | m_EnableAdaptiveForce: 0 18 | m_ClothInterCollisionDistance: 0.1 19 | m_ClothInterCollisionStiffness: 0.2 20 | m_ContactsGeneration: 1 21 | m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 22 | m_AutoSimulation: 1 23 | m_AutoSyncTransforms: 0 24 | m_ReuseCollisionCallbacks: 1 25 | m_ClothInterCollisionSettingsToggle: 0 26 | m_ClothGravity: {x: 0, y: -9.81, z: 0} 27 | m_ContactPairsMode: 0 28 | m_BroadphaseType: 0 29 | m_WorldBounds: 30 | m_Center: {x: 0, y: 0, z: 0} 31 | m_Extent: {x: 250, y: 250, z: 250} 32 | m_WorldSubdivisions: 8 33 | m_FrictionType: 0 34 | m_EnableEnhancedDeterminism: 0 35 | m_EnableUnifiedHeightmaps: 1 36 | m_SolverType: 0 37 | m_DefaultMaxAngularSpeed: 50 38 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/ProjectSettings/EditorBuildSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1045 &1 4 | EditorBuildSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_Scenes: 8 | - enabled: 1 9 | path: Assets/Scenes/SampleScene.unity 10 | guid: 2cda990e2423bbf4892e6590ba056729 11 | m_configObjects: {} 12 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/ProjectSettings/EditorSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!159 &1 4 | EditorSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 11 7 | m_SerializationMode: 2 8 | m_LineEndingsForNewScripts: 0 9 | m_DefaultBehaviorMode: 1 10 | m_PrefabRegularEnvironment: {fileID: 0} 11 | m_PrefabUIEnvironment: {fileID: 0} 12 | m_SpritePackerMode: 4 13 | m_SpritePackerPaddingPower: 1 14 | m_Bc7TextureCompressor: 0 15 | m_EtcTextureCompressorBehavior: 1 16 | m_EtcTextureFastCompressor: 1 17 | m_EtcTextureNormalCompressor: 2 18 | m_EtcTextureBestCompressor: 4 19 | m_ProjectGenerationIncludedExtensions: txt;xml;fnt;cd;asmdef;asmref;rsp 20 | m_ProjectGenerationRootNamespace: 21 | m_EnableTextureStreamingInEditMode: 1 22 | m_EnableTextureStreamingInPlayMode: 1 23 | m_AsyncShaderCompilation: 1 24 | m_CachingShaderPreprocessor: 1 25 | m_PrefabModeAllowAutoSave: 1 26 | m_EnterPlayModeOptionsEnabled: 1 27 | m_EnterPlayModeOptions: 3 28 | m_GameObjectNamingDigits: 1 29 | m_GameObjectNamingScheme: 0 30 | m_AssetNamingUsesSpace: 1 31 | m_UseLegacyProbeSampleCount: 0 32 | m_SerializeInlineMappingsOnOneLine: 1 33 | m_DisableCookiesInLightmapper: 1 34 | m_AssetPipelineMode: 1 35 | m_RefreshImportMode: 0 36 | m_CacheServerMode: 0 37 | m_CacheServerEndpoint: 38 | m_CacheServerNamespacePrefix: default 39 | m_CacheServerEnableDownload: 1 40 | m_CacheServerEnableUpload: 1 41 | m_CacheServerEnableAuth: 0 42 | m_CacheServerEnableTls: 0 43 | m_CacheServerValidationMode: 2 44 | m_CacheServerDownloadBatchSize: 128 45 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/ProjectSettings/GraphicsSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!30 &1 4 | GraphicsSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 13 7 | m_Deferred: 8 | m_Mode: 1 9 | m_Shader: {fileID: 69, guid: 0000000000000000f000000000000000, type: 0} 10 | m_DeferredReflections: 11 | m_Mode: 1 12 | m_Shader: {fileID: 74, guid: 0000000000000000f000000000000000, type: 0} 13 | m_ScreenSpaceShadows: 14 | m_Mode: 1 15 | m_Shader: {fileID: 64, guid: 0000000000000000f000000000000000, type: 0} 16 | m_LegacyDeferred: 17 | m_Mode: 1 18 | m_Shader: {fileID: 63, guid: 0000000000000000f000000000000000, type: 0} 19 | m_DepthNormals: 20 | m_Mode: 1 21 | m_Shader: {fileID: 62, guid: 0000000000000000f000000000000000, type: 0} 22 | m_MotionVectors: 23 | m_Mode: 1 24 | m_Shader: {fileID: 75, guid: 0000000000000000f000000000000000, type: 0} 25 | m_LightHalo: 26 | m_Mode: 1 27 | m_Shader: {fileID: 105, guid: 0000000000000000f000000000000000, type: 0} 28 | m_LensFlare: 29 | m_Mode: 1 30 | m_Shader: {fileID: 102, guid: 0000000000000000f000000000000000, type: 0} 31 | m_VideoShadersIncludeMode: 2 32 | m_AlwaysIncludedShaders: 33 | - {fileID: 7, guid: 0000000000000000f000000000000000, type: 0} 34 | - {fileID: 15104, guid: 0000000000000000f000000000000000, type: 0} 35 | - {fileID: 15105, guid: 0000000000000000f000000000000000, type: 0} 36 | - {fileID: 15106, guid: 0000000000000000f000000000000000, type: 0} 37 | - {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0} 38 | - {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0} 39 | - {fileID: 10783, guid: 0000000000000000f000000000000000, type: 0} 40 | m_PreloadedShaders: [] 41 | m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} 42 | m_CustomRenderPipeline: {fileID: 0} 43 | m_TransparencySortMode: 0 44 | m_TransparencySortAxis: {x: 0, y: 0, z: 1} 45 | m_DefaultRenderingPath: 1 46 | m_DefaultMobileRenderingPath: 1 47 | m_TierSettings: [] 48 | m_LightmapStripping: 0 49 | m_FogStripping: 0 50 | m_InstancingStripping: 0 51 | m_LightmapKeepPlain: 1 52 | m_LightmapKeepDirCombined: 1 53 | m_LightmapKeepDynamicPlain: 1 54 | m_LightmapKeepDynamicDirCombined: 1 55 | m_LightmapKeepShadowMask: 1 56 | m_LightmapKeepSubtractive: 1 57 | m_FogKeepLinear: 1 58 | m_FogKeepExp: 1 59 | m_FogKeepExp2: 1 60 | m_AlbedoSwatchInfos: [] 61 | m_LightsUseLinearIntensity: 0 62 | m_LightsUseColorTemperature: 0 63 | m_DefaultRenderingLayerMask: 1 64 | m_LogWhenShaderIsCompiled: 0 65 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/ProjectSettings/MemorySettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!387306366 &1 4 | MemorySettings: 5 | m_ObjectHideFlags: 0 6 | m_EditorMemorySettings: 7 | m_MainAllocatorBlockSize: -1 8 | m_ThreadAllocatorBlockSize: -1 9 | m_MainGfxBlockSize: -1 10 | m_ThreadGfxBlockSize: -1 11 | m_CacheBlockSize: -1 12 | m_TypetreeBlockSize: -1 13 | m_ProfilerBlockSize: -1 14 | m_ProfilerEditorBlockSize: -1 15 | m_BucketAllocatorGranularity: -1 16 | m_BucketAllocatorBucketsCount: -1 17 | m_BucketAllocatorBlockSize: -1 18 | m_BucketAllocatorBlockCount: -1 19 | m_ProfilerBucketAllocatorGranularity: -1 20 | m_ProfilerBucketAllocatorBucketsCount: -1 21 | m_ProfilerBucketAllocatorBlockSize: -1 22 | m_ProfilerBucketAllocatorBlockCount: -1 23 | m_TempAllocatorSizeMain: -1 24 | m_JobTempAllocatorBlockSize: -1 25 | m_BackgroundJobTempAllocatorBlockSize: -1 26 | m_JobTempAllocatorReducedBlockSize: -1 27 | m_TempAllocatorSizeGIBakingWorker: -1 28 | m_TempAllocatorSizeNavMeshWorker: -1 29 | m_TempAllocatorSizeAudioWorker: -1 30 | m_TempAllocatorSizeCloudWorker: -1 31 | m_TempAllocatorSizeGfx: -1 32 | m_TempAllocatorSizeJobWorker: -1 33 | m_TempAllocatorSizeBackgroundWorker: -1 34 | m_TempAllocatorSizePreloadManager: -1 35 | m_PlatformMemorySettings: {} 36 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/ProjectSettings/NavMeshAreas.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!126 &1 4 | NavMeshProjectSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | areas: 8 | - name: Walkable 9 | cost: 1 10 | - name: Not Walkable 11 | cost: 1 12 | - name: Jump 13 | cost: 2 14 | - name: 15 | cost: 1 16 | - name: 17 | cost: 1 18 | - name: 19 | cost: 1 20 | - name: 21 | cost: 1 22 | - name: 23 | cost: 1 24 | - name: 25 | cost: 1 26 | - name: 27 | cost: 1 28 | - name: 29 | cost: 1 30 | - name: 31 | cost: 1 32 | - name: 33 | cost: 1 34 | - name: 35 | cost: 1 36 | - name: 37 | cost: 1 38 | - name: 39 | cost: 1 40 | - name: 41 | cost: 1 42 | - name: 43 | cost: 1 44 | - name: 45 | cost: 1 46 | - name: 47 | cost: 1 48 | - name: 49 | cost: 1 50 | - name: 51 | cost: 1 52 | - name: 53 | cost: 1 54 | - name: 55 | cost: 1 56 | - name: 57 | cost: 1 58 | - name: 59 | cost: 1 60 | - name: 61 | cost: 1 62 | - name: 63 | cost: 1 64 | - name: 65 | cost: 1 66 | - name: 67 | cost: 1 68 | - name: 69 | cost: 1 70 | - name: 71 | cost: 1 72 | m_LastAgentTypeID: -887442657 73 | m_Settings: 74 | - serializedVersion: 2 75 | agentTypeID: 0 76 | agentRadius: 0.5 77 | agentHeight: 2 78 | agentSlope: 45 79 | agentClimb: 0.75 80 | ledgeDropHeight: 0 81 | maxJumpAcrossDistance: 0 82 | minRegionArea: 2 83 | manualCellSize: 0 84 | cellSize: 0.16666667 85 | manualTileSize: 0 86 | tileSize: 256 87 | accuratePlacement: 0 88 | maxJobWorkers: 0 89 | preserveTilesOutsideBounds: 0 90 | debug: 91 | m_Flags: 0 92 | m_SettingNames: 93 | - Humanoid 94 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/ProjectSettings/NetworkManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!149 &1 4 | NetworkManager: 5 | m_ObjectHideFlags: 0 6 | m_DebugLevel: 0 7 | m_Sendrate: 15 8 | m_AssetToPrefab: {} 9 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/ProjectSettings/PackageManagerSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!114 &1 4 | MonoBehaviour: 5 | m_ObjectHideFlags: 61 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | m_GameObject: {fileID: 0} 10 | m_Enabled: 1 11 | m_EditorHideFlags: 0 12 | m_Script: {fileID: 13964, guid: 0000000000000000e000000000000000, type: 0} 13 | m_Name: 14 | m_EditorClassIdentifier: 15 | m_EnablePreReleasePackages: 0 16 | m_EnablePackageDependencies: 0 17 | m_AdvancedSettingsExpanded: 1 18 | m_ScopedRegistriesSettingsExpanded: 1 19 | m_SeeAllPackageVersions: 0 20 | oneTimeWarningShown: 0 21 | m_Registries: 22 | - m_Id: main 23 | m_Name: 24 | m_Url: https://packages.unity.com 25 | m_Scopes: [] 26 | m_IsDefault: 1 27 | m_Capabilities: 7 28 | m_UserSelectedRegistryName: 29 | m_UserAddingNewScopedRegistry: 0 30 | m_RegistryInfoDraft: 31 | m_ErrorMessage: 32 | m_Original: 33 | m_Id: 34 | m_Name: 35 | m_Url: 36 | m_Scopes: [] 37 | m_IsDefault: 0 38 | m_Capabilities: 0 39 | m_Modified: 0 40 | m_Name: 41 | m_Url: 42 | m_Scopes: 43 | - 44 | m_SelectedScopeIndex: 0 45 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/ProjectSettings/Physics2DSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!19 &1 4 | Physics2DSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 5 7 | m_Gravity: {x: 0, y: -9.81} 8 | m_DefaultMaterial: {fileID: 0} 9 | m_VelocityIterations: 8 10 | m_PositionIterations: 3 11 | m_VelocityThreshold: 1 12 | m_MaxLinearCorrection: 0.2 13 | m_MaxAngularCorrection: 8 14 | m_MaxTranslationSpeed: 100 15 | m_MaxRotationSpeed: 360 16 | m_BaumgarteScale: 0.2 17 | m_BaumgarteTimeOfImpactScale: 0.75 18 | m_TimeToSleep: 0.5 19 | m_LinearSleepTolerance: 0.01 20 | m_AngularSleepTolerance: 2 21 | m_DefaultContactOffset: 0.01 22 | m_JobOptions: 23 | serializedVersion: 2 24 | useMultithreading: 0 25 | useConsistencySorting: 0 26 | m_InterpolationPosesPerJob: 100 27 | m_NewContactsPerJob: 30 28 | m_CollideContactsPerJob: 100 29 | m_ClearFlagsPerJob: 200 30 | m_ClearBodyForcesPerJob: 200 31 | m_SyncDiscreteFixturesPerJob: 50 32 | m_SyncContinuousFixturesPerJob: 50 33 | m_FindNearestContactsPerJob: 100 34 | m_UpdateTriggerContactsPerJob: 100 35 | m_IslandSolverCostThreshold: 100 36 | m_IslandSolverBodyCostScale: 1 37 | m_IslandSolverContactCostScale: 10 38 | m_IslandSolverJointCostScale: 10 39 | m_IslandSolverBodiesPerJob: 50 40 | m_IslandSolverContactsPerJob: 50 41 | m_SimulationMode: 0 42 | m_QueriesHitTriggers: 1 43 | m_QueriesStartInColliders: 1 44 | m_CallbacksOnDisable: 1 45 | m_ReuseCollisionCallbacks: 1 46 | m_AutoSyncTransforms: 0 47 | m_AlwaysShowColliders: 0 48 | m_ShowColliderSleep: 1 49 | m_ShowColliderContacts: 0 50 | m_ShowColliderAABB: 0 51 | m_ContactArrowScale: 0.2 52 | m_ColliderAwakeColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.7529412} 53 | m_ColliderAsleepColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.36078432} 54 | m_ColliderContactColor: {r: 1, g: 0, b: 1, a: 0.6862745} 55 | m_ColliderAABBColor: {r: 1, g: 1, b: 0, a: 0.2509804} 56 | m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 57 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/ProjectSettings/PresetManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1386491679 &1 4 | PresetManager: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_DefaultPresets: {} 8 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/ProjectSettings/ProjectVersion.txt: -------------------------------------------------------------------------------- 1 | m_EditorVersion: 2022.3.41f1 2 | m_EditorVersionWithRevision: 2022.3.41f1 (0f988161febf) 3 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/ProjectSettings/QualitySettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!47 &1 4 | QualitySettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 5 7 | m_CurrentQuality: 5 8 | m_QualitySettings: 9 | - serializedVersion: 2 10 | name: Very Low 11 | pixelLightCount: 0 12 | shadows: 0 13 | shadowResolution: 0 14 | shadowProjection: 1 15 | shadowCascades: 1 16 | shadowDistance: 15 17 | shadowNearPlaneOffset: 3 18 | shadowCascade2Split: 0.33333334 19 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 20 | shadowmaskMode: 0 21 | skinWeights: 1 22 | textureQuality: 1 23 | anisotropicTextures: 0 24 | antiAliasing: 0 25 | softParticles: 0 26 | softVegetation: 0 27 | realtimeReflectionProbes: 0 28 | billboardsFaceCameraPosition: 0 29 | vSyncCount: 0 30 | lodBias: 0.3 31 | maximumLODLevel: 0 32 | streamingMipmapsActive: 0 33 | streamingMipmapsAddAllCameras: 1 34 | streamingMipmapsMemoryBudget: 512 35 | streamingMipmapsRenderersPerFrame: 512 36 | streamingMipmapsMaxLevelReduction: 2 37 | streamingMipmapsMaxFileIORequests: 1024 38 | particleRaycastBudget: 4 39 | asyncUploadTimeSlice: 2 40 | asyncUploadBufferSize: 16 41 | asyncUploadPersistentBuffer: 1 42 | resolutionScalingFixedDPIFactor: 1 43 | customRenderPipeline: {fileID: 0} 44 | excludedTargetPlatforms: [] 45 | - serializedVersion: 2 46 | name: Low 47 | pixelLightCount: 0 48 | shadows: 0 49 | shadowResolution: 0 50 | shadowProjection: 1 51 | shadowCascades: 1 52 | shadowDistance: 20 53 | shadowNearPlaneOffset: 3 54 | shadowCascade2Split: 0.33333334 55 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 56 | shadowmaskMode: 0 57 | skinWeights: 2 58 | textureQuality: 0 59 | anisotropicTextures: 0 60 | antiAliasing: 0 61 | softParticles: 0 62 | softVegetation: 0 63 | realtimeReflectionProbes: 0 64 | billboardsFaceCameraPosition: 0 65 | vSyncCount: 0 66 | lodBias: 0.4 67 | maximumLODLevel: 0 68 | streamingMipmapsActive: 0 69 | streamingMipmapsAddAllCameras: 1 70 | streamingMipmapsMemoryBudget: 512 71 | streamingMipmapsRenderersPerFrame: 512 72 | streamingMipmapsMaxLevelReduction: 2 73 | streamingMipmapsMaxFileIORequests: 1024 74 | particleRaycastBudget: 16 75 | asyncUploadTimeSlice: 2 76 | asyncUploadBufferSize: 16 77 | asyncUploadPersistentBuffer: 1 78 | resolutionScalingFixedDPIFactor: 1 79 | customRenderPipeline: {fileID: 0} 80 | excludedTargetPlatforms: [] 81 | - serializedVersion: 2 82 | name: Medium 83 | pixelLightCount: 1 84 | shadows: 1 85 | shadowResolution: 0 86 | shadowProjection: 1 87 | shadowCascades: 1 88 | shadowDistance: 20 89 | shadowNearPlaneOffset: 3 90 | shadowCascade2Split: 0.33333334 91 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 92 | shadowmaskMode: 0 93 | skinWeights: 2 94 | textureQuality: 0 95 | anisotropicTextures: 1 96 | antiAliasing: 0 97 | softParticles: 0 98 | softVegetation: 0 99 | realtimeReflectionProbes: 0 100 | billboardsFaceCameraPosition: 0 101 | vSyncCount: 1 102 | lodBias: 0.7 103 | maximumLODLevel: 0 104 | streamingMipmapsActive: 0 105 | streamingMipmapsAddAllCameras: 1 106 | streamingMipmapsMemoryBudget: 512 107 | streamingMipmapsRenderersPerFrame: 512 108 | streamingMipmapsMaxLevelReduction: 2 109 | streamingMipmapsMaxFileIORequests: 1024 110 | particleRaycastBudget: 64 111 | asyncUploadTimeSlice: 2 112 | asyncUploadBufferSize: 16 113 | asyncUploadPersistentBuffer: 1 114 | resolutionScalingFixedDPIFactor: 1 115 | customRenderPipeline: {fileID: 0} 116 | excludedTargetPlatforms: [] 117 | - serializedVersion: 2 118 | name: High 119 | pixelLightCount: 2 120 | shadows: 2 121 | shadowResolution: 1 122 | shadowProjection: 1 123 | shadowCascades: 2 124 | shadowDistance: 40 125 | shadowNearPlaneOffset: 3 126 | shadowCascade2Split: 0.33333334 127 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 128 | shadowmaskMode: 1 129 | skinWeights: 2 130 | textureQuality: 0 131 | anisotropicTextures: 1 132 | antiAliasing: 0 133 | softParticles: 0 134 | softVegetation: 1 135 | realtimeReflectionProbes: 1 136 | billboardsFaceCameraPosition: 1 137 | vSyncCount: 1 138 | lodBias: 1 139 | maximumLODLevel: 0 140 | streamingMipmapsActive: 0 141 | streamingMipmapsAddAllCameras: 1 142 | streamingMipmapsMemoryBudget: 512 143 | streamingMipmapsRenderersPerFrame: 512 144 | streamingMipmapsMaxLevelReduction: 2 145 | streamingMipmapsMaxFileIORequests: 1024 146 | particleRaycastBudget: 256 147 | asyncUploadTimeSlice: 2 148 | asyncUploadBufferSize: 16 149 | asyncUploadPersistentBuffer: 1 150 | resolutionScalingFixedDPIFactor: 1 151 | customRenderPipeline: {fileID: 0} 152 | excludedTargetPlatforms: [] 153 | - serializedVersion: 2 154 | name: Very High 155 | pixelLightCount: 3 156 | shadows: 2 157 | shadowResolution: 2 158 | shadowProjection: 1 159 | shadowCascades: 2 160 | shadowDistance: 70 161 | shadowNearPlaneOffset: 3 162 | shadowCascade2Split: 0.33333334 163 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 164 | shadowmaskMode: 1 165 | skinWeights: 4 166 | textureQuality: 0 167 | anisotropicTextures: 2 168 | antiAliasing: 2 169 | softParticles: 1 170 | softVegetation: 1 171 | realtimeReflectionProbes: 1 172 | billboardsFaceCameraPosition: 1 173 | vSyncCount: 1 174 | lodBias: 1.5 175 | maximumLODLevel: 0 176 | streamingMipmapsActive: 0 177 | streamingMipmapsAddAllCameras: 1 178 | streamingMipmapsMemoryBudget: 512 179 | streamingMipmapsRenderersPerFrame: 512 180 | streamingMipmapsMaxLevelReduction: 2 181 | streamingMipmapsMaxFileIORequests: 1024 182 | particleRaycastBudget: 1024 183 | asyncUploadTimeSlice: 2 184 | asyncUploadBufferSize: 16 185 | asyncUploadPersistentBuffer: 1 186 | resolutionScalingFixedDPIFactor: 1 187 | customRenderPipeline: {fileID: 0} 188 | excludedTargetPlatforms: [] 189 | - serializedVersion: 2 190 | name: Ultra 191 | pixelLightCount: 4 192 | shadows: 2 193 | shadowResolution: 2 194 | shadowProjection: 1 195 | shadowCascades: 4 196 | shadowDistance: 150 197 | shadowNearPlaneOffset: 3 198 | shadowCascade2Split: 0.33333334 199 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 200 | shadowmaskMode: 1 201 | skinWeights: 255 202 | textureQuality: 0 203 | anisotropicTextures: 2 204 | antiAliasing: 2 205 | softParticles: 1 206 | softVegetation: 1 207 | realtimeReflectionProbes: 1 208 | billboardsFaceCameraPosition: 1 209 | vSyncCount: 1 210 | lodBias: 2 211 | maximumLODLevel: 0 212 | streamingMipmapsActive: 0 213 | streamingMipmapsAddAllCameras: 1 214 | streamingMipmapsMemoryBudget: 512 215 | streamingMipmapsRenderersPerFrame: 512 216 | streamingMipmapsMaxLevelReduction: 2 217 | streamingMipmapsMaxFileIORequests: 1024 218 | particleRaycastBudget: 4096 219 | asyncUploadTimeSlice: 2 220 | asyncUploadBufferSize: 16 221 | asyncUploadPersistentBuffer: 1 222 | resolutionScalingFixedDPIFactor: 1 223 | customRenderPipeline: {fileID: 0} 224 | excludedTargetPlatforms: [] 225 | m_PerPlatformDefaultQuality: 226 | Android: 2 227 | GameCoreScarlett: 5 228 | GameCoreXboxOne: 5 229 | Lumin: 5 230 | Nintendo Switch: 5 231 | PS4: 5 232 | PS5: 5 233 | Server: 0 234 | Stadia: 5 235 | Standalone: 5 236 | WebGL: 3 237 | Windows Store Apps: 5 238 | XboxOne: 5 239 | iPhone: 2 240 | tvOS: 2 241 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/ProjectSettings/SceneTemplateSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "templatePinStates": [], 3 | "dependencyTypeInfos": [ 4 | { 5 | "userAdded": false, 6 | "type": "UnityEngine.AnimationClip", 7 | "ignore": false, 8 | "defaultInstantiationMode": 0, 9 | "supportsModification": true 10 | }, 11 | { 12 | "userAdded": false, 13 | "type": "UnityEditor.Animations.AnimatorController", 14 | "ignore": false, 15 | "defaultInstantiationMode": 0, 16 | "supportsModification": true 17 | }, 18 | { 19 | "userAdded": false, 20 | "type": "UnityEngine.AnimatorOverrideController", 21 | "ignore": false, 22 | "defaultInstantiationMode": 0, 23 | "supportsModification": true 24 | }, 25 | { 26 | "userAdded": false, 27 | "type": "UnityEditor.Audio.AudioMixerController", 28 | "ignore": false, 29 | "defaultInstantiationMode": 0, 30 | "supportsModification": true 31 | }, 32 | { 33 | "userAdded": false, 34 | "type": "UnityEngine.ComputeShader", 35 | "ignore": true, 36 | "defaultInstantiationMode": 1, 37 | "supportsModification": true 38 | }, 39 | { 40 | "userAdded": false, 41 | "type": "UnityEngine.Cubemap", 42 | "ignore": false, 43 | "defaultInstantiationMode": 0, 44 | "supportsModification": true 45 | }, 46 | { 47 | "userAdded": false, 48 | "type": "UnityEngine.GameObject", 49 | "ignore": false, 50 | "defaultInstantiationMode": 0, 51 | "supportsModification": true 52 | }, 53 | { 54 | "userAdded": false, 55 | "type": "UnityEditor.LightingDataAsset", 56 | "ignore": false, 57 | "defaultInstantiationMode": 0, 58 | "supportsModification": false 59 | }, 60 | { 61 | "userAdded": false, 62 | "type": "UnityEngine.LightingSettings", 63 | "ignore": false, 64 | "defaultInstantiationMode": 0, 65 | "supportsModification": true 66 | }, 67 | { 68 | "userAdded": false, 69 | "type": "UnityEngine.Material", 70 | "ignore": false, 71 | "defaultInstantiationMode": 0, 72 | "supportsModification": true 73 | }, 74 | { 75 | "userAdded": false, 76 | "type": "UnityEditor.MonoScript", 77 | "ignore": true, 78 | "defaultInstantiationMode": 1, 79 | "supportsModification": true 80 | }, 81 | { 82 | "userAdded": false, 83 | "type": "UnityEngine.PhysicMaterial", 84 | "ignore": false, 85 | "defaultInstantiationMode": 0, 86 | "supportsModification": true 87 | }, 88 | { 89 | "userAdded": false, 90 | "type": "UnityEngine.PhysicsMaterial2D", 91 | "ignore": false, 92 | "defaultInstantiationMode": 0, 93 | "supportsModification": true 94 | }, 95 | { 96 | "userAdded": false, 97 | "type": "UnityEngine.Rendering.PostProcessing.PostProcessProfile", 98 | "ignore": false, 99 | "defaultInstantiationMode": 0, 100 | "supportsModification": true 101 | }, 102 | { 103 | "userAdded": false, 104 | "type": "UnityEngine.Rendering.PostProcessing.PostProcessResources", 105 | "ignore": false, 106 | "defaultInstantiationMode": 0, 107 | "supportsModification": true 108 | }, 109 | { 110 | "userAdded": false, 111 | "type": "UnityEngine.Rendering.VolumeProfile", 112 | "ignore": false, 113 | "defaultInstantiationMode": 0, 114 | "supportsModification": true 115 | }, 116 | { 117 | "userAdded": false, 118 | "type": "UnityEditor.SceneAsset", 119 | "ignore": false, 120 | "defaultInstantiationMode": 0, 121 | "supportsModification": false 122 | }, 123 | { 124 | "userAdded": false, 125 | "type": "UnityEngine.Shader", 126 | "ignore": true, 127 | "defaultInstantiationMode": 1, 128 | "supportsModification": true 129 | }, 130 | { 131 | "userAdded": false, 132 | "type": "UnityEngine.ShaderVariantCollection", 133 | "ignore": true, 134 | "defaultInstantiationMode": 1, 135 | "supportsModification": true 136 | }, 137 | { 138 | "userAdded": false, 139 | "type": "UnityEngine.Texture", 140 | "ignore": false, 141 | "defaultInstantiationMode": 0, 142 | "supportsModification": true 143 | }, 144 | { 145 | "userAdded": false, 146 | "type": "UnityEngine.Texture2D", 147 | "ignore": false, 148 | "defaultInstantiationMode": 0, 149 | "supportsModification": true 150 | }, 151 | { 152 | "userAdded": false, 153 | "type": "UnityEngine.Timeline.TimelineAsset", 154 | "ignore": false, 155 | "defaultInstantiationMode": 0, 156 | "supportsModification": true 157 | } 158 | ], 159 | "defaultDependencyTypeInfo": { 160 | "userAdded": false, 161 | "type": "", 162 | "ignore": false, 163 | "defaultInstantiationMode": 1, 164 | "supportsModification": true 165 | }, 166 | "newSceneOverride": 0 167 | } -------------------------------------------------------------------------------- /Unity-Twitch-Chat/ProjectSettings/TagManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!78 &1 4 | TagManager: 5 | serializedVersion: 2 6 | tags: [] 7 | layers: 8 | - Default 9 | - TransparentFX 10 | - Ignore Raycast 11 | - 12 | - Water 13 | - UI 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 | m_SortingLayers: 41 | - name: Default 42 | uniqueID: 0 43 | locked: 0 44 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/ProjectSettings/TimeManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!5 &1 4 | TimeManager: 5 | m_ObjectHideFlags: 0 6 | Fixed Timestep: 0.02 7 | Maximum Allowed Timestep: 0.33333334 8 | m_TimeScale: 1 9 | Maximum Particle Timestep: 0.03 10 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/ProjectSettings/UnityConnectSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!310 &1 4 | UnityConnectSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 1 7 | m_Enabled: 0 8 | m_TestMode: 0 9 | m_EventOldUrl: https://api.uca.cloud.unity3d.com/v1/events 10 | m_EventUrl: https://cdp.cloud.unity3d.com/v1/events 11 | m_ConfigUrl: https://config.uca.cloud.unity3d.com 12 | m_DashboardUrl: https://dashboard.unity3d.com 13 | m_TestInitMode: 0 14 | CrashReportingSettings: 15 | m_EventUrl: https://perf-events.cloud.unity3d.com 16 | m_Enabled: 0 17 | m_LogBufferSize: 10 18 | m_CaptureEditorExceptions: 1 19 | UnityPurchasingSettings: 20 | m_Enabled: 0 21 | m_TestMode: 0 22 | UnityAnalyticsSettings: 23 | m_Enabled: 0 24 | m_TestMode: 0 25 | m_InitializeOnStartup: 1 26 | m_PackageRequiringCoreStatsPresent: 0 27 | UnityAdsSettings: 28 | m_Enabled: 0 29 | m_InitializeOnStartup: 1 30 | m_TestMode: 0 31 | m_IosGameId: 32 | m_AndroidGameId: 33 | m_GameIds: {} 34 | m_GameId: 35 | PerformanceReportingSettings: 36 | m_Enabled: 0 37 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/ProjectSettings/VFXManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!937362698 &1 4 | VFXManager: 5 | m_ObjectHideFlags: 0 6 | m_IndirectShader: {fileID: 0} 7 | m_CopyBufferShader: {fileID: 0} 8 | m_SortShader: {fileID: 0} 9 | m_StripUpdateShader: {fileID: 0} 10 | m_RenderPipeSettingsPath: 11 | m_FixedTimeStep: 0.016666668 12 | m_MaxDeltaTime: 0.05 13 | m_CompiledVersion: 0 14 | m_RuntimeVersion: 0 15 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/ProjectSettings/VersionControlSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!890905787 &1 4 | VersionControlSettings: 5 | m_ObjectHideFlags: 0 6 | m_Mode: Visible Meta Files 7 | m_CollabEditorSettings: 8 | inProgressEnabled: 1 9 | -------------------------------------------------------------------------------- /Unity-Twitch-Chat/ProjectSettings/XRSettings.asset: -------------------------------------------------------------------------------- 1 | { 2 | "m_SettingKeys": [ 3 | "VR Device Disabled", 4 | "VR Device User Alert" 5 | ], 6 | "m_SettingValues": [ 7 | "False", 8 | "False" 9 | ] 10 | } --------------------------------------------------------------------------------