{"id":15138966,"url":"https://github.com/justsleightly/throwaball","last_synced_at":"2026-02-21T11:31:25.682Z","repository":{"id":231603364,"uuid":"773239961","full_name":"JustSleightly/ThrowaBall","owner":"JustSleightly","description":null,"archived":false,"fork":false,"pushed_at":"2024-04-06T22:40:16.000Z","size":40735,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-21T01:24:31.535Z","etag":null,"topics":["unity","vrchat","vrchat-avatars","vrchat-tool"],"latest_commit_sha":null,"homepage":"http://store.sleightly.dev/l/ThrowaBall","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/JustSleightly.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-03-17T05:40:05.000Z","updated_at":"2024-07-05T07:28:53.000Z","dependencies_parsed_at":"2024-04-06T23:38:10.185Z","dependency_job_id":null,"html_url":"https://github.com/JustSleightly/ThrowaBall","commit_stats":null,"previous_names":["justsleightly/throwaball"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/JustSleightly/ThrowaBall","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JustSleightly%2FThrowaBall","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JustSleightly%2FThrowaBall/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JustSleightly%2FThrowaBall/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JustSleightly%2FThrowaBall/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/JustSleightly","download_url":"https://codeload.github.com/JustSleightly/ThrowaBall/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JustSleightly%2FThrowaBall/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278551490,"owners_count":26005389,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-06T02:00:05.630Z","response_time":65,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["unity","vrchat","vrchat-avatars","vrchat-tool"],"created_at":"2024-09-26T08:00:40.734Z","updated_at":"2025-10-06T02:55:15.961Z","avatar_url":"https://github.com/JustSleightly.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# ThrowaBall [\u003cimg src=\"https://github.com/JustSleightly/Resources/raw/main/Icons/JSLogo.png\" width=\"30\" height=\"30\" alt=\"JustSleightly\"\u003e](https://vrc.sleightly.dev/ \"JustSleightly\") [\u003cimg src=\"https://github.com/JustSleightly/Resources/raw/main/Icons/Discord.png\" width=\"30\" height=\"30\" alt=\"Discord\"\u003e](https://discord.sleightly.dev/ \"Discord\") [\u003cimg src=\"https://github.com/JustSleightly/Resources/raw/main/Icons/GitHub.png\" width=\"30\" height=\"30\" alt=\"GitHub\"\u003e](https://github.sleightly.dev/ \"Github\") [\u003cimg src=\"https://github.com/JustSleightly/Resources/raw/main/Icons/Store.png\" width=\"30\" height=\"30\" alt=\"Store\"\u003e](https://store.sleightly.dev/ \"Store\")\n\n[![GitHub stars](https://img.shields.io/github/stars/JustSleightly/ThrowaBall)](https://github.com/JustSleightly/ThrowaBall/stargazers) [![GitHub Tags](https://img.shields.io/github/tag/JustSleightly/ThrowaBall)](https://github.com/JustSleightly/ThrowaBall/tags) [![GitHub release (latest by date including pre-releases)](https://img.shields.io/github/v/release/JustSleightly/ThrowaBall?include_prereleases)](https://github.com/JustSleightly/ThrowaBall/releases) [![GitHub issues](https://img.shields.io/github/issues/JustSleightly/ThrowaBall)](https://github.com/JustSleightly/ThrowaBall/issues) [![GitHub last commit](https://img.shields.io/github/last-commit/JustSleightly/ThrowaBall)](https://github.com/JustSleightly/ThrowaBall/commits/main) [![Discord](https://img.shields.io/discord/780192344800362506)](https://discord.sleightly.dev/)\n\n![TB Gumroad Showcase gif](https://github.com/JustSleightly/ThrowaBall/raw/main/Documentation/Gifs/TB%20Gumroad%20Showcase.gif)\n\n**ThrowaBall** is a physics-based throwable object system built for **VRChat** users. It streamlines the deceptively difficult task of naturally grabbing and tossing an object with a modular automatic setup tool, allowing for 2 step installation without any VRChat 3.0 or advanced Unity experience whatsoever.\n\nThis is a **system** and only includes three default ball prefabs. Please import your own for more variety.\n\n## Available now at [store.sleightly.dev](https://store.sleightly.dev/)\n\n\u003cimg src=\"https://github.com/JustSleightly/ThrowaBall/raw/main/Documentation/Images/TB%20Default%20Settings.png\" height=\"280\" alt=\"TB Default Settings\"\u003e\n\n### Features\n\n- **Syncs ball position** with other players\n- **Drag and drop setup** - works with **any** object, not just balls\n- Supports up to **8 balls per system installation**\n- Supports **multiple system installations** to use multiple balls at once\n- Choose between two different throw force mechanics to suit your needs/preferences\n- Options to respawn the ball using a **gesture, menu, or a physical button**\n- Controls the throw force using a **radial puppet**\n- Allows ball to be **grabbed (and thrown\\*) by other players**\n- Customizable **drag/bounce** physics\n- Extensive modular options and animator API resources for creators to develop compatible prefabs\n- **Automatic Write Defaults detection** and compatibility with both on/off\n\n\\* *Throws by other players come with their own caveats due to VRChat limitations (See Disclaimer Below)*\n\n| Specifications | Default | Range |\n| :--- | :--- | :--- |\n| `Memory` | 38 | 2 - 47 |\n| `Icons` | 5 | 3 - 14 |\n| `FX Layers` | 6 | 3 - 7 |\n| `Animation Clips` | 30 | 13 - 40 |\n\n## Showcase / Performance Reel\n\n[![ThrowaBall Showcase](http://img.youtube.com/vi/EraEE1VhGl4/0.jpg)](https://www.youtube.com/watch?v=EraEE1VhGl4 \"ThrowaBall Showcase\")\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Full Demo GIF \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\n![TB Script Showcase gif](https://github.com/JustSleightly/ThrowaBall/raw/main/Documentation/Gifs/TB%20Script%20Showcase.gif)\n\n\u003c/details\u003e\n\n---\n\n# Requirements\n\n1. Basic Unity experience + VRChat SDK3 uploading experience.\n2. A **validated** license key for first time activation.\n    1. License keys can be purchased from my [store](https://store.sleightly.dev/).\n    2. Keys must be validated by joining my [discord](https://discord.sleightly.dev/) and opening a ticket with my automated discord bot.\n3. An active **internet connection** while in Unity in order to use the tool - cannot be used offline.\n4. Only compatible with Unity for **Windows** - not compatible with Unity for Mac/Linux at this time.\n5. Pre-requisite import - [VRChat Creator Companion SDK](https://vrchat.com/home/download) version `3.2.0` or newer.\n\n---\n\n# Disclaimer\n\nThrowaBall is a unique throwable system as it is designed to **both** sync its position to other players, **and** allow other players to throw the object.\n\nHowever, due to limitations with VRChat regarding the way player IK interpolates and delays between player clients, it leads to a sub-par/delayed throwing experience for players other than the avatar wearer who attempt to throw ThrowaBall. Throwing experience also deteriorates in accuracy at lower FPS.\n\nThe **Include Remote Tracker** option in the ThrowaBall installer adds complexity to the hierarchy and animator in an attempt to partially mitigate the delay in player IK, but it is far from a robust solution.\n\nThe only way to allow for players other than the avatar wearer to throw ThrowaBall seamlessly is to disable/sacrifice syncing the position of the ball, resulting in other players seeing the ball in a different location than the wearer.\n\nThe `PhysJoint` force mode has the ability to toggle off **or** omit position syncing entirely, allowing the avatar wearer to trade position syncing to prioritize other players' experience interacting with ThrowaBall.\n\n---\n\n# Throw Force Mode\n\nThrowaBall supports two different throwing mechanics to choose from to suit your preferences/needs. They both throw with roughly the same range of force, but have slightly different feels to each other.\n\n### `Force Particle`\n\nThrowaBall will use particle system collision to determine the force of the throw. The thrown object is still a rigidbody with physics collision, and not a particle mesh.\n\n- **Feels more consistent/stable for the average user**\n- **Less sensitive to throwing effort, so small tosses still travel well**\n- **Properly scales linearly with VRChat Avatar Scaling**\n- *Including Sync is mandatory (+27 memory) and can't be toggled*\n- *Ball will not rotate for other players*\n\n### `PhysJoint`\n\nThrowaBall will use a PhysBone and configurable joint to determine the force and direction of the throw.\n\n- **More sensitive to throwing effort, resulting in a more dynamic range**\n- **Including Sync is optional if other users do not need to see where the ball lands (-27 memory)**\n- **Sync can be toggled off in-game to allow other users to throw ThrowaBall without any visual delay as if they were the original wearer**\n- **Ball will rotate to face the direction of its travel**\n- *Throwing takes a little more practice to get used to*\n- *Throw force scales with Avatar non-linearly and is especially an issue for other users at drastically different scale than the wearer who try to throw ThrowaBall*\n\n---\n\n# Installation\n\n### Unity Installation Guide Video\n\n[![ThrowaBall Unity Installation Guide](http://img.youtube.com/vi/1Ae--qTr0oU/0.jpg)](https://www.youtube.com/watch?v=1Ae--qTr0oU \"ThrowaBall Unity Installation Guide\")\n\n### Importing The Prefab\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Add to Scene \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nTo add ThrowaBall to your scene, click on **JustSleightly** in the top toolbar, and click on the **ThrowaBall** menu option. You can also press **Alt + T** for *ThrowaBall*.\n\nThis will add the installer onto the first active loaded Avatar Descriptor in the scene.\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e Technical Details \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nIf you have any GameObjects selected in the scene, clicking the Menu Item for ThrowaBall will search all selected objects and parents first for an Avatar Descriptor.\n\nIf there are no active Avatar Descriptors found in the scene, the installer will be added to the base scene.\n\n\u003c/details\u003e\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e  Activate License \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nIf you have never used this on this PC before, you will see a field labeled **Enter your license key**. Make sure you've validated your license key on the [Discord](https://discord.sleightly.dev/) server, then input your license key from your purchase and click activate. This is a one-time-use key that will authorize the current PC for future use of ThrowaBall.\n\nIf your license key is not working due to it already being in use, click the *Transfer License* option.\n\n\u003c/details\u003e\n\n### Main Settings\n\n![TB Main Settings png](https://github.com/JustSleightly/ThrowaBall/raw/main/Documentation/Images/TB%20Main%20Settings.png)\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Target to Follow \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nSelect a humanoid body bone from the drop-down that ThrowaBall should follow.\n\nSelecting `Custom` will allow for any gameobject on the avatar to be used as a **Custom Follow Target**.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Force Mode \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nSelect the method ThrowaBall will use to calculate the ball's force between `Force Particle` and `PhysJoint`.\n\nDetails regarding both force modes can be found in the **Throw Force Mode** section above.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Ball Inputs \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nSelect a **Ball Type/Object** for ThrowaBall to use from the drop-down, or select `Custom` to drag in any GameObject/Prefab from your hierarchy or your project assets.\n\nSelect a **Physics Preset** for each ball to follow, or select `Custom` to set a specific drag/bounce.\n\nUse the +/- symbol to add/remove additional balls to the system, up to 8 balls. Rearrange them by click/dragging into your preferred order.\n\nAdds +1 Expression Parameter memory per ball.\n\n![TB Ball Add Rearrange gif](https://github.com/JustSleightly/ThrowaBall/raw/main/Documentation/Gifs/TB%20Ball%20Add%20Rearrange.gif)\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e Technical Details \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nAll GameObjects will have their root re-positioned to (0, 0, 0).\n\nIf the input GameObject is a prefab, the prefab will be unpacked.\n\nInputting the Avatar Root or ThrowaBall's own GameObject will automatically be removed.\n\nAny RigidBody, Spring Joint, and Configurable Joint components within any GameObjects/Prefabs inputted will be removed.\n\nAny Sphere, Box, Capsule, and Mesh Collider components within any GameObjects/Prefabs inputted that are not set as Triggers will be removed.\n\nLeaving an input field blank will yield an error.\n\n\u003c/details\u003e\n\n\u003c/details\u003e\n\n### Advanced Options\n\n![TB Advanced Options png](https://github.com/JustSleightly/ThrowaBall/raw/main/Documentation/Images/TB%20Advanced%20Options.png)\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Write Defaults \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nEnabling/Disabling this option will enable/disable Write Defaults in all generated animator states for ThrowaBall.\n\n![TB Write Defaults png](https://github.com/JustSleightly/ThrowaBall/raw/main/Documentation/Images/TB%20Write%20Defaults.png)\n\nIf it says Write Defaults **(Auto)**, then this is handled automatically to match the current Write Defaults of your Animator Controller(s).\n\n![TB Write Defaults Auto png](https://github.com/JustSleightly/ThrowaBall/raw/main/Documentation/Images/TB%20Write%20Defaults%20Auto.png)\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e Technical Details \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nIf your FX Animator Controller is set to one Write Defaults mode, the **Write Defaults** option will automatically match and be labeled with **(Auto)**.\n\nIf your FX Animator Controller has a mix of Write Defaults On and Off, a warning will appear and the **Write Defaults** option will not be labeled with **(Auto)**. This option will be available to manually enable/disable, and the generated states will follow the manually set status.\n\nStates with BlendTrees that are also set to Write Defaults On and have `(WD On)` in the name are omitted from the scan.\n\n\u003c/details\u003e\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Include Collision Parameter \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nEnable this feature to add an animator parameter called `TB/Collision` that will be driven whenever the thrown object collides with a surface for use with custom animations.\n\nThe collision detection is not foolproof or perfect, as it depends on world colliders and the detection rate of particle collision death. The parameter fires for a minimum of 10 frames at a time.\n\nAdds +1 Expression Parameter memory.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Include Menu Respawn Button \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nEnable this feature to add a menu control that respawns ThrowaBall.\n\nAdds +1 Expression Parameter memory.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Include Gesture to Respawn \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nEnable this feature to respawn ThrowaBall upon a specific gesture or gesture combination.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Include Physical Respawn Pedestal \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nEnable this feature to add a Physical Pedestal that respawns ThrowaBall when a squishbone is pressed.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Include Throw Force Radial Control \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nEnable this feature to add a radial puppet to dynamically control ThrowaBall's throw force by a default multiplier range of 0.5x - 1.5x.\n\nAdds +8 Expression Parameter memory.\n\nThe multiplier range and initial value can be adjusted in the **Debug Options**.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Allow Remote Grabbing \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nEnable this feature to allow other players to grab the ThrowaBall.\n\nBe mindful of ball syncing and **Throw Force Mode** caveats.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Include Ball Syncing \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nEnable this feature to sync the position of ThrowaBall from you to other players.\n\nAdds +27 Expression Parameter memory.\n\nThis option only appears if the **Throw Force Mode** is set to `PhysJoint`, as syncing is mandatory for `Force Particle`.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Include Sync Toggle \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nEnable this feature to include a menu control that disables Ball Syncing to allow for smoother throwing for remote throwers.\n\nAdds +1 Expression Parameter memory.\n\nThis option only appears if **Allow Remote Grabbing** is enabled and **Include Ball Syncing** is enabled/required.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Include Remote Tracker \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nEnable this feature to add a contact tracker to partially counteract network IK lag from remote throwers.\n\nSee the **Disclaimer** above for more details.\n\nThis option only appears if **Allow Remote Grabbing** is enabled and **Include Ball Syncing** is enabled/required.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e World Drop When Enabled \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nDisable this feature to not constrain ThrowaBall to the world when the system is enabled, such as for grabbing the ThrowaBall off another moving object like a belt.\n\nThis option only appears if **Include Physical Respawn Pedestal** is disabled.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Select Respawn Gesture \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nSelect the gesture(s)/gesture combination that will respawn ThrowaBall.\n\nThis option only appears if **Include Gesture to Respawn** is enabled.\n\n\u003c/details\u003e\n\n### Extra Settings\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Save File Path \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nSelect where to create the GeneratedTBResources folder which contains all of the generated files.\n\n![TB Save File Path png](https://github.com/JustSleightly/ThrowaBall/raw/main/Documentation/Images/TB%20Save%20File%20Path.png)\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e Technical Details \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nBy default, this path is `Assets/JustSleightly/ThrowaBall`.\n\nChanges made to this path will attempt to be saved to your editor preferences for use in other projects as well.\n\n\u003c/details\u003e\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Debug Options \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nExperimental options for manipulating ThrowaBall behaviour.\n\nIt is not recommended to adjust these values without extensive testing.\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Throw Multiplier Min \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nSet the minimum multiplier value of the Force Multiplier Parameter when the parameter float value is 0.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Throw Multiplier Max \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nSet the maximum multiplier value of the Force Multiplier Parameter when the parameter float value is 1.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Throw Default Multiplier \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nSet the default value of the Force Multiplier Parameter.\n\nThe 0 - 1 float range corresponds to a linear min - max force multiplier.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Throw Start Lifetime \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nSet the Start Lifetime of the Force Particle System.\n\nThis option only appears if the **Throw Force Mode** is set to `Force Particle`.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Throw Collider Force \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nSet the Collider Force of the Force Particle System.\n\nThis option only appears if the **Throw Force Mode** is set to `Force Particle`.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Throw Exit Time \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nSet the exit time of the throw vector, which correlates to how long the force is applied to ThrowaBall before leaving it to inertia.\n\nThis option only appears if the **Throw Force Mode** is set to `PhysJoint`.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Throw Force Curve \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nSet the curve that controls the throw force relative to an avatar eye height of 1 meter.\n\nThe duration of this curve is inversely proportional to the Throw Exit Time.\n\nThis option only appears if the **Throw Force Mode** is set to `PhysJoint`.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Select Sync Damping \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nSet the strength of the damping interpolation between sync intervals.\n\nThis option only appears if **Include Ball Syncing** is enabled/required.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Select IK Lag Buffer \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nSet the buffer time to account for IK before releasing a remote throw.\n\nThis option only appears if **Include Remote Tracker** is enabled.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Select Tracker Size \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nSet the initial tracker size of the remote player contact tracker before attaching.\n\nThis option only appears if **Include Remote Tracker** is enabled.\n\n\u003c/details\u003e\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Begin Setup \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nClicking this button will begin the generation of the ThrowaBall system according to the configuration of the **Main Settings** window, and proceed to **Anchor Positioning**. This button will be greyed out if there are any red errors returned in the Inspector.\n\n![TB Begin Setup png](https://github.com/JustSleightly/ThrowaBall/raw/main/Documentation/Images/TB%20Begin%20Setup.png)\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Add Additional System \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nClicking this button will generate an additional instance of the ThrowaBall system according to the configuration of the **Main Settings** window, and proceed to **Anchor Positioning**. This button will be greyed out if there are any red errors returned in the Inspector.\n\nThe system will be generated under the same existing ThrowaBall root, and animator parameters will be suffixed by the index of the installed instance.\n\nThis option is only available if an existing instance of ThrowaBall is already detected.\n\n![TB Additional System png](https://github.com/JustSleightly/ThrowaBall/raw/main/Documentation/Images/TB%20Additional%20System.png)\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Utilities \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Memory Calculations \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nDisplays the Required Memory to generate and the Available Memory on the current Avatar's Expression Parameters.\n\n![TB Calculate Memory png](https://github.com/JustSleightly/ThrowaBall/raw/main/Documentation/Images/TB%20Calculate%20Memory.png)\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e Necessary Memory can be calculated as: \u003c/summary\u003e\n  ​\n\u003cblockquote\u003e\n\n```math\n\\Sigma TotalRequiredMemory = CustomBallMemory + \\begin{cases}1 + BallCount \\\\8 \u0026 IncludeForceSlider \\\\1 \u0026 IncludeMenuRespawn \\\\27 \u0026 IncludeBallSyncing\\|\\|UseForceParticle \\\\1 \u0026 IncludeSyncToggle\\\u0026AllowRemoteGrabbing\\\u0026!UseForceParticle \\\\1 \u0026 IncludeCollisionParameter\\end{cases}\n```\n\n\u003c/details\u003e\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Warnings/Errors \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e ERROR: No Avatar Descriptor Detected \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nTriggers if no Avatar Descriptor component can be detected in any parents of the current GameObject.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e ERROR: No Animator Detected \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nTriggers if no Animator component is found on the Avatar Descriptor GameObject.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e ERROR: An Error Has Occurred And Interrupted The Installation \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nTriggers for various reason, likely due to going in/out of Play Mode, or sometimes Unity recompiling due to a change in project files via import/deletion.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e ERROR: Not Enough Memory \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nTriggers if the Expressions Menu does not have enough available memory to satisfy the features configured in **Main Settings**.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e ERROR: Not Enough Menu Space \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nTriggers if the Expressions Menu in the Avatar Descriptor already has 8 controls.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e ERROR: Animator Missing Avatar \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nTriggers if the Animator component on your Avatar Root does not have an Avatar mapped.\n\n![TB Error Animator No Avatar Example png](https://github.com/JustSleightly/ThrowaBall/raw/main/Documentation/Images/TB%20Error%20Animator%20No%20Avatar%20Example.png)\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e ERROR: Model Not Humanoid \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nTriggers if the model's FBX is not set to Humanoid rig configuration.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e ERROR: Chest Not Mapped \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nTriggers if the model's humanoid rig configuration does not have the chest mapped.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e ERROR: Empty Custom Target \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nTriggers if the custom target GameObject field is left blank.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e ERROR: Empty Ball Inputs \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nTriggers if any custom Ball Object fields are left blank.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e WARNING: Avatar Not At Origin \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nTriggers if the Avatar is currently not at origin (0,0,0 Position and Rotation). If continued, the ThrowaBall system may spazz out for remote players.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e WARNING: Mixed Write Defaults \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nTriggers if both Write Defaults On and Off are detected in your FX Controller.\n\nContinuing will use whichever value of **Write Defaults** you set under **Advanced Options**.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e WARNING: Default Controllers/Expressions Detected \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nTriggers if the FX Controller, Expression Parameters, or Expressions Menu in your Avatar Descriptor is either default or empty.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e WARNING: Previous ThrowaBall Installation Detected \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nTriggers if a remnants of a previous ThrowaBall installation were detected. Continuing will attempt to install another instance of ThrowaBall.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e ERROR: Double Layer Rig Bug Detected \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nTriggers if your Avatar Descriptor has two FX Playable Layers. Pressing Fix will restore the Action Playable Layer for you, but you will need to re-populate any custom layers you had previously set here.\n\nThis is a [known VRCSDK bug](https://notes.sleightly.dev/My-VRC-Avatar-Descriptor-is-not-showing-the-Playable-Layers-properly-Double-FX-Bug-e6a68eca97644ec3896d3bda410cd97e) that occurs when switching the avatar in the root animator or switching the FBX of that avatar between Generic and Humanoid rigs when it already has an Avatar Descriptor in the scene.\n\n![TB Double FX Layer Bug Example png](https://github.com/JustSleightly/ThrowaBall/raw/main/Documentation/Images/TB%20Double%20FX%20Layer%20Bug%20Example.png)\n\n\u003c/details\u003e\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Remove From Avatar \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nRemoves any trace of ThrowaBall out of the avatar's hierarchy and Avatar Descriptor.\n\n![TB Delete Button png](https://github.com/JustSleightly/ThrowaBall/raw/main/Documentation/Images/TB%20Delete%20Button.png)\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Technical Details \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nDeletes Hierarchy: Any GameObjects with the Prefix \"TB\".\n\nDeletes Controller Layers: Any Layers with the TB Identifier on the AnyState.\n\nDeletes Controller Parameters: Any Parameters with the Prefix \"TB/\".\n\nDeletes From Expressions Menu: Any SubMenu whose name contains \"ThrowaBall\" or leads to a SubMenu with the Prefix \"TB\".\n\nDeletes From Expression Parameters: Any Parameters with the Prefix \"TB\".\n\n\u003cblockquote\u003e\n\n\u003c/details\u003e\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Delete from Project \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nDeletes the Generated Resources folder at path `Save File Path/GeneratedTBResources`. This may contain files for more than just the current avatar if you have generated ThrowaBall multiple times in this project.\n\n![TB Delete Button png](https://github.com/JustSleightly/ThrowaBall/raw/main/Documentation/Images/TB%20Delete%20Button.png)\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Authorized user \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nDynamically displays the current Authorized User's discord name and license type. Just a little extra personal touch!\n\n![TB Authorized User png](https://github.com/JustSleightly/ThrowaBall/raw/main/Documentation/Images/TB%20Authorized%20User.png)\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Check For Update \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nClick the three lines next to the version number in the bottom left to check for newer versions of ThrowaBall. If a new version is detected, a pop-up window will point you to the changelog.\n\nThis will automatically check the first time it is loaded per day.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Send Feedback \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nClick the three lines next to the version number in the bottom left to send feedback for ThrowaBall straight from Unity.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Verify \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nClick the three lines next to the version number in the bottom left to select when ThrowaBall verifies authentication.\n\nOn Display initiates authentication when the window is opened.\n\nOn Project Load initiates authentication when the project is opened.\n\n\u003c/details\u003e\n\n\u003c/details\u003e\n\n### Positioning/Scaling\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Edit Pedestal \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nAdjust the labeled Pedestal target in the scene view to the desired position using the positioning handles.\n\nThe Pedestal will always maintain a flat rotation on the XZ plane, and have its button facing the player until placed.\n\nShow/Hide the Position/Rotation handles as necessary.\n\n![TB Edit Pedestal gif](https://github.com/JustSleightly/ThrowaBall/raw/main/Documentation/Gifs/TB%20Edit%20Pedestal.gif)\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Edit Ball Target \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nAdjust the Ball Target in the scene view to the desired position/rotation using the positioning handles.\n\nThis will follow the Pedestal transform if the Pedestal is included, or otherwise follow the custom target directly.\n\nEnable **Edit Individual Target Offsets per Ball** in order to adjust the ball target on a per-ball basis. This can be helpful for aligning balls of varying sizes with the pedestal/follow target.\n\nShow/Hide the Position/Rotation handles as necessary.\n\n![TB Edit Ball Target gif](https://github.com/JustSleightly/ThrowaBall/raw/main/Documentation/Gifs/TB%20Edit%20Ball%20Target.gif)\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Edit Ball Size \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nAdjust the Ball Sizes and Collider Sizes in the scene view using the scale/radius handles or the field below.\n\nAlternatively, you can also multi-select balls to scale multiple balls at once.\n\nShow/Hide the Scale/Radius handles as necessary.\n\nIf you're using Unity 2019, using the center scale handle when the scale is not (1, 1, 1) will exponentially snap initially due to a [Unity 2019 bug](https://forum.unity.com/threads/case-1264038-handles-scalehandle-incorrect-when-center-scaling.933798/), but it can still be used to uniformly scale across all axes.\n\n![TB Edit Ball Size gif](https://github.com/JustSleightly/ThrowaBall/raw/main/Documentation/Gifs/TB%20Edit%20Ball%20Size.gif)\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Show/Hide Handles \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nToggle these options to help manage the clutter in the scene while editing the above steps.\n\nThis option is only visible while editing the above steps.\n\n![TB Show Hide Handles gif](https://github.com/JustSleightly/ThrowaBall/raw/main/Documentation/Gifs/TB%20Show%20Hide%20Handles.gif)\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Complete Setup \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nOnce **Positioning/Scaling** is finished, click **Complete Setup** to generate all the required animations and finalize the system and 3.0.\n\n\u003c/details\u003e\n\n---\n\n# Usage\n\n### In-Game Usage Tutorial Video\n\n[![ThrowaBall In-Game Usage Tutorial](http://img.youtube.com/vi/TjH0JU1dnjw/0.jpg)](https://www.youtube.com/watch?v=TjH0JU1dnjw \"ThrowaBall In-Game Usage Tutorial\")\n\nTo start using ThrowaBall in game, use the `Toggle` menu to select a ball to make visible, then use `Enable` to initialize the system. Once initialized, the ball should be grabbable via controller grip, as it uses PhysBones to hold rather than gestures.\n\n\u003e [!WARNING]\n\u003e Avoid moving while pressing `Enable` in order to avoid offsetting the sync system between you and other players\n\n| Menu Control | Function | Requirement |\n| :------------- | :------------- | :------------- |\n| `Toggle` | Enable visibility of the pedestal + ball of your choice |  |\n| `Enable` | Enable the TB system, drop in world if enabled, and initiate syncing if included |  |\n| `Respawn` | Respawn the ball to the ball target/pedestal | Menu Respawn |\n| `Sync` | Toggle remote ball syncing (See **Throw Force Mode** above) | Sync Toggle + Physjoint |\n| `Force` | Radial puppet to control the relative force multiplier of the ball throw | Throw Force Radial Control |\n| `Custom` | Custom animator logic tied to specific custom balls | Custom TB API |\n\n---\n\n# Designing a Custom Ball for ThrowaBall\n\nThrowaBall is designed to work with the majority of GameObjects, as it generates its own physics collision system independent of the ball object you use.\n\nWith that said, below are a few notes you may want to take into account when building your own ball, whether for yourself or to distribute to others.\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Considerations of a ThrowaBall \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nWhen designing a ball for use with ThrowaBall, below are a few elements you may want to consider:\n\n1. Shape - It's best to use shapes that don't noticeably rely on rotation like spheres (See **Throw Force Mode** above)\n2. Uniformity - Non-uniform textures/designs may be noticeable due to lack of proper rotation (See **Throw Force Mode** above)\n3. Collision Detection - Optional effects/logic triggered on bounce/collision (See **Include Collision Parameter** above)\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Usable Components \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nThe ThrowaBall system handles the physics/movement of the ball inputs on its own, so the system is designed to work with most objects as long as they are largely static and unmoving on their own (such as the default Unity sphere).\n\nAs such, there are a few components to be careful of when creating your custom ball.\n\n- Rigidbodies and Joints (Spring/Configurable) are automatically removed during installation\n- Unity Colliders (Sphere/Box/Capsule/Mesh) are automatically removed during installation **if they are not set to IsTrigger**\n- Avatar Descriptors on the ball root object are automatically removed during installation due to the [Animator Pseudo API](https://github.com/JustSleightly/ThrowaBall#animator-pseudo-api)\n  - Pipeline Managers are also removed from the ball root if an Avatar Descriptor is detected\n  - Animator components are also removed from the ball root if an Avatar Descriptor is detected\n\n\u003c/details\u003e\n\n## Animator Pseudo API\n\nFor those who want to integrate custom animation systems on their ball without losing the functionality of ThrowaBall, this pseudo API provides additional tools to advanced Unity creators to facilitate the process!\n\n![TB API Highlight gif](https://github.com/JustSleightly/ThrowaBall/raw/main/Documentation/Gifs/TB%20API%20Highlight.gif)\n![TB Info API png](https://github.com/JustSleightly/ThrowaBall/raw/main/Documentation/Images/TB%20Info%20API.png)\n\nTo enable this functionality on your own custom ball, **create an empty GameObject as a new parent/root** to your custom ball and add a `VRCAvatarDescriptor`. ThrowaBall will automatically detect ball inputs with Avatar Descriptors and highlight green.\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Automatic 3.0 Merging \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nThrowaBall will automatically merge in the FX Controller, Expressions Menu, and Expression Parameters from the Avatar Descriptor of the custom ball. There is no particular naming convention you need to follow, except when using **Aliased System/Dynamics Parameters** *(see below)*.\n\nAll parameters across all three files will be prefixed with `TB/` and the ball's index, such as `1`, to avoid conflicts between multiple custom balls in the same system. Native VRChat parameters and the VRLabs IsMirror parameter are ignored.\n\nAll animation clips and expressions menu (and submenus) will be duplicated so that they are modified non-destructively.\n\nAll animation clips will be repathed with their respective location in the ThrowaBall hierarchy as the new root. Your ball animations should be created with the `VRCAvatarDescriptor` as the root in order to be repathed correctly.\n\n![TB API Path png](https://github.com/JustSleightly/ThrowaBall/raw/main/Documentation/Images/TB%20API%20Path.png)\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Aliased System Parameters \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nAll ThrowaBall system animator parameters will not be automatically prefixed on a per-ball basis, and will maintain their names to align with the generated system. Additionally installed systems will automatically be suffixed accordingly.\n\nThrowaBall also offers `TB/Ball` as an aliased parameter that you can use in your custom ball's FX controller.\n\nBy using this parameter, you can detect whenever this particular ball is enabled within the ThrowaBall system.\n\nThrowaBall will automatically change `TB/Ball` according to the index the ball is installed to by the end user.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Aliased Dynamics Parameters \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nThrowaBall offers `TB/AD/` as a parameter prefix that you can use in your custom ball's Avatar Dynamics components, FX controller, and Expression Parameters.\n\nBy using this prefix in your parameters, you can accommodate for PhysBones or Contact Receivers per custom ball to avoid conflicts between multiple custom balls in the same system.\n\nThis prefix can also be used to adjust Contact Collision Tags dynamically per custom ball to avoid conflicts between multiple custom balls in the same system.\n\nThrowaBall will automatically change `TB/AD/` according to the mode the ball is installed to by the end user, such as `TB/1/`.\n\n*Avoid having Aliased Dynamics Parameters and regular parameters named identically with or without the prefix, as regular parameters will also be prefixed with `TB/` and their respective index. Example: `TB/AD/Test` and `Test` will both end up being `TB/1/Test`.*\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Preset Control \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nThrowaBall can automatically force specific values for the ball physics preset based on explicit values.\n\nThrowaBall will detect GameObjects underneath the custom ball's Avatar Descriptor for a GameObject named `TB_Preset`.\n\nOnly GameObjects that are **direct children** to the Avatar Descriptor will be scanned.\n\n| Preset Property | Transform Field |\n| :------------- | :-------------: |\n| `Drag` | Scale X |\n| `Bounce` | Scale Y |\n\nThe `TB_Preset` GameObject will automatically be removed after installation.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Collision Parameter Control \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nThrowaBall can automatically enable **Include Collision Parameter** as an install option if a custom ball requires it.\n\nThrowaBall will detect GameObjects underneath the custom ball's Avatar Descriptor for a GameObject named `TB_CollisionParameter`.\n\nOnly GameObjects that are **direct children** to the Avatar Descriptor will be scanned.\n\nThe `TB_CollisionParameter` GameObject will automatically be removed after installation.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Automatic Target Reparenting \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nThrowaBall will automatically reparent certain GameObjects underneath the custom ball's Avatar Descriptor to various parts of the ThrowaBall system, in case you need to use those targets for your own internal logic.\n\nOnly GameObjects that are **direct children** to the Avatar Descriptor will be scanned.\n\n![TB API Reparent png](https://github.com/JustSleightly/ThrowaBall/raw/main/Documentation/Images/TB%20API%20Reparent.png)\n\nGameObjects must start with one of the below naming conventions in order to be reparented:\n\n| Target Name | Animation Repathing |\n| :------------- | :-------------: |\n| `TB_Spawn` | :white_square_button: |\n| `TB_Head` | :white_square_button: |\n| `TB_Exempt` | :white_check_mark: |\n| `TB_Root` | :white_check_mark: |\n\nThe `TB_Spawn` target represents the position the ball will respawn at, and automatically accounts for individual ball offsets. It's recommended to give this target a Y-offset of `0.01` in order to account for the grabbable PhysBone offset.\n\nThe `TB_Head` target represents the position of the head bone, in case it's needed for aim/rotation constraints.\n\nThese targets are not intended to be used for animation clips themselves, but rather as component sources such as for constraints. Animation clips using these targets will not be repathed properly.\n\nThe `TB_Exempt` target will be automatically moved just outside of its respective Ball Object so that it and any children will not be automatically disabled when the Ball Object is disabled.\n\nThe `TB_Root` target will be automatically moved just under the Avatar Root outside of the ThrowaBall system.\n\nUnlike all other above targets, animation clip properties that start with `TB_Exempt` and `TB_Root` will be repathed properly. These is typically intended to be used alongside **Aliased System Parameters** in order to handle custom logic when the ball/system is enabled/disabled.\n\nEach reparented GameObject will have its name modified to include the index of the ball it's associated with.\n\n\u003c/details\u003e\n\n*If you have any questions about this API, or would like to develop for this API but don't own ThrowaBall, feel free to reach out to me!*\n\n**For example API packages such as the Follower Fetch demo from the showcase, [check out the Sample folder](https://github.com/JustSleightly/ThrowaBall/tree/main/Sample).**\n\n---\n\n# Frequently Asked Questions\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Is ThrowaBall compatible with VRChat Quest Avatars? \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\n**No**, as [VRChat Quest Avatars](https://docs.vrchat.com/docs/quest-content-limitations) do not support Physics Objects (Rigidbodies, Joints, Colliders) nor Constraints at this time.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Is ThrowaBall compatible with Optimized Avatars? \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\n**Depends**. The most limiting restrictions are easily the RigidBodies, Colliders, and Audio Sources. It is possible to pull your Avatar down to at least [Medium/Poor](https://docs.vrchat.com/docs/avatar-performance-ranking-system). Below is a table describing all the stat-influencing components that are generated according to what options you enable. Any other stat reductions are dependent on what balls you choose to use alongside this system.\n\n| Options | Components |\n| --- | --- |\n| `Base` | 2 Rigidbodies + 1 Collider (per unique bounce preset) + 1 PhysBone |\n| `Force Particle` | 1 Collider + 1 Particle System + 100 Particles Active + Particle Collision Enabled + 1 Material (VRChat) |\n| `Phys Joint` | 1 Rigidbody + 2 PhysBones |\n| `Ball Syncing` | 1 Contact Sender + 3 Contact Receivers |\n| `Remote Tracker` | 7 Contact Receivers |\n| `Collision Parameter` | 1 Contact Sender + 1 Contact Receiver + 1 Particle System + 1 Particle Active + Particle Collision Enabled + 1 Material (VRChat) |\n| `Physical Respawn Pedestal` | 1 Skinned Mesh Renderer + 2 Materials + 7219 Polygons + 1 PhysBone + 1 Animator + 1 Particle System + 50 Particles Active + 342 KB VRAM |\n| `Default Ball` | 1 Mesh Renderer + 5 Materials + 768 Polygons + 2 Colliders + 43 KB VRAM |\n| `Tennis Ball` | 1 Mesh Renderer + 1 Material + 768 Polygons + 2 MB VRAM |\n| `Basket Ball` | 1 Mesh Renderer + 1 Material + 768 Polygons + 2 MB VRAM |\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Why can't other players see my ThrowaBall system in game / Why is it spazzing out?\u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nMake sure your Avatar is uploaded at world origin (0,0,0 Position and Rotation)!\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Why is ThrowaBall's position desyncing? \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nMake sure you have syncing installed/enabled (automatically included for `Force Particle` throw mode), and make sure ThrowaBall is enabled from the menu while standing still.\n\nWhen respawning the ball using the physical button, try to keep the button pressed for longer than a split second to ensure it respawns for all other players.\n\nThe syncing accuracy may not be perfectly accurate, but should be within a 0.2 meter tolerance within an effective range of 50 meters from the location the system is enabled.\n\nThe ball movement is also interpolated for remote players due to parameter sync rate, so the peaks/valleys of bounces/collisions may be clipped.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Why can't ThrowaBall rotate properly? \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nWhile it is possible to simulate expected ball (rigidbody) rotation for the local player, it does not sync to remote players regardless of the Throw Force Mode used.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Why does throwing ThrowaBall as an external player feel so bad? \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nSee the **Disclaimer** near the top of the documentation.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Can I edit/swap the balls after I generate ThrowaBall? \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\n**Yes**, expand the TB_ThrowaBall hierarchy until you reach the Ball Containers. You can replace any child to the Ball objects, just remember to leave those child objects enabled, as your animations toggle the Ball objects themselves on/off. You should also remove any pre-existing spring/configurable joints, rigidbodies, or sphere/box/capsule/mesh colliders on your balls that would usually be auto-removed by the ThrowaBall installer.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e How do I export ThrowaBall with my commercial package? \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nAssuming you have a **commercial license** for ThrowaBall, the script generates everything from scratch, making it easy to export without worrying about conflicting with other packages.\n\nYou can find these generated resources at `Save File Path/GeneratedTBResources/`. By default, this is `Assets/JustSleightly/ThrowaBall/GeneratedTBResources/`.\n\nThe folder with your avatar's ThrowaBall under Generated Resources is the only one you need to export, aside from the files of the actual balls you used with the tool. The only exception to this is if you did not have an FX controller, Gesture controller, Expression Parameters, or Expressions Menu by default, in which those will be generated in your `Assets/` folder.\n\n**You may not** export or redistribute the *ThrowaBall.dll* file and other contents under `Packages/JS - ThrowaBall/`. Please refer to the full Terms and Conditions on my [store](https://store.sleightly.dev/).\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Why is my project crashing after importing ThrowaBall? \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nRemove ThrowaBall via Windows File Explorer and check your project to see if it currently contains Cinemachine. You can locate this by clicking on `Window \u003e Package Manager` from the top toolbar, and browsing the packages currently in your project. If Cinemachine is added, remove it. It is sometimes added through the VRChat Worlds SDK, so you may need to remove any remnants of the Worlds SDK from your project and this package manager window before removing Cinemachine.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Can I change the computer my license is registered to? \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\n**Yes**, in the event you change hardware, you can use the **Transfer License** option when trying to verify your license key in Unity on the new hardware. There is a cooldown period to prevent abuse, and these logs will be monitored for misuse. If you need to re-transfer sooner than this transfer period, open a support ticket on [discord](https://discord.sleightly.dev/).\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Can I upgrade my personal license? \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\n**Yes**, open a support ticket on [discord](https://discord.sleightly.dev/) and we can get that process started for you.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e My license key isn't working! \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nOpen a support ticket on [discord](https://discord.sleightly.dev/) or check the ThrowaBall support channel for known issues if you are a validated customer.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Where do I report a bug? \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nYou can add issues to this github repository, or post it in the support channel for ThrowaBall on [discord](https://discord.sleightly.dev/).\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e Where can I request features/make suggestions? \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nFeel free to leave these in the support channel on [discord](https://discord.sleightly.dev/) and we can discuss them in more detail.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n  \u003csummary\u003e \u003cstrong\u003e I need more help! \u003c/strong\u003e \u003c/summary\u003e\n​\n\u003cblockquote\u003e\n\nIf you need help with using ThrowaBall, reach out in the designated support channel on [discord](https://discord.sleightly.dev/) so me or a community member can help. If you have private issues involving purchase details, open up a support ticket instead.\n\n\u003c/details\u003e\n\n---\n\n## Special Thanks\n\nTo my early testers and friends waiting over a year for this release - Blurry/JayJay\n\n**[gonsodany](https://gonsodany.gumroad.com/)** - For helping me speed up dev/testing on the tedious tasks when I was busy/traveling\n\n**[Meechu](https://meechu.gumroad.com/)** - For making the Physical Respawn Pedestal used in ThrowaBall\n\n**[Zekk](https://shop.zekk.dev/)** - Who not only tested ThrowaBall but also developed the default particle ball prefab\n\n**[hfcRed](https://github.com/hfcRed)** - For developing the `Force Particle` throw mode utilized in ThrowaBall\n\n**[jellejurre](https://github.com/jellejurre)** - Who helped polish the `Force Particle` method with **[JeTeeS](https://github.com/JeTeeS)** and helped considerably with troubleshooting ThrowaBall\n\n**[Dreadrith](https://github.com/Dreadrith/DreadScripts)** - For directly implementing the licensing system on the script\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjustsleightly%2Fthrowaball","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjustsleightly%2Fthrowaball","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjustsleightly%2Fthrowaball/lists"}